Výpočet vzdálenosti pomocí této funkce je poměrně výpočetně nákladný, protože zahrnuje celou řadu transcendentálních funkcí. To bude problematické, když budete mít k filtrování velký počet řádků.
Zde je alternativa, aproximace, která je mnohem méně výpočetně nákladná:
Přibližná vzdálenost v mílích:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 53.0 * (lon2 - lon1)
Přesnost tohoto výpočtu přibližné vzdálenosti můžete zlepšit přidáním matematické funkce kosinus:
Vylepšená přibližná vzdálenost v mílích:
sqrt(x * x + y * y)
where x = 69.1 * (lat2 - lat1)
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3)
Zdroj:http://www.meridianworlddata.com/Distance-Calculation.asp
Provedl jsem spoustu testů s náhodně generovanými datovými sadami.
- Rozdíl v přesnosti těchto 3 algoritmů je minimální , zejména na krátké vzdálenosti
- Nejpomalejší algoritmus je samozřejmě ten s trig funkcemi (ten na vaši otázku). Je 4x pomalejší než ostatní dva.
Rozhodně to za to nestojí. Stačí použít přibližnou hodnotu.
Kód je zde:http://pastebin.org/424186
Chcete-li to použít v MySQL, vytvořte uloženou proceduru který vezme argumenty souřadnic a vrátí vzdálenost, pak můžete udělat něco jako:
SELECT columns
FROM table
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25