Výpočet vzdálenosti je dost výpočetně drahý, jak řekli jiní. Vracení obrovských datových sad také není příliš dobrý nápad – zvláště s ohledem na to, že PHP není z hlediska výkonu tak skvělé.
Použil bych heuristiku, jako je aproximace vzdálenosti jednoduchým sčítáním a odečítáním.
Stačí prohledat db s incidenty v tomto rozsahu (ve skutečnosti čtverec, spíše než kruh), a pak na nich můžete pracovat s PHP.
UPRAVIT :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
UPRAVIT 2 :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 (ten s celou řadou spouštěcích funkcí) je 4x pomalejší než ostatní dva.
Rozhodně se to nevyplatí. Stačí použít přibližnou hodnotu.
Kód je zde:http://pastebin.org/424186