У меня есть очки в WGS84 широта / длина, и я хотел бы измерить «малые» (скажем, 5 км) расстояния между ними.
Я могу использовать формулу haversine из http://www.movable-type.co.uk/scripts/latlong.html, и она работает очень хорошо.
Я бы хотел использовать библиотеки Python Shapely, чтобы я мог выполнять больше операций, чем просто расстояние, и потому, что в масштабе, с которым я работаю, плоская земля является достаточно хорошим приближением. Чтобы надежно спроецировать географические координаты на декартову, я использую Python proj4
, но, похоже, получаю больше ошибок, чем хотелось бы.
Если я использую локальную зону UTM, я получаю разницу между haversine в пару метров, и это нормально. Но я не хочу работать с зоной UTM (точки могут быть во всем мире), поэтому я попробовал использовать «сферический меркатор», но теперь разница между haversine и проецируемыми расстояниями составляет более 100%. Это действительно правильно для сферического Меркатора? Все, что я действительно хочу, это работоспособная декартова проекция для двух точек в пределах 5 км друг от друга в любой точке мира.
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)
В этот момент расстояние между ними составляет 394 м, а в зоне 27 utm - 395 м. Но если я использую сферический Меркатор, то декартово расстояние составляет 904 м, что далеко.