【问题标题】:Code to Get GPS Coordinates from Address (VB/VB.Net/VBA/VBScript)从地址获取 GPS 坐标的代码 (VB/VB.Net/VBA/VBScript)
【发布时间】:2010-11-11 19:34:25
【问题描述】:

我相信 Google API 允许您获取给定地址的坐标。但是,我发现的大多数(或者我应该说全部)示例都不适用于 vb。通常是一些 javascript 示例让我感到困惑。

这是我使用地理编码服务的一些代码。这很好用。只是我想自己直接查询谷歌地图。

Public Function fgGetLatAndLongUsingAddress(sAddress As String) As String

    'This function works best with a complete address including the zip code
    Dim sResponseText As String, sReturn As String

    sReturn = "none"

    Dim objHttp As Object, sQuery As String
    sQuery = "http://rpc.geocoder.us/service/csv?address=" & Replace(sAddress, " ", "+")
    Set objHttp = CreateObject("Msxml2.ServerXMLHTTP")
    objHttp.Open "GET", sQuery, False
    objHttp.send
    sResponseText = objHttp.ResponseText
    gsLastLatLongResponseText = sResponseText
    Set objHttp = Nothing


    If Len(sResponseText) > 0 Then
        If InStr(sResponseText, "Bad Request") > 0 Then
            'Do Nothing
        ElseIf InStr(sResponseText, "couldn't find this address") > 0 Then
            'Do Nothing
        Else
            If InStr(sResponseText, vbCrLf) > 0 Then
                'We got more than one result
            End If
            If InStr(sResponseText, ",") > 0 Then
                Dim aryInfo() As String
                aryInfo = Split(sResponseText, ",")
                sReturn = aryInfo(0) & "," & aryInfo(1)
            End If
        End If
    End If


    fgGetLatAndLongUsingAddress = sReturn

End Function

【问题讨论】:

    标签: vba geocode google-geocoder


    【解决方案1】:

    这应该可以完成工作。您需要通过工具 > Excel 中的引用添加对 MSXML6 库(Microsoft XML,v6.0)的引用

    Option Explicit
    
    Function getGoogleMapsGeocode(sAddr As String) As String
    
    Dim xhrRequest As XMLHTTP60
    Dim sQuery As String
    Dim domResponse As DOMDocument60
    Dim ixnStatus As IXMLDOMNode
    Dim ixnLat As IXMLDOMNode
    Dim ixnLng As IXMLDOMNode
    
    
    ' Use the empty string to indicate failure
    getGoogleMapsGeocode = ""
    
    Set xhrRequest = New XMLHTTP60
    sQuery = "http://maps.googleapis.com/maps/api/geocode/xml?sensor=false&address="
    sQuery = sQuery & Replace(sAddr, " ", "+")
    xhrRequest.Open "GET", sQuery, False
    xhrRequest.send
    
    Set domResponse = New DOMDocument60
    domResponse.loadXML xhrRequest.responseText
    Set ixnStatus = domResponse.selectSingleNode("//status")
    
    If (ixnStatus.Text <> "OK") Then
        Exit Function
    End If
    
    Set ixnLat = domResponse.selectSingleNode("/GeocodeResponse/result/geometry/location/lat")
    Set ixnLng = domResponse.selectSingleNode("/GeocodeResponse/result/geometry/location/lng")
    
    getGoogleMapsGeocode = ixnLat.Text & ", " & ixnLng.Text
    
    End Function
    

    与您的示例唯一真正的区别是:

    • 更改查询的 URL 和参数以使用 Google API
    • 将响应视为 XML 文档并使用 XPath 提取所需的结果

    显然,我的代码中没有任何错误处理,但它应该让您了解使用 API 需要什么。你肯定想自己咨询API documentation,了解速率限制等

    【讨论】:

    • +1 表示技术正确性,-1 表示可能违反 Google 的地理编码服务 terms and conditions。 Quote: Geocoding API 只能与谷歌地图一起使用;禁止在不显示在 [Google] 地图上的情况下对结果进行地理编码。
    【解决方案2】:

    感谢您提供的代码!它工作得很好。感谢您对速率限制的提醒。以下是谷歌要说的:

    使用 Google 地理编码 API 的查询限制为每天 2,500 个地理定位请求。 (Google Maps API Premier 的用户每天最多可以执行 100,000 个请求。)强制执行此限制是为了防止滥用和/或重新利用 Geocoding API,并且此限制将来可能会更改,恕不另行通知。此外,我们强制执行请求速率限制以防止滥用服务。如果您超过 24 小时限制或以其他方式滥用服务,Geocoding API 可能会暂时停止为您工作。如果您继续超过此限制,您对 Geocoding API 的访问可能会被阻止。 注意:Geocoding API 只能与谷歌地图一起使用;禁止在未在地图上显示的情况下对结果进行地理编码。有关允许使用的完整详细信息,请参阅 Maps API 服务许可限制条款。

    【讨论】:

    • 请特别注意,您必须在 Google 地图上显示结果。我希望一旦你运行了 VB,你就可以在谷歌地图上显示结果,而不是其他任何地方:)
    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 2012-07-04
    • 2020-01-16
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多