Próbowałem zaimplementować tę formułę: http://andrew.hedges.name/experiments/haversine/ Aplet działa dobrze dla dwóch punktów, które testuję:
Jednak mój kod nie działa.
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
Zwracana odległość to 5447,05546147 . Czemu?
radians(abs(52.123))
powinien załatwić sprawę ...Aktualizacja: 04/2018: Zwróć uwagę, że odległość Vincenty jest przestarzała od wersji GeoPy 1.13 - zamiast tego należy użyć geopy.distance.distance ()!
Powyższe odpowiedzi opierają się na wzorze Haversine'a , który zakłada, że ziemia jest kulą, co powoduje błędy do około 0,5% (zgodnie z
help(geopy.distance)
). Odległość Vincenty'ego wykorzystuje dokładniejsze modele elipsoidalne, takie jak WGS-84 i jest wdrażana w geopii . Na przykład,wydrukuje odległość w
279.352901604
kilometrach przy użyciu domyślnej elipsoidy WGS-84. (Możesz także wybrać.miles
jedną z kilku innych jednostek odległości).źródło
print geopy.distance.VincentyDistance(coords_1, coords_2).km 279.352901604
geopy.distance.distance(…)
w kodzie, który jest aliasem obecnie najlepszej (= najdokładniejszej) formuły odległości. (Obecnie Vincenty.)geopy.distance.geodesic
(lub wartości domyślnejgeopy.distance.distance
), która jest dokładniejsza i zawsze zbiega.Osobom (takim jak ja) przyjeżdżającym tutaj przez wyszukiwarkę i szukającym rozwiązania działającego po wyjęciu z pudełka, polecam instalację
mpu
. Zainstaluj go przezpip install mpu --user
i użyj go w ten sposób, aby uzyskać odległość haversine :Pakiet alternatywny to
gpxpy
.Jeśli nie chcesz zależności, możesz użyć:
Inny pakiet alternatywny to
[haversine][1]
Twierdzą, że mają optymalizację wydajności dla odległości między wszystkimi punktami w dwóch wektorach
źródło
Doszedłem do znacznie prostszego i solidnego rozwiązania, które korzysta
geodesic
zgeopy
pakietu, ponieważ prawdopodobnie i tak będziesz go używać w swoim projekcie, więc nie jest wymagana dodatkowa instalacja pakietu.Oto moje rozwiązanie:
geopy
źródło
źródło
Istnieje wiele sposobów obliczenia odległości na podstawie współrzędnych, tj. Szerokości i długości geograficznej
Zainstaluj i zaimportuj
Zdefiniuj współrzędne
Używanie haversine
Używanie haversine ze sklearn
Korzystanie z OSRM
Korzystanie z geopy
Wynik
źródło