Почніть із порівняння відстані між широтами. Кожен градус широти знаходиться приблизно на відстані 111 кілометрів. Діапазон варіюється (внаслідок злегка еліпсоїдної форми Землі) від 110,567 км на екваторі до 68,403 милі на екваторі до 69,407 (111,699 км) на полюсах. Відстань між двома місцями буде дорівнювати або перевищувати відстань між їх широтами.
Зверніть увагу, що це не відповідає довготам - довжина кожного градуса довготи залежить від широти. Однак, якщо ваші дані обмежені якоюсь областю (наприклад, однією країною) - ви також можете розрахувати мінімальну і максимальну межі для довгот.
Продовжимо низькоточний швидкий розрахунок відстані, який передбачає сферичну землю:
Відстань великого кола d між двома точками з координатами {lat1, lon1} та {lat2, lon2} визначається як:
d = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))
Математично еквівалентна формула, яка менше піддається помилці округлення на короткі відстані:
d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
d - відстань у радіанах
distance_km ≈ radius_km * distance_radians ≈ 6371 * d
(6371 км - це середній радіус землі )
Цей метод обчислювальних вимог є мінімальним. Однак результат дуже точний на невеликих відстанях.
Тоді, якщо воно знаходиться на певній відстані, більш-менш, використовуйте більш точний метод.
GeographicLib - найточніша реалізація, яку я знаю, хоча може бути використана і зворотна формула Вінсенті .
Якщо ви використовуєте СУБД, встановіть широту як основний ключ, а довготу як вторинний ключ. Запитуйте діапазон широти або діапазон широти / довготи, як описано вище, а потім обчисліть точні відстані для набору результатів.
Зауважте, що сучасні версії всіх основних СУБД підтримують географічні типи даних та запити.