Eu tentei implementar esta fórmula: http://andrew.hedges.name/experiments/haversine/ O aplet faz bem para os dois pontos que estou testando:
No entanto, meu código não está funcionando.
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
A distância que ele retorna é 5447.05546147 . Por quê?
radians(abs(52.123))
deve fazer o truque ...Atualização: 04/2018: Observe que a distância Vincenty está obsoleta desde a versão 1.13 do GeoPy - você deve usar geopy.distance.distance ()!
As respostas acima são baseadas na fórmula de Haversine , que assume que a Terra é uma esfera, que resulta em erros de até 0,5% (de acordo com
help(geopy.distance)
). A distância Vincenty usa modelos elipsoidais mais precisos, como o WGS-84 , e é implementada em geopia . Por exemplo,imprimirá a distância de
279.352901604
quilômetros usando o elipsóide padrão WGS-84. (Você também pode escolher.miles
ou uma das várias outras unidades de distância).fonte
print geopy.distance.VincentyDistance(coords_1, coords_2).km 279.352901604
geopy.distance.distance(…)
código que seja um alias da melhor fórmula de distância atualmente (= mais precisa). (Vincenty no momento.)geopy.distance.geodesic
(ou o padrãogeopy.distance.distance
), o que é mais preciso e sempre converge.Para pessoas (como eu) vindo aqui pelo mecanismo de busca e procurando apenas uma solução que funcione imediatamente, recomendo a instalação
mpu
. Instale-o viapip install mpu --user
e use-o desta maneira para obter a distância do Haversine :Um pacote alternativo é
gpxpy
.Se você não deseja dependências, pode usar:
O outro pacote alternativo é
[haversine][1]
Eles afirmam ter otimização de desempenho para distâncias entre todos os pontos em dois vetores
fonte
Cheguei a uma solução muito mais simples e robusta que está usando
geodesic
dogeopy
pacote, pois você provavelmente o utilizará em seu projeto de qualquer maneira, portanto, não é necessária nenhuma instalação extra de pacote.Aqui está a minha solução:
geopy
fonte
fonte