Můžete použít prostorové rozšíření mysql a uložit zeměpisnou šířku a délku jako datový typ bodu a vytvořit z něj prostorový index. Tímto způsobem můžete změnit pořadí souřadnic podél křivky a zmenšit rozměr a zachovat prostorové informace. Prostorový index můžete použít jako ohraničovací rámeček k filtrování dotazu a poté pomocí vzorce harvesine vybrat optimální výsledek. Váš ohraničující rámeček by měl být větší než poloměr velkého kruhu. Mysql používá rtree s nějakým prostorovým indexem a můj příklad byl o křivce z nebo hilbertově křivce:https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing .Pak můžete vložit geosouřadnici přímo do bodového sloupce:http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html . Nebo můžete použít datový typ geometrie:http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ . Pak můžete použít funkci MBRcontains takto: http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html nebo jakékoli jiné funkce:http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html . Proto potřebujete ohraničovací rámeček. Zde je několik příkladů:
- Ukládání zeměpisné šířky Hodnoty Lng v MySQL pomocí typu prostorového bodu
- https://gis.stackexchange.com/questions/28333/how-to-speed-up-this-simple-mysql-points-in-the-box-query
Zde je jednoduchý příklad s datovým typem bodu:
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
Nejsem si jistý, jestli to funguje, protože používá proměnnou poloměru s funkcí ohraničujícího rámečku. Zdá se mi, že MBRwithin je o něco jednodušší, protože nepotřebuje žádný argument:Mysql:Optimalizace hledání superuzlu ve stromu vnořených sad .