Intenté implementar esta fórmula: http://andrew.hedges.name/experiments/haversine/ El aplet funciona bien para los dos puntos que estoy probando:
Sin embargo, mi código no funciona.
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 distancia que regresa es 5447.05546147 . ¿Por qué?
radians(abs(52.123))
debería hacer el truco ...Actualización: 04/2018: tenga en cuenta que la distancia de Vincenty está en desuso desde la versión 1.13 de GeoPy ; en su lugar, debe usar geopy.distance.distance ().
Las respuestas anteriores se basan en la fórmula de Haversine , que supone que la tierra es una esfera, lo que da como resultado errores de hasta aproximadamente 0.5% (según
help(geopy.distance)
). La distancia de Vincenty utiliza modelos elipsoidales más precisos, como WGS-84 , y se implementa en geopy . Por ejemplo,imprimirá la distancia de
279.352901604
kilómetros utilizando el elipsoide predeterminado WGS-84. (También puede elegir.miles
o una de varias otras unidades de distancia).fuente
print geopy.distance.VincentyDistance(coords_1, coords_2).km 279.352901604
geopy.distance.distance(…)
código que sea un alias de la fórmula de distancia mejor (= más precisa) actualmente. (Vincenty en este momento.)geopy.distance.geodesic
(o el valor predeterminadogeopy.distance.distance
) en su lugar, que es más preciso y siempre converge.Para las personas (como yo) que vienen aquí a través del motor de búsqueda y solo buscan una solución que funcione de inmediato, recomiendo la instalación
mpu
. Instálelo a través depip install mpu --user
y utilícelo de esta manera para obtener la distancia haversine :Un paquete alternativo es
gpxpy
.Si no quieres dependencias, puedes usar:
El otro paquete alternativo es
[haversine][1]
Afirman tener una optimización del rendimiento para distancias entre todos los puntos en dos vectores
fuente
Llegué a una solución mucho más simple y robusta que está usando
geodesic
desde elgeopy
paquete, ya que es muy probable que la uses en tu proyecto de todos modos, por lo que no es necesario instalar ningún paquete adicional.Aquí está mi solución:
geopy
fuente
fuente
Hay varias formas de calcular la distancia en función de las coordenadas, es decir, latitud y longitud.
Instalar e importar
Definir coordenadas
Usando haversine
Usando haversine con sklearn
Usando OSRM
Usando geopy
Salida
fuente