Geocoding utilizzando Google Earth
-
19-09-2019 - |
Domanda
Mi piacerebbe ottenere un paio di coordinate (longitudine, latitudine) da un indirizzo postale.
sto codifica VBA in una cartella di lavoro di Excel. Posso supporre che Google Earth sia installato e registrato come server COM. Così ho cercato un modo per utilizzare l'API di Google Earth COM per raggiungere questo obiettivo, però io non sono riuscito a trovare nulla.
La maggior parte dei colpi che ho trovato sul web sono per i programmatori web e sono sull'utilizzo del "Google API geocoding", che è JavaScript, che credo non è fattibile per il mio caso.
(Update: Questo doveva essere fatto come un processo batch per decine / centinaia di indirizzi Come rjmunro ha sottolineato, è privata e quindi contro i termini di Google di utilizzo, così ho dovuto cercare un servizio diverso..)
Soluzione
Perché vuoi usare Google Earth? Non può geocode se il computer non è in linea, e se è online, si può anche utilizzare il web APIS direttamente. Ci sono un sacco di esempi di utilizzare VBA per accedere alle API di geocodifica sul web, entrambi con Google e con altri fornitori (Bing, Yahoo, ecc.).
Si noti che se questo è per un'applicazione privato, piuttosto che uno che chiunque può scaricare, può essere contro i termini di servizio di Google, e potrebbe essere necessario utilizzare un provider diverso. Vedere questa domanda FAQ di Google.
Altri suggerimenti
questo Excel Addin per fare ciò che la vostra richiesta, si possono trovare utile.
E ', naturalmente, spetta a voi per rispettare TOS di Google.
(Il componente aggiuntivo impone limiti di frequenza di Google, come specificato nella loro documentazione).
In realtà ho fatto questo in VBA, ti do la mia soluzione:
Io uso la terra API di Google (Riferimento: Terra 1.0 Type Library) Comincio prendendo le informazioni relative all'indirizzo (da cellulare Tools.Range (rngGeocoderAddress)). Costruisco dati KML per il punto e inviarlo a Google Earth (probabilmente non necessario), ho quindi eseguire una ricerca sulle informazioni di indirizzo. Questo attiverà google per avviare lo zoom la risultante di posizione.
In un ciclo, a monitorare periodicamente Google Earth per vedere se è ancora in fase di zoom in una nuova posizione. Una volta che ha smesso di muoversi, lo so che è ingrandita al risultato della ricerca, e posso catturare il Lat Long utilizzando GetPointOnTerrainFromScreenCoords (0,0)
Il risultato finale è che ho usato Google Earth per geocoding l'indirizzo.
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
Ecco alcuni screen-shots che mostrano come ho fatto funzionare con un'interfaccia utente:
Immagine 1 Inserire indirizzo
Immagine 2 Clicca Geocode, codice attende per lo zoom per fermare
Immagine 3 Codice registra il finale Lat / Long, utente fa clic record se sono soddisfatti.
Ho provato loop il codice per eseguire il geocoding molti luoghi programatically. Funziona meglio se si configura la velocità dello zoom di Google Earth di essere il più abbastanza veloce (ma non istantanea)