L'obtention de la distance entre deux points en fonction de la latitude/longitude
J'ai essayé la mise en œuvre de cette formule: http://andrew.hedges.name/experiments/haversine/
L'aplet n'est bonne pour les deux points que je suis en train de tester:
Mais 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 à laquelle il renvoie est 5447.05546147. Pourquoi?
Vous devez vous connecter pour publier un commentaire.
Edit: Juste une remarque, si vous avez juste besoin d'un moyen facile et rapide de trouver la distance entre deux points, je recommande fortement d'utiliser l'approche décrite dans Kurt réponse ci-dessous au lieu de re-mise en œuvre de Haversine -- voir son poste pour raison d'être.
Cette réponse met l'accent seulement sur la réponse à la bogue spécifique OP couru dans.
C'est parce que en Python, toutes les fonctions trigonométriques utiliser des radians, pas de degrés.
Vous pouvez convertir manuellement les numéros de radians, ou utiliser le
radians
fonction du module math:La distance est maintenant de retour la valeur correcte de
278.545589351
km.radians(abs(52.123))
devrait faire l'affaire...Mise à jour: 04/2018: Noter que Vincenty distance est obsolète depuis GeoPy version 1.13 - vous devez utiliser geopy.distance.distance() à la place!
Les réponses ci-dessus sont basées sur les Haversine formule, ce qui suppose que la terre est une sphère, ce qui entraîne des erreurs jusqu'à environ 0,5% (selon
help(geopy.distance)
). Vincenty distance utilise plus précis ellipsoïdale des modèles tels que WGS-84, et est mis en œuvre dans geopy. Par exemple,affichera la distance de
279.352901604
kilomètres à l'aide de la valeur par défaut de l'ellipsoïde WGS-84. (Vous pouvez également choisir.miles
ou une ou plusieurs autres unités de distance).print geopy.distance.VincentyDistance(coords_1, coords_2).km 279.352901604
geopy.distance.distance(…)
dans le code qui est un alias de les meilleures (=le plus précis) formule de la distance. (Vincenty pour le moment.)geopy.distance.geodesic
depuis la distance va augmenter ValueError sic1=(1, 179)
etc2=(0,0)
.geopy.distance.geodesic
(ou la valeur par défautgeopy.distance.distance
) au lieu de cela, ce qui est plus précis et converge toujours.Pour les personnes (comme moi) de venir ici via le moteur de recherche et à la recherche d'une solution qui fonctionne hors de la boîte, je recommande l'installation de
mpu
. Installer viapip install mpu --user
et de l'utiliser comme cela pour obtenir le haversine distance:Un autre forfait est
gpxpy
.Si vous ne voulez pas les dépendances, vous pouvez utiliser: