使用VBA将GPS读入Access并进行比较

| 我曾尝试使用谷歌搜索功能,但运气有限-我想做的是使用VBA从串行GPS加密狗(或模仿前者的蓝牙Android手机)读取坐标,记录“访问”记录,然后查找客户表上最接近的匹配记录。有没有人看过一个允许这样做的开源脚本? 提前致谢。 PG     
已邀请:
        有关串行端口数据的获取,请参见我的网站上的“串行端口通信”页面。然后,您可以使用SQL插入查询或带有AddNew的DAO记录集将记录写到表中。但是,要找到最接近的匹配记录,可能需要使用几何图形来查找表格中的读数,以寻找最接近的位置,因此我必须刷新我的内存以了解所需的确切方程式。 我还认为,为加快搜索速度,您可能希望对纬度和经度编制索引,并从附近的经​​纬度开始搜索。这是将初始记录设置为正/负的限制,例如,经/纬度的0.1,只是猜测约为10 kms平方。     
        这是您需要做的一个粗略总结。 客户地址的查找经度和纬度: 不久前,我在SO上发布了一个问题,询问如何获取地址的GPS坐标。您可以在这里看到该问题。实际上,这里有两个功能供您使用,一个使用Google Maps API,另一个使用rpc.geocoder.us。随便你吧。请注意,它们每个都有局限性。 Google具有许可限制以及每天的最大查询量。 Geocoder.us的查询限制为每15秒一次,我不记得他们每天的最大查询量是多少,即使它们甚至有限制。 显然,您需要预先获取地址的经度和纬度,并将此信息与地址一起存储。您可能会尝试为该区域提供一个邮政编码,并以此查找地址,但是在繁华的市区中,这可能会非常不准确,尤其是如果您有很多客户都集中在一个邮政编码中。您需要在此处采取Tony的建议,并使用between语句查询GPS坐标数据,以获取附近的地址。 从GPS设备获取GPS数据 正如Tony已经指出的那样,您需要使用ActiveX控件,DLL或API调用之类的东西来与GPS设备进行串行通信。过去,我曾使用MS的通信ActiveX控件来获取GPS数据,但它的工作效果令人满意。 我不知道我的代码从GPS设备检索输入数据的位置。如果您以前从未编程过串行通信,那么这并不是一件容易的事。通常,您有一个OnComm事件,该事件会在传入数据上触发。如果我没记错的话,您会循环运行,直到找到EOF(文件末尾)代码或位指示数据流结束为止。如果您使用MS \'s Communications Control,则可以在此处看到一些示例代码:http://support.microsoft.com/kb/194922 我认为我必须在设置中使用4800而不是9600,但是根据所使用的设备类型,您的要求可能会有所不同。 从输入的GPS数据中提取正确的数据 第二步是从输入的GPS数据中提取所需的数据。您甚至可能发现必须对其进行更改以匹配您存储的GPS数据(请参见下文)。 在我上面的示例NMEA句子中,经度和纬度都采用以下格式:
ddmm.mmmm  
对于某些程序或API,可能必须将其转换为Degrees.Degrees,或用另一种方式写成dd.dddd。转换它的公式是:
dd.dddd = ddd + mm.mmmm/60
因此,例如,如果我们要将上面的样本数据转换为精确的经度和纬度(度),则如下所示:
3731.9404  ----> 37 + 31.9404/60 = 37.53234 degrees
10601.6986 ----> 106 + 1.6986/60 = 106.02831 degrees
以下是我在2007年写的一些函数,用于从NMEA语句中提取数据的某些部分:
Public Function ExtractLatitude(strNMEAString As String, Optional strNMEAStringType As String = \"GPRMC\") As String
    \'This function extracts the latitude from an NMEA string and converts it to Decimal Degrees (as a string).
    \'To use this function you must specify what string type you are passing in, either GPRMC or GPGGA
    Dim aryNMEAString() As String
    aryNMEAString() = Split(strNMEAString, \",\")
    Dim dblMinutes As Single, dblLatitude As Single

    Select Case strNMEAStringType

        Case \"GPRMC\"
            \'Latitude is the Number 3 place in the array (4th place in the string)
            If aryNMEAString(2) = \"A\" Then \'A represents a valid string
                dblMinutes = (CDbl(Mid(aryNMEAString(3), 3, 7)) / 60)
                dblLatitude = CDbl(Left(aryNMEAString(3), 2)) + dblMinutes
                ExtractLatitude = CStr(dblLatitude)
            End If

        Case \"GPGGA\"
            \'Latitude is the Number 2 place in the array (3rd place in the string)
            If CDbl(aryNMEAString(2)) <> 0 Then \'If string is invalid it will be 0
                dblMinutes = (CDbl(Mid(aryNMEAString(2), 3, 7)) / 60)
                dblLatitude = CDbl(Left(aryNMEAString(2), 2)) + dblMinutes
                ExtractLatitude = CStr(dblLatitude)
            End If
     End Select
End Function



Public Function ExtractLongitude(strNMEAString As String, Optional strNMEAStringType As String = \"GPRMC\") As String
    \'This function extracts the longitude from an NMEA string and converts it to Decimal Degrees (as a string).
    \'To use this function you must specify what string type you are passing in, either GPRMC or GPGGA
    Dim aryNMEAString() As String
    aryNMEAString() = Split(strNMEAString, \",\")
    Dim dblMinutes As Single, dblLongitude As Single

    Select Case strNMEAStringType

        Case \"GPRMC\"
            \'Latitude is the Number 3 place in the array (4th place in the string)
            If aryNMEAString(2) = \"A\" Then
                dblMinutes = (CDbl(Mid(aryNMEAString(5), 4, 7)) / 60)
                dblLongitude = CDbl(Left(aryNMEAString(5), 3)) + dblMinutes
                ExtractLongitude = CStr(dblLongitude)
            End If

        Case \"GPGGA\"
            \'Latitude is the Number 2 place in the array (3rd place in the string)
            If CDbl(aryNMEAString(4)) <> 0 Then
                dblMinutes = (CDbl(Mid(aryNMEAString(4), 4, 7)) / 60)
                dblLongitude = CDbl(Left(aryNMEAString(4), 3)) + dblMinutes
                ExtractLongitude = CStr(dblLongitude)
            End If
    End Select
End Function



Public Function ExtractSpeed(strGPRMC As String) As Integer
    \'Expects a GPRMC NMEA Sentence
    Dim aryGPRMC() As String, dblSpeed As Double
    aryGPRMC() = Split(strGPRMC, \",\")
    If aryGPRMC(7) <> \"\" Then dblSpeed = CDbl(aryGPRMC(7))
    \'Convert knots to MPH
    ExtractSpeed = CInt(dblSpeed * 1.15077945)
End Function



Public Function ExtractHeading(strGPRMC As String) As Double
    \'Expects a GPRMC NMEA Sentence
    Dim aryGPRMC() As String
    aryGPRMC() = Split(strGPRMC, \",\")
    If aryGPRMC(8) <> \"\" Then ExtractHeading = CDbl(aryGPRMC(8))
End Function



Public Function ExtractSatelliteCount(strGPGGA As String) As Integer
    \'Expects a GPGGA NMEA Sentence
    Dim aryGPGGA() As String
    aryGPGGA() = Split(strGPGGA, \",\")
    ExtractSatelliteCount = CInt(aryGPGGA(7))
End Function
    

要回复问题请先登录注册