Du kan använda mysql spatial extension och spara latitud och longitud som en punktdatatyp och göra det till ett rumsligt index. På så sätt kan du ordna om koordinaterna längs en kurva och minska dimensionen och bevara rumslig information. Du kan använda det rumsliga indexet som en begränsningsruta för att filtrera frågan och sedan använda harvesineformeln för att välja det optimala resultatet. Din begränsningsram bör vara större än storcirkelns radie. Mysql använder ett rtree med något rumsligt index och mitt exempel handlade om en z-kurva eller en hilbert-kurva:https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .Sedan kan du infoga en geokoordinat direkt i en punktkolumn:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Eller så kan du använda en geometridatatyp:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Då kan du använda MBRcontains-funktionen så här: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html eller andra funktioner:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Därför behöver du en begränsningsram. Här är några exempel:
- Storing Lat Lng-värden i MySQL med Spatial Point Type
- https://gis.stackexchange.com/questions/28333/how-to-speed-up-this-simple-mysql-points-in-the-box-query
Här är ett enkelt exempel med punktdatatyp:
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
Jag är inte säker på om det fungerar eftersom det använder en radievariabel med en bounding-box-funktion. Det verkar för mig att MBRwithin är lite enklare, eftersom det inte behöver några argument:Mysql:Optimering av att hitta supernod i kapslat uppsättningsträd .