【问题标题】:VBA haversine formulaVBA 半正弦公式
【发布时间】:2016-05-12 12:46:39
【问题描述】:

我正在尝试将 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

但是当我测试它时,我得到了错误的距离......我不明白为什么。对于本主题中使用的坐标:Function to calculate distance between two coordinates shows wrong 我得到 20013,44 作为输出。有人知道这里有什么问题吗?找不到我的错误...

【问题讨论】:

  • 只是一个问题:为什么选择“Variant”作为数据类型,而不是“double”?其次,您是否已经尝试使用 Excel 公式为此制作一个简单的 Excel 文件?这样可以更容易理解可能出了什么问题。

标签: excel vba formula haversine


【解决方案1】:

与 JavaScript 相比,Atan2 在 Excel 中是从前定义的,即 Atan2(x,y) 而不是 Atan2(y,x)。

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

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

this

所以

=haversine(59.3293371,13.4877472,59.3225525,13.4619422)

给予

1.65 km

这是乌鸦飞翔时的正确距离。

【讨论】:

  • 哇,这太棒了。需要有经验的人才能知道其中的微妙之处。
【解决方案2】:

很棒的工具!只是强调结果将以 公里 为单位,因此如果您希望 miles 将结果乘以 0.62137。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2016-12-30
    • 1970-01-01
    • 2018-08-08
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多