在球形墨卡托与区域UTM中测量距离


11

我在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,相距很远。


UTM区域很容易根据经度进行“计算”。选择一个典型的经度lambda -180 <= lambda <180,并用它来计算区域数为Int((180 + lambda)/ 6)+1。使用纬度符号确定南北之间。您无需在高纬度地区使用特殊的极地区;实际上,您几乎可以在几乎任何一个UTM区域使用极点。
ub

Answers:


17

是的,使用墨卡托全局投影会出现这些类型的误差:赤道上的精度很高,并且随着距赤道的纬度的增加,失真呈指数增长。纬度为60度时,距离失真恰好为2(100%)。在您的测试纬度(64.14度)下,我计算出2.294的失真,与904/394 = 2.294的比率完全吻合。(我早先计算了2.301,但它是基于球体而不是WGS84椭球体。差异(0.3%)使我们对使用基于椭球体的投影与基于球体的Haversine公式可能会获得的精度有所了解。 )

全局投影不会在任何地方产生高度精确的距离。这就是使用UTM区域系统的原因之一!

一种解决方案是对所有计算都使用球面几何,但是您拒绝了这一点(如果您要进行复杂的操作,这是合理的,但是该决定可能值得重新考虑)。

另一个解决方案是使投影适应要比较的点。例如,您可以安全地使用横向墨卡托(如在UTM系统中那样),使子午线位于感兴趣区域的中心附近。移动子午线是一件简单的事情:只需从所有经度中减去子午线的经度,然后使用以本初子午线为中心(比例因子为1,而不是UTM系统的0.9996)的单个 TM投影即可。对于您的工作,这往往会更多比使用UTM本身更准确。它将提供正确的角度(TM是保形的),并且对于仅相距数十公里的点将非常精确:期望优于六位数的精度。实际上,我倾向于将这些适应的TM距离和Haversine距离之间的任何微小差异都归因于椭球(用于TM投影)和球体(由Haversine使用)之间的差异,而不是归因于投影。


这听起来非常完美,我想我需要为proj4创建自己的初始化字符串,而不是能够使用任何现有的EPSG字符串?
Karl P

1
+1使投影适应这些点。与横向墨卡托相比,我更喜欢横向板carrée,但是在足够小的区域(“大比例尺”)上,几乎在感兴趣区域附近“居中”的任何投影都将提供良好的精度。
大卫·卡里

@David有趣的主意。在球体上,横向板式Carree(Cassini)将接近我在gis.stackexchange.com/posts/2964/edit上给出的近似公式(此处可能是一个可接受的解决方案)。TM和TPC的公式在球面上相似。在椭圆体上,TPC稍微简单一些。TM可能受更多软件的支持。
ub

@Karl如果愿意,可以使用任何TM区域。只需移动所有经度,以使您感兴趣的区域的中心点与所选区域的中心子午线重合即可。将所有距离乘以1 / 0.9996(并将所有面积乘以该系数的平方),不更改任何角度或方位,并且-如果您的计算产生新的点-只需将其经度移回到原始坐标系即可。
ub

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.