VBA Haversine公式

5

我正在尝试将Haversine公式应用到Excel函数中。它看起来像这样:

Public Function Haversine(Lat1 As Variant, Lon1 As Variant, Lat2 As Variant, Lon2 As Variant)
Dim R As Integer, dlon As Variant, dlat As Variant, Rad1 As Variant
Dim a As Variant, c As Variant, d As Variant, Rad2 As Variant

R = 6371
dlon = Excel.WorksheetFunction.Radians(Lon2 - Lon1)
dlat = Excel.WorksheetFunction.Radians(Lat2 - Lat1)
Rad1 = Excel.WorksheetFunction.Radians(Lat1)
Rad2 = Excel.WorksheetFunction.Radians(Lat2)
a = Sin(dlat / 2) * Sin(dlat / 2) + Cos(Rad1) * Cos(Rad2) * Sin(dlon / 2) * Sin(dlon / 2)
c = 2 * Excel.WorksheetFunction.Atan2(Sqr(a), Sqr(1 - a))
d = R * c
Haversine = d
End Function

但是当我测试它时,我得到的距离是错误的...我不明白为什么。对于这个主题中使用的坐标:计算两个坐标之间距离的函数显示错误,我的输出是20013.44。有人知道这里出了什么问题吗?找不到我的错误...


只是一个问题:你为什么选择“Variant”作为数据类型,而不是“double”?其次,你是否已经尝试使用Excel公式制作了一个简单的Excel文件?那样会更容易理解可能出现的问题。 - Dominique
2个回答

9

在Excel中,与JavaScript相比,Atan2的定义是反过来的,即使用Atan2(x,y)而不是Atan2(y,x)。

您需要颠倒两个参数的顺序:

c = 2 * Excel.WorksheetFunction.Atan2(Sqr(1 - a), Sqr(a))

请参考这里
因此,
=haversine(59.3293371,13.4877472,59.3225525,13.4619422)

提供

1.65 km

这是乌鸦飞行的正确距离。


哇,这太棒了。只有经验丰富的人才能知道其中的微妙之处。 - Dilnoor Singh

0

非常好的工具!只是强调结果将以千米为单位,如果你想要英里,请将结果乘以0.62137。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接