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

È stato utile?

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 entrare descrizione dell'immagine qui

Immagine 2 Clicca Geocode, codice attende per lo zoom per fermare entrare descrizione dell'immagine qui

Immagine 3 Codice registra il finale Lat / Long, utente fa clic record se sono soddisfatti. entrare descrizione dell'immagine qui

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top