Pergunta

Eu gostaria de obter um par de coordenadas (longitude, latitude) de um endereço postal.

Estou codificando o VBA em uma pasta de trabalho do Excel. Posso assumir que o Google Earth está instalado e registrado como servidor com. Assim, tenho procurado uma maneira de usar a API do Google Earth para conseguir isso, mas não consegui encontrar nada.

A maioria dos hits que encontrei na Web é para programadores da Web e se trata de usar a "API do Google Geocoding", que é JavaScript, que eu acho que não é viável para o meu caso.

(Atualização: isso deveria ser feito como um trabalho em lote para dezenas/centenas de endereços. Como Rjmunro apontou, é privado e, portanto, contra os Termos de Uso do Google, por isso tive que procurar um serviço diferente.)

Foi útil?

Solução

Por que você quer usar o Google Earth? Ele não pode geocódigo se o computador não estiver online e, se estiver online, você também pode usar as APIs da Web diretamente. Há Muitos exemplos de usar o VBA para acessar as APIs de geocodificação na Web, tanto com o Google quanto com outros fornecedores (Bing, Yahoo, etc.).

Observe que, se isso for para um aplicativo privado, em vez de um que qualquer um pode baixar, pode ser contra os Termos de Serviço do Google e pode ser necessário usar um provedor diferente. Ver essa questão nas perguntas frequentes do Google.

Outras dicas

eu desenvolvi Este addin Excel Para fazer o seu pedido, você pode achar útil.

É claro que você respeita os TOs do Google.

(O Addin aplica os limites da taxa do Google, conforme especificado em sua documentação).

Na verdade, eu fiz isso no VBA, vou te dar minha solução:

Eu uso a API do Google Earth (Referência: Biblioteca do Tipo Earth 1.0) Começo obtendo as informações do endereço (do Cell Tools.Range (rnggeocoderaddress)). Construo dados KML para o ponto e o envio para o Google Earth (provavelmente não é necessário), executo uma pesquisa nas informações do endereço. Isso acionará o Google a começar o zoom para o local resultante.

Em um loop, monitoro periodicamente o Google Earth para ver se ele ainda está em processo de zoom para um novo local. Depois de parar de se mover, eu sei que ele aumentou o resultado do resultado da pesquisa e posso capturar o Lat por muito tempo usando o getponterRrain noScreencOords (0,0)

O resultado final é que usei o Google Earth para geocodificar o endereço.

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

Aqui estão algumas fotos de tela mostrando como eu o fiz funcionar com uma interface do usuário:

Imagem 1 Insira um endereçoenter image description here

Imagem 2 Clique em Geocode, o código aguarda o zoom para pararenter image description here

Imagem 3 O código registra o Lat/Long Final, os cliques do usuário registram se forem satisfeitos.enter image description here

Eu tentei loops do código para geocodificar muitos locais programaticamente. Funciona melhor se você configurar a velocidade de zoom do Google Earth para ser tão rápido (mas não instantâneo)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top