Sì, c'è un modo migliore. Devi usare un indice spaziale . Questi indici organizzano metadati sulle geometrie per filtrare le geometrie lontane molto rapidamente, risparmiando molti cicli della CPU evitando i calcoli che descrivi. Non dovresti preoccuparti di implementarne uno tu stesso poiché tutti i principali database relazionali forniscono un tipo di geometria spaziale e indici per accompagnarli.
Ciò che si desidera esaminare sono query "a distanza" (query per geometrie a una certa distanza da un'altra geometria). Questi sono un problema molto standard e molto risolto e sono possibili in tutti i database di cui sopra (e integrati in diversi):
- PostGIS:
ST_DWithin
- Server SQL:
STDistance
(Non è chiaro che l'utilizzo dell'indice sulla versione geografica 3D di questa funzione è supportato)
- Oracle:
SDO_WITHIN_DISTANCE
(Questo non dice esplicitamente che attiverà l'utilizzo dell'indice. Doppio controllo del piano di query. Potrebbe essere necessario applicare un SDO_FILTER
per farlo utilizzare per utilizzare l'indice.)
- MySQL: lo sto ancora capendo.
Soluzione alternativa per l'attivazione dell'utilizzo dell'indice
Nel caso peggiore in cui si riscontrano problemi nel far sì che il sistema utilizzi l'indice spaziale con queste query, è possibile aggiungere un filtro aggiuntivo. Dovresti creare un riquadro di delimitazione quadrato con lati di lunghezza 2 * (distanza di ricerca) centrati nel punto di ricerca e confrontare i riquadri di delimitazione delle geometrie della tabella con quelli prima di verificare la distanza effettiva. Questo è ciò che PostGIS ' ST_DWithin
sopra fa comunque internamente.
Distanza in GIS
Mentre gli indici spaziali sono fantastici e assolutamente la soluzione giusta al tuo problema, il calcolo della distanza può complicarsi logicamente. In particolare, devi preoccuparti di quale proiezione (fondamentalmente tutti i parametri per il sistema di coordinate) sono memorizzati i tuoi dati. La maggior parte delle proiezioni 2D (cose diverse dai sistemi di coordinate angolari come le varie lat / long proiezioni) distorcono significativamente la lunghezza. Ad esempio, la proiezione di Web Mercator (quella utilizzata da Google, Bing e tutti gli altri principali provider di mappe di base) espande le aree e le distanze in modo crescente man mano che la posizione si allontana dall'unico dell'equatore . Potrei sbagliarmi perché non sono formalmente istruito in GIS, ma il migliore che ho visto per le proiezioni 2D è alcuni specifici che promettono distanze corrette da unpunto unico e costante in tutto il mondo. (No, non è pratico utilizzare una proiezione diversa per ogni query; ciò renderebbe inutili i tuoi indici.)
La linea di fondo è che è necessario assicurarsi che la matematica sia accurata. Il modo più semplice di farlo dal punto di vista dello sviluppo è usare le proiezioni angolari (spesso definite "geografiche") e le funzioni che supportano la matematica usando un modello sferoide, ma questi calcoli sono leggermente più costosi rispetto alle controparti 2D e alcuni DB potrebbero non supportare l'indicizzazione. Se riesci a ottenere prestazioni accettabili utilizzandole, tuttavia, questa è probabilmente la strada da percorrere. Un'altra opzione comune sono le proiezioni regionali (come le zone UTM) che avvicinano le distanze e le aree piuttosto vicine per correggere se i tuoi dati sono confinati in una particolare parte del mondo. La cosa migliore per la tua app dipenderà dai tuoi requisiti specifici,
Questo vale anche se non si utilizzano indici spaziali incorporati. I tuoi dati hanno una certa proiezione a prescindere dalla tecnologia o tecnica che stai attualmente utilizzando o che utilizzerai in futuro, e stanno già influenzando tutte le query e i calcoli che stai facendo.