Tenho pontos no WGS84 lat / long e gostaria de medir distâncias "pequenas" (menos do que 5 km) entre eles.
Eu posso usar a fórmula haversine em http://www.movable-type.co.uk/scripts/latlong.html e funciona muito bem.
Eu gostaria de usar as bibliotecas Python Shapely, para que eu possa fazer mais operações do que apenas distância, e porque na escala em que estou trabalhando, uma terra plana é uma aproximação suficientemente boa. Para projetar com segurança as cordas geográficas em uma coordenada cartesiana, estou usando o Python proj4
, mas parece ter erros maiores do que eu gostaria.
Se eu usar a zona UTM local, obtenho diferenças entre a barreira de um par de metros, o que é bom. Mas eu não quero ter que trabalhar na zona UTM (os pontos podem ser mundiais), então tentei com o "Mercator esférico", mas agora as diferenças entre distâncias oceânicas e distâncias projetadas estão bem acima de 100%. Isso é realmente certo para Mercator esférico? Tudo o que eu realmente quero é uma projeção cartesiana viável para dois pontos a 5 km um do outro em qualquer lugar do mundo.
from shapely.geometry import Point
from pyproj import Proj
proj = Proj(proj='utm',zone=27,ellps='WGS84')
#proj = Proj(init="epsg:3785") # spherical mercator, should work anywhere...
point1_geo = (-21.9309694, 64.1455718)
point2_geo = (-21.9372481, 64.1478206)
point1 = proj(point1_geo[0], point1_geo[1])
point2 = proj(point2_geo[0], point2_geo[1])
point1_cart = Point(point1)
point2_cart = Point(point2)
print "p1-p2 (haversine)", hdistance(point1_geo, point2_geo)
print "p1-p2 (cartesian)", point1_cart.distance(point2_cart)
Neste ponto, a distância do haversine entre eles é de 394m, e usando a zona utm 27, 395m. Mas se eu usar Mercator esférico, a distância cartesiana é 904m, o que está muito distante.