我在WGS84纬度/经度中有积分,我想测量它们之间的“小”(小于5公里)距离。
我可以使用http://www.movable-type.co.uk/scripts/latlong.html中的Haversine公式,效果很好。
不过,我想使用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)
此时,它们之间的正弦距离为394m,使用utm区域27、395m。但是,如果我使用球形墨卡托,则笛卡尔距离为904m,相距很远。