2011-01-08 18 views
5

Me gustaría almacenar miles de puntos de latitud/longitud en un MySQL db. Tuve éxito al configurar las tablas y agregar los datos usando las extensiones geoespaciales donde la columna 'coord' es un punto (lat, lng).Cómo utilizar extensiones MySQL geoespaciales con geometrías esféricas

Problema:

Quiero encontrar rápidamente las entradas más cercanas al 'N' a la latitud y longitud grados 'X' grados 'Y'. Como la función Distance() aún no se ha implementado, utilicé la función GLength() para calcular la distancia entre (X, Y) y cada una de las entradas, ordenando por distancia ascendente y limitando a 'N' resultados. El problema es que esto no está calculando la distancia más corta con la geometría esférica. Lo que significa que si Y = 179.9 grados, la lista de entradas más cercanas solo incluirá las longitudes de inicio en 179.9 y disminuirá aunque existan entradas más cercanas con longitudes que aumentan de -179.9.

¿Cómo se maneja típicamente la discontinuidad en longitud cuando se trabaja con geometrías esféricas en bases de datos? Tiene que haber una solución fácil para esto, pero debo estar buscando algo incorrecto porque no he encontrado nada útil.

¿Debería olvidar la función GLength() y crear mi propia función para calcular la separación angular? Si hago esto, ¿será aún rápido y aprovecharé las extensiones geoespaciales?

Gracias!

josh


ACTUALIZACIÓN:

This es exactamente lo que estoy describiendo anteriormente. Sin embargo, es solo para SQL Server. Aparentemente SQL Server tiene Geometry y Geography Datatypes. La geografía hace exactamente lo que necesito. ¿Hay algo similar en MySQL?

Respuesta

4

¿Cómo se maneja típicamente la discontinuidad en longitud cuando se trabaja con geometrías esféricas en bases de datos?

No mucha gente usa MySQL para esto, porque es extensiones geoespaciales no son realmente hasta el tabaco.

A partir de los documentos: "All calculations are done assuming Euclidean (planar) geometry."

La solución es por lo general para roll your own.

Como alternativa, puede falsificarlo. Si sus distancias son inferiores a 500 millas, puede tratar su latitud y longitud como coordenadas rectangulares y simplemente usar la fórmula de distancia euclidiana (sqrt(a^2 + b^2)).

+0

Gracias por la respuesta. ¿Qué usa la gente típicamente para esto? Vi la página que vinculó hace un tiempo, pero parece que solo resuelve el problema de encontrar los puntos más cercanos a la latitud/longitud dada. No resuelve el problema de solicitar todos los puntos dentro de una región. Al usar el rollo, su propio método no le permitirá solicitar todos los puntos desde 178 lon a -178 lon y de 30 lat a 35 lat (región rectangular). – Joshua

+0

Uso [PostGIS] (http://postgis.refractions.net/). También hay varias bibliotecas de código abierto que se pueden usar: consulte [osgeo] (http://www.osgeo.org/).Eso puede ser exagerado si todo lo que estás haciendo son cálculos de distancia relativa. – Seth

Cuestiones relacionadas