sql >> Databáze >  >> RDS >> Mysql

PHP MySql a geolokace

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


  1. AKTUALIZUJTE všechny hodnoty sloupců ekvivalentní hodnotám sloupců jiných tabulek na základě jejich id

  2. Jak vytvořit databázi zásob v Accessu

  3. Datum PHP zobrazující '1970-01-01' po konverzi

  4. Existuje v ORACLE způsob, jak spojit více řádků řádků do jednoho, pomocí dvou tabulek, kde jsou konečné hodnoty odděleny čárkami?