J'ai essayé d'implémenter cette formule: http://andrew.hedges.name/experiments/haversine/ L'aplet fait du bien pour les deux points que je teste:
Pourtant mon code ne fonctionne pas.
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
La distance qu'il renvoie est 5447.05546147 . Pourquoi?
radians(abs(52.123))
devrait faire l'affaire ...Mise à jour: 04/2018: Notez que Vincenty distance est obsolète depuis la version 1.13 de GeoPy - vous devriez utiliser geopy.distance.distance () à la place!
Les réponses ci-dessus sont basées sur la formule Haversine , qui suppose que la terre est une sphère, ce qui entraîne des erreurs allant jusqu'à environ 0,5% (selon
help(geopy.distance)
). Vincenty distance utilise des modèles ellipsoïdaux plus précis tels que WGS-84 , et est implémenté en geopy . Par exemple,imprime la distance en
279.352901604
kilomètres en utilisant l'ellipsoïde par défaut WGS-84. (Vous pouvez également choisir.miles
ou l'une de plusieurs autres unités de distance).la source
print geopy.distance.VincentyDistance(coords_1, coords_2).km 279.352901604
geopy.distance.distance(…)
dans le code un alias de la meilleure formule de distance actuellement (= la plus précise). (Vincenty pour le moment.)geopy.distance.geodesic
(ou la valeur par défautgeopy.distance.distance
), qui est plus précise et converge toujours.Pour les personnes (comme moi) qui viennent ici via un moteur de recherche et qui cherchent simplement une solution qui fonctionne hors de la boîte, je recommande l'installation
mpu
. Installez-le viapip install mpu --user
et utilisez-le comme ceci pour obtenir la distance haversine :Un autre package est
gpxpy
.Si vous ne voulez pas de dépendances, vous pouvez utiliser:
L'autre package alternatif est
[haversine][1]
Ils prétendent avoir une optimisation des performances pour les distances entre tous les points dans deux vecteurs
la source
Je suis arrivé à une solution beaucoup plus simple et robuste qui utilise
geodesic
degeopy
package car vous l'utiliserez très probablement dans votre projet de toute façon, donc aucune installation de package supplémentaire n'est nécessaire.Voici ma solution:
geopy
la source
la source
Il existe plusieurs façons de calculer la distance en fonction des coordonnées, c'est-à-dire la latitude et la longitude
Installer et importer
Définir les coordonnées
Utiliser haversine
Utiliser haversine avec sklearn
Utilisation d'OSRM
Utilisation de geopy
Production
la source