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.)

War es hilfreich?

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 einenter image description here

Bild 2 Klicken Sie auf Geocode, Code wartet, bis das Zooming gestoppt wirdenter image description here

Bild 3 Code zeichnet den endgültigen Lat/Long, Benutzer auf, wenn er zufrieden ist.enter image description here

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top