2011-01-08 7 views
5

Desidero memorizzare migliaia di punti di latitudine/longitudine in un db MySQL. Ho avuto successo nell'impostare le tabelle e aggiungere i dati usando le estensioni geospaziali dove la colonna 'coord' è un punto (lat, lng).Come utilizzare estensioni geospaziali MySQL con geometrie sferiche

Problema:

voglio trovare rapidamente le voci più vicini alla 'N' di latitudine e longitudine gradi 'X' gradi 'Y'. Poiché la funzione Distance() non è stata ancora implementata, ho usato la funzione GLength() per calcolare la distanza tra (X, Y) e ciascuna delle voci, l'ordinamento per la distanza ascendente e la limitazione ai risultati 'N'. Il problema è che questo non sta calcolando la distanza più breve con la geometria sferica. Il che significa che se Y = 179,9 gradi, l'elenco delle voci più vicine includerà solo le longitudini di partenza a 179,9 e decrescenti anche se esistono voci più ravvicinate con le longitudini che aumentano da -179,9.

Come si gestisce in genere la discontinuità in longitudine quando si lavora con le geometrie sferiche nei database? Deve esserci una soluzione facile a questo, ma devo solo cercare la cosa sbagliata perché non ho trovato nulla di utile.

Devo semplicemente dimenticare la funzione GLength() e creare la mia funzione per calcolare la separazione angolare? Se lo faccio, sarà ancora veloce e sfrutterà le estensioni geospaziali?

Grazie!

josh


UPDATE:

This è esattamente quello che sto descrivendo sopra. Tuttavia, è solo per SQL Server. Apparentemente SQL Server ha un Geometry e Tipi di dati geografici. La geografia fa esattamente ciò di cui ho bisogno. C'è qualcosa di simile in MySQL?

risposta

4

Come si gestisce in genere la discontinuità in longitudine quando si lavora con le geometrie sferiche nei database?

Non molte persone usano MySQL per questo, perché le estensioni geospaziali non sono davvero all'altezza.

Dalla documentazione: "All calculations are done assuming Euclidean (planar) geometry."

La soluzione è di solito per roll your own.

In alternativa, è possibile simularlo: se le distanze sono inferiori a 500 miglia circa, è possibile considerare la latitudine e la longitudine come coordinate rettangolari e utilizzare semplicemente la formula della distanza euclidea (sqrt(a^2 + b^2)).

+0

Grazie per la risposta. Che cosa tipicamente usano le persone per questo? Ho visto la pagina che hai collegato un po 'indietro, ma questo sembra risolvere solo il problema di trovare i punti più vicini alla latitudine/longitudine data. Non risolve il problema di richiedere tutti i punti all'interno di una regione. L'utilizzo del roll proprio metodo non consente di richiedere tutti i punti da 178 lon a -178 lon e da 30 lat a 35 lat (area rettangolare). – Joshua

+0

Io uso [PostGIS] (http://postgis.refractions.net/). Ci sono anche diverse librerie open source che possono essere usate: check out [osgeo] (http://www.osgeo.org/).Potrebbe essere eccessivo se tutto ciò che stai facendo è un calcolo relativo della distanza. – Seth