Geocodificação usando o Google Earth
-
19-09-2019 - |
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.)
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ço
Imagem 2 Clique em Geocode, o código aguarda o zoom para parar
Imagem 3 O código registra o Lat/Long Final, os cliques do usuário registram se forem satisfeitos.
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)