原理:将地球抽象为一个球体,已知两点经纬度即已知两点在球体上的坐标,计算两点之间的劣弧的长度
Const r As Double = 6378137 '地球半径常量
Const PI As Double = 3.1415926 '圆周率常量
Private Type LatLog
lat As Double
log As Double
End Type
'已知两点经纬度求大圆距离
Private Function GetGroundDistance(latlogA As LatLog, latlogB As LatLog) As Double
w1 = Pers2Act(latlogA.lat)
w2 = Pers2Act(latlogB.lat)
j1 = Pers2Act(latlogA.log)
j2 = Pers2Act(latlogB.log)
alpha = Arccos(Cos(w1) * Cos(w2) * Cos(j1 - j2) + Sin(w1) * Sin(w2))
d = alpha * r
GetGroundDistance = d
End Function
'弧度转角度
Private Function Act2Pers(act As Double) As Double
Act2Pers = act / PI * 180
End Function
'角度转弧度
Private Function Pers2Act(pers As Double) As Double
Pers2Act = pers / 180 * PI
End Function
'反余弦函数
Private Function Arccos(x As Double) As Double
Arccos = PI / 2 - Atn(x / Sqr(-x * x + 1))
End Function
'测试
Private Sub MainFunction()
Dim a As LatLog
Dim b As LatLog
a.lat = 45
a.log = 8
b.lat = 45
b.log = 9
Debug.Print GetGroundDistance(a, b)
End Sub