Zacznij od porównania odległości między szerokościami geograficznymi. Każdy stopień szerokości geograficznej jest oddalony od siebie o około 111 kilometrów. Zasięg waha się (ze względu na lekko elipsoidalny kształt Ziemi) od 68,703 mil (110,567 km) na równiku do 69,407 (111,699 km) na biegunach. Odległość między dwoma lokalizacjami będzie równa lub większa niż odległość między ich szerokościami geograficznymi.
Zauważ, że nie dotyczy to długości geograficznych - długość każdego stopnia zależy od szerokości geograficznej. Jeśli jednak twoje dane są ograniczone do jakiegoś obszaru (na przykład pojedynczego kraju) - możesz obliczyć minimalne i maksymalne granice również dla długości geograficznych.
Kontynuacja będzie szybkim obliczeniem odległości o niskiej dokładności, które zakłada kulistą ziemię:
Odległość po ortodromie d między dwoma punktami o współrzędnych {lat1, lon1} i {lat2, lon2} jest wyrażona wzorem:
d = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))
Matematycznie równoważny wzór, który jest mniej podatny na błąd zaokrąglania dla krótkich odległości, to:
d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
d to odległość w radianach
distance_km ≈ radius_km * distance_radians ≈ 6371 * d
(6371 km to średni promień Ziemi )
Wymagania obliczeniowe tej metody są minimalne. Jednak wynik jest bardzo dokładny dla małych odległości.
Następnie, jeśli jest w określonej odległości, mniej więcej, zastosuj dokładniejszą metodę.
GeographicLib to najdokładniejsza implementacja, jaką znam, chociaż można również użyć odwrotnego wzoru Vincenty'ego .
Jeśli korzystasz z systemu RDBMS, ustaw szerokość geograficzną jako klucz podstawowy, a długość geograficzną jako klucz dodatkowy. Zapytanie o zakres szerokości geograficznych lub o zakres szerokości / długości geograficznej, jak opisano powyżej, a następnie obliczyć dokładne odległości dla zestawu wyników.
Należy zauważyć, że nowoczesne wersje wszystkich głównych systemów RDBMS natywnie obsługują geograficzne typy danych i zapytania.