2013-09-23 12 views
6

Ho due ArrayList, tipo di dati Double, 1.latitudes 2. longitudini, ciascuna ha oltre 200 elementiTrovare le coordinate più vicine in un array?

dicono i dare un casuale coordinate prova, dire (1.33, 103.4), il formato è [latitudine , longitudine]

c'è qualche algoritmo per trovare facilmente il punto più vicino, o devo forza bruta calcolare ogni punto possibile, trovare ipotenusa e quindi confrontare oltre 200 ipotenus per restituire il punto più vicino? grazie

+2

Se fate calcolare tutti ipotenuse, è possibile calcolare la distanza e implementare min) la logica di distanza (il tutto in un loop. Inoltre, tutti i tuoi punti dovrebbero essere geograficamente vicini tra loro in modo da poter considerare quest'area un piano, altrimenti devi tenere in considerazione la curvatura della Terra. –

+3

qual è la tua definizione di distanza?"ipotenusa" è un termine dalla geometria planare, ma il tuo uso di "longitudine" e "latitudine" sembra indicare che i punti sono sulla superficie di una sfera ... – meriton

+3

Hai guardato R-trees (https: // it .wikipedia.org/wiki/R-tree)? O algoritmi di indicizzazione spaziale in generale (https://en.wikipedia.org/wiki/Spatial_index#Spatial_index)? –

risposta

0

Se gli array sono ordinati, è possibile utilizzare la ricerca binaria per trovare la posizione di un punto richiesto nell'array. Dopo aver trovato l'indice, dovresti controllare quattro punti vicini per trovare il più vicino.

1) Supponiamo di avere due array ordinati longitudini-saggio e latitudini-saggio

2) si esegue una ricerca prima e trovate due punti prossimi

3) Poi di ricerca di uno e trovate altri due punti

4) Ora si hanno da due a quattro punti (i risultati potrebbero intersecare)

5) Questi punti formeranno un quadrato intorno punto di destinazione

6) Trova il punto più vicino

2

Ordinare la serie di punti lungo un asse. Quindi, individuare il punto nell'array più vicino al punto richiesto lungo questo asse e calcolare la distanza (utilizzando qualsiasi metrica appropriata alla topologia e alla scala del problema).

Quindi, cercare lungo l'array in entrambe le direzioni fino a quando la distanza da questi punti è maggiore del risultato migliore finora. Il punto di distanza più breve è la risposta.

Ciò può comportare la ricerca dell'intero array ed è una forma di Branch and bound vincolata dalla geometria del problema. Se i punti sono distribuiti in modo abbastanza equo attorno al punto che stai cercando, la scansione non richiederà molte prove.

indici spaziali alternative (come quad-alberi) darà risultati migliori, ma proprio piccolo numero di punti renderebbero il costo di installazione nel preparare l'indice più grande di un semplice ordinamento. Dovrai tenere traccia delle variazioni di posizione causate dall'ordinamento in quanto l'altro array non verrà ordinato nello stesso modo. Se si modificano i dati in una singola serie di punti, l'ordinamento riordina interi punti allo stesso tempo.

0

non è vero che il valore lat (o long) più vicino dovrebbe essere scelto per la ricerca sull'asse lungo (o lat), infatti si potrebbe stare su una lat (o long) ma lontano lungo il lungo (o lat) valore

worng approach

così modo migliore è quello di calcolare le distanze e ordinarli

+0

L'approccio per selezionare il punto più vicino lungo un asse è un punto di partenza per la ricerca. Riduce almeno al minimo la distanza lungo un asse. Le sonde successive più lontane (in entrambe le direzioni) identificheranno il punto più vicino. La scelta della metrica di distanza dipende dalla curvatura dell'area considerata. – Pekka

Problemi correlati