Tengo puntos en WGS84 lat / long y me gustaría medir distancias "pequeñas" (menos de 5 km) entre ellos.
Puedo usar la fórmula de Haversine de http://www.movable-type.co.uk/scripts/latlong.html y funciona muy bien.
Sin embargo, me gustaría usar las bibliotecas Python Shapely, para poder hacer más operaciones que solo la distancia, y porque en la escala con la que estoy trabajando, una tierra plana es una aproximación lo suficientemente buena. Para proyectar de manera confiable las coordenadas geográficas a un coord cartesiano, estoy usando Python proj4
, pero parece tener errores más grandes de lo que me gustaría.
Si uso la zona UTM local, obtengo diferencias entre la haversina de un par de metros, lo cual está bien. Pero no quiero tener que resolver la zona UTM (los puntos podrían ser mundiales), así que probé con "Mercator esférico", pero ahora las diferencias entre la distancia de Haversine y la proyectada están por encima del 100%. ¿Es esto realmente correcto para Mercator esférico? Todo lo que realmente quiero es una proyección cartesiana viable para dos puntos a menos de 5 km de distancia en cualquier parte del 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)
En este punto, la distancia haversina entre ellos es de 394m, y utilizando la zona utm 27, 395m. Pero si uso Mercator esférico, la distancia cartesiana es de 904 m, que está muy lejos.