У мене є точки WGS84 lat / long, і я хотів би виміряти "невеликі" (менше, ніж скажімо, 5 км) відстані між ними.
Я можу використовувати формулу haversine з http://www.movable-type.co.uk/scripts/latlong.html, і вона працює дуже добре.
Я хотів би використовувати бібліотеки Python Shapely, щоб я міг робити більше операцій, ніж просто відстань, а тому, що в масштабі, з яким я працюю, плоска земля є досить хорошим наближенням. Щоб надійно спроектувати географічні координати на декартову координату, я використовую Python proj4
, але, схоже, отримую більші помилки, ніж хотілося б.
Якщо я використовую локальну зону UTM, я отримую відмінності між геверином на пару метрів, що добре. Але мені не хочеться опрацьовувати зону UTM (точки можуть бути у всьому світі), тому я спробував "сферичний Меркатор", але зараз відмінності між гаверсином та прогнозованими відстанями значно перевищують 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 м, а з використанням зони utm 27, 395 м. Але якщо я використовую сферичний Меркатор, то декартова відстань дорівнює 904 м, що далеко.