我的 MS ACCESS VBA 函数计算新的纬度/经度坐标的错误在哪里?

史蒂夫·沃林

我编写了一个 MS Access VBA 函数来根据方位和距离计算新的纬度/经度坐标。但是它返回了错误的结果,我不明白为什么。我使用了https://www.movable-type.co.uk/scripts/latlong.html上的公式但是当我针对该页面上的计算器对其进行测试时,它给出了错误的结果。例如NewLatLong(0, 0, 500, "K", 45)给出纬度为5.54656612024095E-02,经度为0。经度转换后与页面上的计算器比较,纬度是正确的,但为什么经度变为零?NewLatLong 的参数是以度为单位的原始纬度和经度、距离、距离单位(K = 公里)以及以度为单位的从北顺时针方向的方位。

MS Access 不具备所需的所有三角函数。我提供了新的。这些已经过单独测试,似乎功能正常。

我看不出我的代码有什么问题。任何人都可以帮忙。

Public Function NewLatLong(latD As Double, longD As Double, distance As Double, unit As String, bearingD As Double) As Double()
    Dim latlong(2) As Double
    Dim latR As Double, bearingR As Double
    latR = Radians(latD)
    bearingR = Radians(bearingD)
    Dim cosAngDistance As Double, sinAngDistance As Double
    cosAngDistance = Cos(distance / EarthRadius(unit))
    sinAngDistance = Sin(distance / EarthRadius(unit))
    latlong(0) = ArcSine(Sin(latR) * cosAngDistance + Cos(latR) * sinAngDistance * Cos(bearingR))
    latlong(1) = (Radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0))) + 540) Mod 360 - 180
    NewLatLong = latlong
    Debug.Print latlong(0) & " " & latlong(1)
End Function

Public Function EarthRadius(unit As String) As Double
    If (unit = "M") Then
        EarthRadius = 3963
    ElseIf (unit = "K") Then
        EarthRadius = 6371
    Else
        EarthRadius = 3443.753
    End If
End Function


Public Function Pi() As Double
    Pi = 4 * Atn(1)
End Function

Public Function ArcCosine(value As Double) As Double
    ArcCosine = Atn(-value / Sqr(-value * value + 1)) + 2 * Atn(1)
End Function

Public Function ArcSine(value As Double) As Double
    ArcSine = Atn(value / Sqr(-value * value + 1))
End Function

Public Function ArcTan2(y As Double, x As Double) As Double
    If x > 0 Then
        ArcTan2 = Atn(y / x)
    ElseIf x < 0 Then
        ArcTan2 = Sgn(y) * (Pi() - Atn(Abs(y / x)))
    ElseIf y = 0 Then
        ArcTan2 = 0
    Else
        ArcTan2 = Sgn(y) * Pi() / 2
    End If
End Function

Public Function Radians(degrees As Double) As Double
    Radians = degrees * Pi() / 180
End Function
银行建设者

好消息和坏消息。好消息是你的代码几乎完美运行,坏消息是 Mod 运算符总是返回一个整数,而不管其参数的类型(为什么是微软!?为什么!?)。

而不是latlong(1) = (Radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0))) + 540) Mod 360 - 180,使用下面的代码来查找经度

Dim tempLong As Double
tempLong = Radians(longD) + ArcTan2(Sin(bearingR) * sinAngDistance * Cos(latR), cosAngDistance - Sin(latR) * Sin(latlong(0)))
' set longitude if calculated value less than 1
If tempLong < 1 Then
    latlong(1) = tempLong
' if greater than 1, add decimal part back to modulus result
Else
    Dim decLong As Double
    decLong = tempLong
    While decLong > 1
        decLong = decLong - 1
    Wend
    latlong(1) = ((tempLong + 540) Mod 360 - 180) + decLong
End If

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MS Access 2013,我的工具栏和vba编辑器在哪里?

来自分类Dev

Int()函数MS Access VBA

来自分类Dev

MS ACCESS vba-错误

来自分类Dev

多参数IsNull函数MS Access VBA

来自分类Dev

MS Access VBA IF()

来自分类Dev

MS Access VBA 运行查询

来自分类Dev

MS Access VBA:计算中位数,而无需遍历记录

来自分类Dev

如何使用VBA在MS Access中添加新记录?

来自分类Dev

MS Access-VBA-创建新的Excel工作簿

来自分类Dev

在MS Access VBA编辑器中查找函数定义

来自分类Dev

Ms Access 数据宏调用 VBA 函数开箱即用

来自分类Dev

VBA (Ms-Access) 从宏调用成员函数

来自分类Dev

MS ACCESS VBA运行时错误“ 3021”;与.MoveNext

来自分类Dev

VBA (Ms-Access) 2013 溢出错误

来自分类Dev

MS ACCESS - VBA 中的错误运行时 3141 SQL

来自分类Dev

在Access 365 VBA代码中将我的错误命令放在哪里

来自分类Dev

从VBA SQL语法错误将MS EXCEL转换为MS ACCESS .accdb数据库

来自分类Dev

ms-access中我的功能区标签在哪里?

来自分类Dev

带VBA的MS Access链接表

来自分类Dev

MS Access中VBA代码的继承

来自分类Dev

SQL语法问题MS Access VBA

来自分类Dev

MS-Access:使用vba移至NavigationControl

来自分类Dev

MS Access VBA:如何清除图像控件?

来自分类Dev

是/否字段上的MS Access VBA Dlookup

来自分类Dev

MS Access查询未从VBA接收参数

来自分类Dev

MS Access VBA:OpenRecordSet返回什么?

来自分类Dev

MS Access VBA,SQL脚本:In(),<>和AND语法

来自分类Dev

使用VBA显示MS Access报告

来自分类Dev

MS ACCESS VBA按案例订购的时间