Geocodificación uso de Google Earth
-
19-09-2019 - |
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..)
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
Imagen 2 Haga clic Geocode, código espera para el zoom para detener
Imagen 3 Código registra el final de la latitud / longitud, usuario hace clic en registro si están satisfechos.
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)