2010-11-11 75 views
1

我相信Google API可以让您获得给定地址的坐标。然而,我发现的大多数(或者应该说全部)例子都不适用于vb。通常这是一些JavaScript例子,只是让我感到困惑。从地址获取GPS坐标的代码(VB6/VBA/VBScript)

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

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 

回答

3

这应该做的工作。你需要通过工具添加一个引用到MSXML6库(微软XML,V6.0)>在Excel中引用

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和所述查询的参数使用谷歌API
  • 治疗的响应为XML文档,并使用XPath提取所需结果

显然第在我的代码中没有任何错误处理,但它应该让你知道你需要使用API​​。你一定要自己咨询API documentation了解速率限制等

+0

+1表示技术的正确性,-1表示可能违反Google的地理编码服务[条款和条件](https://developers.google.com/maps/documentation/geocoding/)。 Quote:*地理编码API只能与Google地图一起使用;不允许在[Google]地图上显示地理编码结果。* – MarkJ 2013-08-12 14:49:25

0

感谢您的代码!它效果很好。感谢您提高费率限制。以下是Google的说法:

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

+0

请特别注意,您必须在Google地图上显示结果。我希望一旦你运行了VB,你可以在谷歌地图上显示结果,而无需其他任何东西:) – MarkJ 2013-08-12 14:50:47