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.
fuente
Respuestas:
Sí, obtendrá este tipo de errores con una proyección global de Mercator: es precisa en el ecuador y la distorsión aumenta exponencialmente con la latitud del ecuador. La distorsión de la distancia es exactamente 2 (100%) a 60 grados de latitud. En sus latitudes de prueba (64.14 grados) calculo una distorsión de 2.294, coincidiendo exactamente con la relación 904/394 = 2.294. (Anteriormente calculé 2.301 pero eso se basó en una esfera, no en el elipsoide WGS84. La diferencia (del 0.3%) nos da una idea de la precisión que puede obtener al usar una proyección basada en elipsoide versus la fórmula de Haversine basada en la esfera. )
No existe una proyección global que produzca distancias muy precisas en todas partes. ¡Esa es una razón por la que se utiliza el sistema de zona UTM!
Una solución es usar geometría esférica para todos sus cálculos, pero lo ha rechazado (lo cual es razonable si va a realizar operaciones complejas, pero la decisión podría valer la pena).
Otra solución es adaptar la proyección a los puntos que se comparan . Por ejemplo, podría usar de forma segura un Mercator transversal (como en el sistema UTM) con un meridiano ubicado cerca del centro de la región de interés. Mover el meridiano es algo simple: solo resta la longitud del meridiano de todas las longitudes y usa una sola proyección TM centrada en el meridiano principal (con un factor de escala de 1, en lugar del 0.9996 del sistema UTM). Para su trabajo, esto tenderá a ser máspreciso que usar UTM en sí. Dará ángulos correctos (TM es conforme) y será notablemente preciso para puntos separados por solo unas pocas decenas de kilómetros: espere una precisión mejor que seis dígitos. De hecho, me inclinaría a atribuir cualquier pequeña diferencia entre estas distancias TM adaptadas y las distancias de Haversine a la diferencia entre el elipsoide (utilizado para la proyección TM) y la esfera (utilizada por Haversine), en lugar de la distorsión en el proyección.
fuente
No lo he intentado, pero según la documentación parece que puedes usar http://search.cpan.org/~grahamc/Geo-Coordinates-UTM-0.08/UTM.pm#latlon_to_utm para obtener un par lat / lon (más elipsoide) a la zona UTM y la lista de coordenadas. Entonces puede continuar con su cálculo como antes.
fuente