Puede usar la extensión espacial mysql y guardar la latitud y la longitud como un tipo de datos de punto y convertirlo en un índice espacial. De esa forma, puede reordenar las coordenadas a lo largo de una curva y reducir la dimensión y conservar la información espacial. Puede usar el índice espacial como un cuadro delimitador para filtrar la consulta y luego usar la fórmula harvesine para elegir el resultado óptimo. Su cuadro delimitador debe ser más grande que el radio del gran círculo. Mysql usa un rtree con algún índice espacial y mi ejemplo fue sobre una curva z o una curva de hilbert:https://softwareengineering.stackexchange.com/questions/113256/cuál-es-la-diferencia-entre-btree-y-rtree-indexing Luego, puede insertar una geocoordenada directamente en una columna de puntos:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . O puede usar un tipo de datos de geometría:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-inicio-rápido/ . Entonces puede usar la función MBRcontains así: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html o cualquier otra función:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations- between-geometric-objects.html . Por lo tanto, necesita un cuadro delimitador. Aquí hay algunos ejemplos:
- Almacenamiento de lat Valores Lng en MySQL usando tipo de punto espacial
- https://gis.stackexchange.com/questions/28333/how-to-speed-up-this-simple-mysql-points-in-the-box-query
Aquí hay un ejemplo simple con tipo de datos de punto:
CREATE SPATIAL INDEX sx_place_location ON place (location)
SELECT * FROM mytable
WHERE MBRContains
(
LineString
(
Point($x - $radius, $y - $radius),
Point($x + $radius, $y + $radius)
)
location
)
AND Distance(Point($x, $y), location) <= $radius
No estoy seguro de si funciona porque usa una variable de radio con una función de cuadro delimitador. Me parece que MBRwithin es un poco más simple, porque no necesita ningún argumento:Mysql:Optimización de la búsqueda de supernodos en árboles de conjuntos anidados .