Pyproj与Haversine计算的航向为何与Google Earth结果不符?
两点间航向计算结果差异原因分析
可能的原因
1. Haversine函数存在笔误
你提供的Haversine函数代码有明显输入错误:
# 错误行:变量名与输入列表不匹配,且最后一个参数误用lon1替代lon2 lat, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon1])
正确写法应为:
lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
这个笔误会导致lon2被错误赋值为lon1的弧度值,使dLon=0,理论上计算结果应为0度(正北)。你说结果与pyproj一致,说明实际运行的是修正后的代码。
2. 起点/终点或经纬度顺序混淆
你的Python代码计算的是从点1(42.73864N, 111.8052E)到点2(43.24844N, 110.6083E)的航向,点2实际位于点1的西北方向,正确的真北初始航向应接近300度(而非60.3度)。这种矛盾说明:
- 可能在pyproj中颠倒了经纬度输入顺序(pyproj要求
inv(lon1, lat1, lon2, lat2),若误写为inv(lat1, lon1, lat2, lon2)会导致结果偏差); - 或在Google Earth中颠倒了起点和终点,计算的是从点2到点1的航向;
- 或在某工具中输入坐标时搞反了纬度和经度。
3. Google Earth的方位角定义差异
Google Earth标尺工具默认显示的是大地线的平均方位角,而Python的Geod.inv和Haversine公式计算的是初始方位角(从起点出发的瞬间航向)。但两点距离较近时,该差异通常很小,不足以解释45度的差距,因此可能性较低。
4. 磁北与真北的混淆
若Google Earth设置为显示磁北方位角,而Python计算的是真北方位角,会存在差异,但该区域磁偏角仅为几度,无法解释如此大的差距。
验证建议
- 重新确认所有工具中的起点、终点坐标及经纬度顺序;
- 使用修正后的Haversine函数重新计算,对比pyproj结果;
- 在Google Earth中开启“显示真北”选项,重新测量航向。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

