Entonces, en resumen,
- ¿Cuál debería ser el tipo de datos de latitud y longitud?
- ¿Qué comando SQL debo llamar para obtener los primeros 100 restaurantes más cercanos, por ejemplo?
Detalle:
Tengo 100k biz record cada uno con latitud y longitud. Veo que MySQL realmente admite un tipo de datos llamado punto. ¿Debo usar eso en su lugar?
¿MySQL es compatible con el sistema de almacenamiento KDTree http://en.wikipedia.org/wiki/File:KDTree-animation.gif
¿Es mejor usar el tipo de datos de punto en lugar del tipo de datos flotante regular para almacenar latitud y longitud?
Finalmente, quiero encontrar cosas como los primeros 100 restaurantes más cercanos a los puntos 105,6, por ejemplo, y mis bases de datos contienen muchos negocios y puntos. Obviamente, calcular la distancia uno por uno para cada registro y para cada punto sería O (n) y, por lo tanto, es una mierda.
Tenga en cuenta que conozco una solución más simple que se describe en Cómo Aplicación como Yelp Recuperar información de distancia de la base de datos de manera eficiente y la implementaré yo también para empezar. Esa es una buena respuesta.
Sin embargo, creo que hay una crema de la respuesta del cultivo que debería superar ese derecho? De hecho, almacenar la ubicación en función de la latitud y la longitud y encontrar las cosas más cercanas es un problema muy común, espero que mysql tenga un patrón de diseño especial para eso. ¿Tiene eso?
¿Dónde puedo obtener más información al respecto? Gracias.
Respuestas:
En cuanto a los patrones de diseño, la pregunta de Yelp es bastante estándar.
Para una respuesta más compleja, probablemente necesitará la distancia geoespacial. Aquí hay un powerpoint fascinante sobre ese tema (y aquí también hay una versión en pdf de eso). Sin embargo, las matemáticas involucradas son bastante feas.
De su diapositiva:
Hay una respuesta más larga y más profunda sobre la distancia geoespacial en Stack Overflow .
Pero aún desea limitar los resultados por latitud y longitud.
En última instancia, evitaría el tipo de datos POINT e iría con la latitud / longitud. Actualmente no hay forma de determinar la distancia entre dos PUNTOS, por lo que de todos modos tendrá que almacenar la latitud / longitud para ese cálculo.
Un último enlace: también puede consultar este hilo SO con respecto a la aceleración de las consultas mediante índices espaciales.
fuente
Los tipos de datos de puntos están bien; solo puede invocar X (coord) / Y (coord) para obtener los valores Lat / Lon.
Por ejemplo:
fuente
Encuentre los 100 restaurantes más cercanos a alguna coordenada: consulte el código eficiente en http://mysql.rjweb.org/doc.php/latlng Incluye una función almacenada para calcular la distancia de "gran círculo".
fuente