如何获取地址的纬度和经度?

Posted

技术标签:

【中文标题】如何获取地址的纬度和经度?【英文标题】:How to get Latitude and Longitude for Addresses? 【发布时间】:2014-03-03 09:11:03 【问题描述】:

我目前正在处理一个数据列表,我的其中一列数据是列表的地址。我计划在谷歌地图上绘制我的每个地址,但我想避免手动将地址粘贴到谷歌来获取参数。我需要经度,纬度。我的 Excel 表(或者我在 Google Docs 电子表格中有它)包含大约 500 个地址。

所以我希望有办法自动这样做?

【问题讨论】:

【参考方案1】:

感谢这篇好文章 http://policeanalyst.com/using-the-google-geocoding-api-in-excel/

Function GoogleGeocode(address As String) As String
Dim strAddress As String
Dim strQuery As String
Dim strLatitude As String
Dim strLongitude As String

strAddress = URLEncode(address)

'Assemble the query string
strQuery = "http://maps.googleapis.com/maps/api/geocode/xml?"
strQuery = strQuery & "address=" & strAddress 
strQuery = strQuery & "&sensor=false"

'define XML and HTTP components
Dim googleResult As New MSXML2.DOMDocument
Dim googleService As New MSXML2.XMLHTTP
Dim oNodes As MSXML2.IXMLDOMNodeList
Dim oNode As MSXML2.IXMLDOMNode

'create HTTP request to query URL - make sure to have
'that last "False" there for synchronous operation

googleService.Open "GET", strQuery, False
googleService.send
googleResult.LoadXML (googleService.responseText)

Set oNodes = googleResult.getElementsByTagName("geometry")

If oNodes.Length = 1 Then
For Each oNode In oNodes
  strLatitude = oNode.ChildNodes(0).ChildNodes(0).Text
  strLongitude = oNode.ChildNodes(0).ChildNodes(1).Text
  GoogleGeocode = strLatitude & "," & strLongitude
 Next oNode
 Else
 GoogleGeocode = "Not Found (try again, you may have done too many too fast)"
 End If
 End Function


Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String
Dim StringLen As Long: StringLen = Len(StringVal)

If StringLen>0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String

If SpaceAsPlus Then Space = "+" Else Space = "%20"

For i = 1 To StringLen
  Char = Mid$(StringVal, i, 1)  
  CharCode = Asc(Char)

  Select Case CharCode
  Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
    result(i) = Char
  Case 32
    result(i) = Space
  Case 0 To 15
    result(i) = "%0" & Hex(CharCode)
  Case Else
    result(i) = "%" & Hex(CharCode)
  End Select
Next i
URLEncode = Join(result, "")
End If
End Function

【讨论】:

【参考方案2】:

您可以在您的 google 电子表格中添加一个小的 googl 应用程序脚本,这样它就可以为您完成这项工作。 here 演示(添加地址,它将为您进行地理编码)。 并在代码下方执行地理编码:

function getLatLong(adress) 
  try
    if(adress=="")return("");
    var geo = Maps.newGeocoder().geocode(adress);
    if(geo.status=="OK")
      var lng = geo.results[0].geometry.viewport.southwest.lng;
      var lat = geo.results[0].geometry.viewport.southwest.lat;
      return([lat,lng]);
    
    else
      return("error");
    
  
  catch(err)
    return(err);
  

【讨论】:

如何避免此代码出现“每秒为此 Google 用户帐户调用太多次脚本”错误? @AlexKowalczyk-FoxyTasks 您可以将脚本相互化:您可以让它为一整列数据运行,而不是让它为每一行运行。 (这可以通过从处理所有列的函数对脚本应用循环来完成) @AlexKowalczyk-FoxyTasks 这里是一个例子:function handleAdressList(adress) var results = []; for(var i in adress) results.push(getLatLong(adress[i][0])); 返回结果; 【参考方案3】:

SmartyStreets 提供美国和国际地址的地理编码。它非常易于使用 - 将您的列表粘贴到他们的网络工具中,它会在几秒钟内返回纬度和经度。还有其他服务可以以类似的方式返回纬度/经度数据;我最熟悉 SmartyStreets,因为我在那里工作。

另外请记住,将地址粘贴到 Google 地图不一定会为您提供准确的信息,因为 Google 不会首先验证地址; SmartyStreets 确实如此,可确保您获得的是关于真实位置的数据,而不是 Google 的最佳猜测。

您可能想要查看的其他解决方案:AddressDoctor、Loqate 或其他“国际地址地理编码”提供商(快速的 Google 搜索会出现一些不错的选择)。

【讨论】:

Smarty street 没有响应我创建帐户的请求你知道它是否仍然有效吗? 嘿,OVO - 是的,SmartyStreets 仍在工作。如果您在设置帐户时遇到问题,可以从我们的联系页面给我们打电话 - www.smartystreets.com/contact【参考方案4】:

我建议不要注入代码,而是将数据传输到谷歌电子表格,并通过很棒的表格插件包含地理编码。从那时起,只需将地址放在一个列中,然后选择地址列进行地理编码

【讨论】:

以上是关于如何获取地址的纬度和经度?的主要内容,如果未能解决你的问题,请参考以下文章

如何从输入地址获取纬度和经度

如何从 windows phone 中的纬度和经度值获取地址?

如何从C#中的地址获取纬度和经度

如何在地理服务器中输入地址时获取纬度和经度

如果我们在 Android 中使用位置 API 给出纬度和经度,如何获取地址

如何使用地址和纬度/经度获取世界上所有的公园