我想从邮政地址得到一对坐标(经度,纬度)的

我在Excel工作簿编码VBA。我认为谷歌地球已安装并注册为COM服务器。因此,我一直在寻找一种方式来使用谷歌地球COM API来实现这一点,但是我还没有设法找到任何东西。

大多数我发现在网络上的点击率是网站程序员和是关于使用“谷歌的地理编码API”,这是JavaScript的,我认为这是不是我的情况下是可行的。

(更新:这是要做为几十/上百个地址的批处理作业作为rjmunro指出的那样,它是私有的,因此对使用的谷歌而言,让我不得不去寻找不同的服务。)

有帮助吗?

解决方案

为什么要使用谷歌地球?它不能地理编码,如果电脑不在线,如果在线,您不妨使用网络直接的API。有很多使用VBA来访问网络上的地理编码的API的例子,既与谷歌,并与其他提供者(冰,雅虎,等)。

请注意,如果这是一个私人的应用程序,而不是一个任何人都可以下载,也可能是对服务的谷歌而言,你可能需要使用不同的供应商。请参见这个问题在谷歌的帮助。

其他提示

我公司开发这个Excel插件的做你的要求,你会发现它是有用的。

有,当然,你来尊重谷歌的服务条款。

(该插件强制谷歌速率限制,因为他们的文档中指定的)。

其实我已经在VBA这样做,我给你我的解决方案:

我使用谷歌地球API(参考:地球1.0类型库) 我采取的地址信息(从细胞Tools.Range(rngGeocoderAddress))开始。我构建KML数据点,并将其发送给谷歌地球(可能没有必要),然后我执行上的地址信息的搜索。这将触发谷歌开始缩放到所得位置。

在一个循环中,我周期性地监视谷歌地球看它是否仍处于变焦到新位置的过程。一旦停止移动时,我知道这已经放大到搜索结果中,我可以使用纬度长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 输入的地址 “在这里输入的图像描述”

图片2 点击地理编码,代码等待变焦停止 “在这里输入的图像描述”

图片3 代码记录了最后的纬度/经度,用户点击记录,如果它们是满足。 “在这里输入的图像描述”

我试图循环代码以编程地理编码的许多位置。它的工作原理最好的,如果你配置谷歌地球的变焦速度要为相当快的(但不是即时)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top