Я попытался реализовать эту формулу: http://andrew.hedges.name/experiment/haversine/ Апплет хорошо подходит для двух пунктов, которые я тестирую:
Все же мой код не работает.
from math import sin, cos, sqrt, atan2
R = 6373.0
lat1 = 52.2296756
lon1 = 21.0122287
lat2 = 52.406374
lon2 = 16.9251681
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))**2 + cos(lat1) * cos(lat2) * (sin(dlon/2))**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
distance = R * c
print "Result", distance
print "Should be", 278.546
Расстояние, которое он возвращает, составляет 5447,05546147 . Зачем?
radians(abs(52.123))
должен сделать трюк ...Обновление: 04/2018: обратите внимание, что расстояние Vincenty устарело с версии GeoPy 1.13 - вместо этого вы должны использовать geopy.distance.distance ()!
Ответы выше основаны на формуле Хаверсайна , которая предполагает, что земля является сферой, что приводит к ошибкам примерно до 0,5% (согласно
help(geopy.distance)
). Расстояние Винсенти использует более точные эллипсоидальные модели, такие как WGS-84 , и реализовано в геопсии . Например,напечатает расстояние в
279.352901604
километрах, используя эллипсоид по умолчанию WGS-84. (Вы также можете выбрать.miles
один или несколько других единиц измерения расстояния).источник
print geopy.distance.VincentyDistance(coords_1, coords_2).km 279.352901604
geopy.distance.distance(…)
в коде, который является псевдонимом наилучшей (= наиболее точной) формулы расстояния в настоящее время. (Винсенти на данный момент.)geopy.distance.geodesic
(или значение по умолчаниюgeopy.distance.distance
), что является более точным и всегда сходится.Для людей (таких как я), которые приходят сюда через поисковик и просто ищут решение, которое работает «из коробки», я рекомендую установить
mpu
. Установите это черезpip install mpu --user
и используйте это как это, чтобы получить расстояние haversine :Альтернативный пакет есть
gpxpy
.Если вы не хотите зависимостей, вы можете использовать:
Другой альтернативный пакет
[haversine][1]
Они утверждают, что имеют оптимизацию производительности для расстояний между всеми точками в двух векторах
источник
Я прибыл в гораздо более простым и надежным решением , которое использует
geodesic
изgeopy
пакета , так как вы будете весьма вероятно , использовать его в вашем проекте в любом случае так без дополнительной установки пакета необходимо.Вот мое решение:
geopy
источник
источник
Есть несколько способов рассчитать расстояние на основе координат, то есть широты и долготы
Установить и импортировать
Определить координаты
Использование haversine
Использование haversine со sklearn
Использование OSRM
Использование геопии
Вывод
источник