关于使用Haversine公式计算球面两点最短距离的疑问
关于使用Haversine公式计算球面两点最短距离的疑问
嘿,我来帮你理清这里的问题~首先你在参数对应和公式使用上出现了几个小错误,导致最后误以为c是坐标,咱们一步步来修正:
首先纠正核心参数混淆问题
你把纬度差(Δφ)和经度差(Δλ)搞反啦!
- 两个人都在40N纬度,所以纬度差Δφ = φ₂ - φ₁ = 0
- 经度差才是需要重点计算的:A在0.4W(可以记为-0.4°),B在74E(+74°),所以Δλ = 74° - (-0.4°) = 74.4°,转换成弧度是
74.4 * π/180 ≈ 1.3003弧度
你之前把经度的差值当成了纬度差,这是导致后续混乱的根源哦。
重新梳理Haversine公式的正确计算步骤
Haversine公式的正确流程是:
转换所有角度为弧度:
- φ₁=φ₂=40° =
40 * π/180 ≈ 0.6981弧度 - λ₁=-0.4° =
-0.4 * π/180 ≈ -0.00698弧度 - λ₂=74° =
74 * π/180 ≈ 1.2915弧度 - Δφ=0,Δλ=λ₂-λ₁≈1.3003 弧度
- φ₁=φ₂=40° =
计算
a值:
因为Δφ=0,所以sin²(Δφ/2)=0,公式简化为:
$$a = \cos \phi_1 \cdot \cos \phi_2 \cdot \sin^2(\Delta\Lambda/2)$$
代入数值:
- $\cos(0.6981)≈0.7660$,所以$\cosφ₁·\cosφ₂≈0.7660²≈0.5868$
- $\sin(Δλ/2)=\sin(1.3003/2)≈\sin(0.6501)≈0.606$,平方后≈0.367
- 最终$a≈0.5868 * 0.367≈0.215$
- 计算
c值(关键修正!)
你写错了c的计算公式,正确的应该是用双参数反正切函数arctan2,而不是arctan(2(...)):
$$c = 2 \cdot \arctan2( \sqrt{a}, \sqrt{1−a} )$$
这里arctan2(x,y)返回的是一个单一的弧度值,不是坐标!你之前的写法是把函数名和参数搞混了。代入数值:
- $\sqrt{a}≈\sqrt{0.215}≈0.464$,$\sqrt{1-a}≈\sqrt{0.785}≈0.886$
- $\arctan2(0.464, 0.886)≈0.488$ 弧度
- 所以$c=2*0.488≈0.976$ 弧度
- 计算最终距离
地球半径R=6371km,所以:
$$d = R \cdot c ≈ 6371 * 0.976 ≈ 6218 \text{ km}$$
总结你之前的问题点
- 混淆了纬度差和经度差,导致Δφ和Δλ的取值完全颠倒
- 错误书写了
c的计算公式,把arctan2写成了arctan(2(...)),误解了返回值的含义 - 弧度转换时近似值太粗糙(比如把40°直接取0.7弧度),会影响最终结果的精度
这样一步步修正后,就能得到正确的两点最短球面距离啦~
备注:内容来源于stack exchange,提问作者Superunknown
相关产品推荐
相关产品推荐

