Начните с сравнения расстояния между широтами.Каждый градус широты составляет приблизительно 69 миль (111 километров) друг от друга.Диапазон варьируется (из-за слегка эллипсоидальной формы Земли) от 68,703 миль (110,567 км) на экваторе до 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 - наиболее точная из известных мне реализаций, хотя может использоваться и обратная формула Винсента .
Если вы используете RDBMS, установите широту в качестве первичного ключа идолгота в качестве вторичного ключа.Запросите диапазон широты или диапазон широты / долготы, как описано выше, затем вычислите точные расстояния для набора результатов.
Обратите внимание, что современные версии всех основных РСУБД поддерживают географические типы данных и выполняют собственные запросы.