Pregunta

Me gustaría conseguir un par de coordenadas (longitud, latitud) de una dirección postal.

estoy cifrando VBA en un libro de Excel. Puedo suponer que Google Earth está instalado y registrado como servidor COM. Así pues, he estado buscando una manera de utilizar la API de Google Earth COM para lograr esto, sin embargo no he podido encontrar nada.

La mayoría de los éxitos que he encontrado en la web son para los programadores web y son sobre el uso del "Google API de geocodificación", que es JavaScript, que creo que no es factible para mi caso.

(Actualización: Esta debía ser hecho como proceso por lotes de decenas / cientos de direcciones Como rjmunro señaló, es privada y por lo tanto en contra de los términos de Google de uso, así que tuve que buscar un servicio diferente..)

¿Fue útil?

Solución

¿Por qué desea utilizar Google Earth? No puede geocode si el equipo no está en línea, y si es en línea, usted puede también utilizar la web directamente apis. Hay un montón de ejemplos de usando VBA para acceder a las API de codificación geográfica en la web, ambos con Google y con otros proveedores (Bing, Yahoo, etc.).

Tenga en cuenta que si se trata de una aplicación privada, en lugar de uno que cualquiera puede descargar, puede estar en contra de los términos de servicio de Google, y es posible que tenga que utilizar un proveedor diferente. Ver esta pregunta en FAQ de Google.

Otros consejos

este complemento de Excel para hacer lo que su solicitud, puede que le resulte útil.

Es, por supuesto, depende de usted para respetar condiciones de servicio de Google.

(El complemento hace cumplir los límites de frecuencia de Google, como se especifica en la documentación).

De hecho, he hecho esto en VBA, te voy a dar mi solución:

Yo uso de la API de google earth (Referencia: Tierra 1.0 Type Library) Comienzo tomando la información de la dirección (de células Tools.Range (rngGeocoderAddress)). Construyo datos KML para el punto y enviarlo a Google Earth (probablemente no es necesario), entonces yo haga una búsqueda en la información de la dirección. Esto hará que Google para iniciar el zoom de la resultante de ubicación.

En un bucle, superviso periódicamente google tierra para ver si todavía está en el proceso de zoom a una nueva ubicación. Una vez que se ha dejado de moverse, sé que se ha enfocado a los resultados de búsqueda, y puedo capturar el Lat Long usando GetPointOnTerrainFromScreenCoords (0,0)

El resultado final es que he utilizado Google Earth para geocodificar la dirección.

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

Aquí hay algunas capturas de pantalla que muestran la forma en que lo hizo funcionar con una interfaz de usuario:

Imagen 1 Introducir dirección introducir descripción de la imagen aquí

Imagen 2 Haga clic Geocode, código espera para el zoom para detener introducir descripción de la imagen aquí

Imagen 3 Código registra el final de la latitud / longitud, usuario hace clic en registro si están satisfechos. introducir descripción de la imagen aquí

He intentado rizando el código para codificar geográficamente muchos lugares programáticamente. Funciona mejor si se configura la velocidad de zoom de Google Earth sea lo bastante rápido (pero no instantánea)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top