Ho punti in WGS84 lat / long e mi piacerebbe misurare distanze "piccole" (meno di 5 km) tra di loro.
Posso usare la formula haversine di http://www.movable-type.co.uk/scripts/latlong.html e funziona molto bene.
Mi piacerebbe usare le librerie di Python Shapely, così da poter fare più operazioni oltre alla semplice distanza, e poiché alla scala con cui sto lavorando, una terra piatta è un'approssimazione abbastanza buona. Per proiettare in modo affidabile i coordini geografici su un coord cartesiano, sto usando quelli di Python proj4
, ma sembra che si verifichino errori maggiori di quelli che vorrei.
Se uso la zona UTM locale, ottengo differenze tra le curve di un paio di metri, il che va bene. Ma non voglio elaborare la zona UTM (i punti potrebbero essere in tutto il mondo), quindi ho provato con "Mercator sferico", ma ora le differenze tra le distanze haversine e quelle previste sono ben oltre il 100%. È davvero giusto per Mercator sferico? Tutto quello che voglio davvero è una proiezione cartesiana praticabile per due punti entro 5 km l'uno dall'altro in qualsiasi parte del mondo.
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)
A questo punto, la distanza haversine tra loro è 394m, e usando la zona utm 27, 395m. Ma se uso Mercator sferico, la distanza cartesiana è di 904 m, che è molto lontana.