使用 Google 地球进行地理编码

问题描述 投票:0回答:4

我想从邮政地址获取一对坐标(经度、纬度)。

我正在 Excel 工作簿中编写 VBA 代码。我可以假设 Google Earth 已安装并注册为 COM 服务器。因此,我一直在寻找一种使用 Google Earth COM API 来实现这一目标的方法,但是我还没有找到任何东西。

我在网络上找到的大多数点击都是针对网络程序员的,并且是关于使用“Google 地理编码 API”(即 JavaScript)的,我认为这对我的情况不可行。

(更新:这是作为数十/数百个地址的批处理作业来完成的。正如 rjmunro 指出的那样,它是私有的,因此违反了 Google 使用条款,所以我不得不寻找不同的服务。)

vba excel geocoding latitude-longitude google-earth
4个回答
2
投票

您为什么要使用 Google 地球?如果计算机不在线,它无法进行地理编码,如果在线,您也可以直接使用Web api。有很多使用 VBA 访问网络上的地理编码 api 的示例,包括 Google 和其他提供商(Bing、Yahoo 等)。

请注意,如果这是一个私人应用程序,而不是任何人都可以下载的应用程序,则可能违反 Google 服务条款,并且您可能需要使用其他提供商。请参阅 Google 常见问题解答中的此问题


0
投票

我开发了这个 Excel 插件来满足您的要求,您可能会发现它很有用。

当然,您需要遵守 Google 的服务条款。

(插件强制执行 Google 速率限制,如其文档中所述)。


0
投票

我实际上已经在VBA中完成了这个,我会给你我的解决方案:

我使用google Earth API(参考:Earth 1.0 Type Library) 我首先获取地址信息(来自单元格 Tools.Range(rngGeocoderAddress))。我为该点构建 KML 数据并将其发送到 google Earth(可能没有必要),然后对地址信息执行搜索。这将触发谷歌开始缩放到结果位置。

在一个循环中,我定期监视谷歌地球,看看它是否仍在缩放到新位置的过程中。一旦它停止移动,我知道它已经缩放到搜索结果,并且我可以使用 GetPointOnTerrainFromScreenCoords(0,0)

捕获经纬度

最终结果是我使用谷歌地球对地址进行了地理编码。

Public Sub LookUpAddress_Click()
    Dim GEI As ApplicationGE
    Dim PointOnTerrain As PointOnTerrainGE
    Dim Search As SearchControllerGE
    Dim KMLData As String
    Dim row As Long

    'Get the row of the location selected to look up'
    With ddGeocoderID()
        If .listCount <= 1 Then Exit Sub
        row = .ListIndex + 1
    End With

    Set GEI = GEInit()
    If GEI Is Nothing Then Exit Sub

    KMLData = "<?xml version=""1.0"" encoding=""UTF-8""?>" & _
            "<kml xmlns=""http://www.opengis.net/kml/2.2"">" & _
            "<Placemark>" & _
                "<name>" & ddGeocoderID().List(ddGeocoderID().ListIndex) & "</name>" & _
                "<visibility>1</visibility>" & _
                "<open>1</open>" & _
                "<description>" & "<![CDATA[" & Tools.Range(rngGeocoderDescription) & "]]></description>" & _
                "<address>" & Tools.Range(rngGeocoderAddress) & "</address>" & _
            "</Placemark>" & _
            "</kml>"
    GEI.LoadKmlData KMLData

    Set Search = GEI.SearchController()
    Call Search.Search(Tools.Range(rngGeocoderAddress))
    Dim resul As Variant
    Set resul = Search.GetResults()
    Dim lat As Double, lon As Double, prevlat As Double, prevlon As Double, checkChange As Double
    Dim steady As Boolean
    steady = False: checkChange = -1
    lat = 0: lon = 0: prevlat = -1: prevlon = -1
    While Not steady
        Set PointOnTerrain = GEI.GetPointOnTerrainFromScreenCoords(0, 0)
        lat = PointOnTerrain.Latitude
        lon = PointOnTerrain.Longitude
        lblGeoedLat().Caption = sigFigs(lat, 8)
        lblGeoedLong().Caption = sigFigs(lon, 8)
        DoEvents
        If (checkChange = 100) Then
            If (lat = prevlat And lon = prevlon) Then steady = True
            prevlat = lat: prevlon = lon
            checkChange = -1
        End If
        checkChange = checkChange + 1
        Sleep 10
    Wend
End Sub

以下是一些屏幕截图,展示了我如何使其与 UI 配合使用:

图像 1 输入地址 enter image description here

图像 2 单击地理编码,代码等待缩放停止 enter image description here

图3 代码记录最终的纬度/经度,用户如果满意则点击记录。 enter image description here

我尝试循环代码以编程方式对许多位置进行地理编码。如果您将谷歌地球的缩放速度配置得相当快(但不是瞬时的),效果最好


0
投票

此代码可以用于 Access 吗?

© www.soinside.com 2019 - 2024. All rights reserved.