Geokodierung mit Google Earth
-
19-09-2019 - |
Frage
Ich möchte ein Paar Koordinaten (Längengrad, Breitengrad) aus einer Postanschrift erhalten.
Ich kodiere VBA in einem Excel -Arbeitsbuch. Ich kann annehmen, dass Google Earth als COM -Server installiert und registriert ist. Daher habe ich nach einer Möglichkeit gesucht, die Google Earth Com -API zu nutzen, um dies zu erreichen, aber ich habe es nicht geschafft, etwas zu finden.
Die meisten Treffer, die ich im Web gefunden habe, sind für Webprogrammierer und die Verwendung der "Google Geocoding -API", die JavaScript ist, die meiner Meinung nach für meinen Fall nicht möglich ist.
(Update: Dies sollte als Stapeljob für Dutzende/Hunderte von Adressen erfolgen. Wie RJMunro betonte, ist es privat und somit gegen die Nutzungsbedingungen von Google, also musste ich nach einem anderen Service suchen.)
Lösung
Warum möchten Sie Google Earth verwenden? Es kann nicht Geocode, wenn der Computer nicht online ist, und wenn er online ist, können Sie die Web -APIs auch direkt verwenden. Es gibt Viele Beispiele Verwenden Sie VBA zum Zugriff auf Geocoding -APIs im Web, sowohl mit Google als auch mit anderen Anbietern (Bing, Yahoo usw.).
Beachten Sie, dass dies, wenn dies für eine private Anwendung ist, und nicht für eine, die jeder herunterladen kann, dies möglicherweise gegen die Google -Nutzungsbedingungen steht, und Sie müssen möglicherweise einen anderen Anbieter verwenden. Sehen diese Frage in Googles FAQ.
Andere Tipps
ich entwickelte Dieser Excel -Addin Um Ihre Anfrage zu tun, finden Sie es möglicherweise nützlich.
Es liegt natürlich an Ihnen, Googles TOS zu respektieren.
(Der Addin erzwingt die Google -Ratengrenzen, wie in ihrer Dokumentation angegeben).
Ich habe das tatsächlich in VBA gemacht, ich gebe Ihnen meine Lösung:
Ich benutze die Google Earth -API (Referenz: Earth 1.0 Typbibliothek) Ich beginne zunächst die Adressinformationen (von Cell Tools.Range (RNGGGGGEOCOCERADDRESS)). Ich konstruiere KML -Daten für den Punkt und sende sie an Google Earth (wahrscheinlich nicht notwendig). Dann führe ich eine Suche nach den Adressinformationen aus. Dadurch wird Google ausgelöst, um den resultierenden Standort zu zoomen.
In einer Schleife überwache ich in regelmäßigen Abständen Google Earth, um festzustellen, ob es sich noch um einen neuen Standort vergrößert. Sobald es aufgehört hat, sich zu bewegen, weiß ich, dass es dem Suchergebnis vergrenzt ist, und ich kann den Lat Long mit GetPointonterrainfromScreencoords (0,0) erfassen.
Das Endergebnis ist, dass ich Google Earth verwendet habe, um die Adresse zu Geocode.
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
Hier sind einige Screenshots, die zeigen, wie ich es mit einer Benutzeroberfläche zum Laufen gebracht habe:
Bild 1 Gib eine Adresse ein
Bild 2 Klicken Sie auf Geocode, Code wartet, bis das Zooming gestoppt wird
Bild 3 Code zeichnet den endgültigen Lat/Long, Benutzer auf, wenn er zufrieden ist.
Ich habe versucht, den Code programmlich an viele Standorte zu schleifen. Es funktioniert am besten, wenn Sie die Zoomgeschwindigkeit von Google Earth so konfigurieren, dass sie so schnell (aber nicht augenblicklich) ist.