API GEOLOCALIZACIÓN EN VBA CON FORMATO XML

La semana pasada escribí un post sobre la geolocalización y cómo podemos adaptar el API de Maps a Excel mediante VBA: API GEOLOCALIZACIÓN EN VBA. En ese ejemplo trabajábamos con un formato de datos de salida de Maps denominado jSON y en el que utilizábamos varias funciones para extraer información de una cadena de datos alfanumérica.

En en mismo post comentaba que en breve realizaría el mismo ejemplo pero utilizando datos de salida XML. Esto implica modificar programación en la función principal y utilizar una única función secundaría.

Antes de mostrar estas funciones os dejo el ejemplo de la respuesta a una consulta a Maps con formato XML:

api-geolocalizacion-vba-con-formato-xml

Como podéis observar existen diferencias significativas en ambos formatos (jSON y XML). Sin embargo, a la hora de programar este tipo de formato nos ayudará a reducir la función, además la he implementado de tal forma que no es necesario el tener que acudir a las referencias a activar la casilla de Microsoft XML, V6.0 dado que la función crea los objetos necesarios para realizar la consulta.

Al igual que en el post anterior conservaremos la función que modifica los caracteres especiales. Haremos referencia a la segunda hoja, que es el lugar en el que los he colocado:

Private Function Caracter_a(ByVal Destino) As String
Dim i As Integer, fin As Integer
With Sheets(2)
fin = Application.CountA(.Range("A:A"))
'Aplicamos un bucle para sustituir caracteres especiales
For i = 1 To fin
Destino = Replace(Destino, .Cells(i, 1), .Cells(i, 2))
Next
Caracter_a = Destino
End With
End Function

Ahora ya podemos insertar la función que nos traerá las coordenadas de latitud y longitud a nuestra hoja, función GeocodingXML

Function GeocodingXML(Destino As String) As String
'Declaramos las variables
Dim Consulta As String
Dim Peticion As Object
Dim Respuesta As Object
Dim iNodos As Object
'Indicamos parámetros de la consulta
Consulta = "http://maps.googleapis.com/maps/api/geocode/xml?" _
& "&address=" & Caracter_a(Destino) & "&sensor=false"
'Creamos los objetos (evitando así tener que marcar referencias en la biblioteca)
Set Peticion = CreateObject("Microsoft.XMLHTTP")
Set Respuesta = CreateObject("Msxml2.DOMDocument.6.0")
Set iNodos = Respuesta.createNode(1, "xml", "")
'Realizamos la consulta
Peticion.Open "GET", Consulta, False
Peticion.send
Respuesta.LoadXML (Peticion.responseText)
'Extraemos las coordenadas
Set iNodos = Respuesta.getElementsByTagName("location")
For i = 0 To iNodos.Length - 1
'Reemplazamos el espacio en blanco entre latitud y longitud por una coma
GeocodingXML = Replace(iNodos(i).Text, " ", ",")
Next
End Function

Si comparáis este código y el del post anterior, veréis que es mucho más corto y que el método para extraer los datos los realizamos mediante el método “getElementsByTadName” lo que nos permite extraer los datos alojados en los nodos del nombre al que hacemos referencia (“location”). Es decir latitud y longitud.

Personalmente suelo utilizamos esta función (y método) cuando trabajo realizando consultas web, es mucho más sencillo.

El resultado es el mismo que en el post anterior:

api-geolocalizacion-vba-con-formato-xml1

Pues eso ha sido todo. Ya tenemos dos UDF listas para extraer las coordenadas de cuaquier lugar que necesitemos.

Saludos 🙂

Descarga el archivo de ejemplo pulsando en: API GEOLOCALIZACIÓN EN VBA CON FORMATO XML

 
IMPORTANTE:

Tal y como le comento a lectores anteriores, google ha dejado de ofrecer consultas al API libres,. ahora solicita una KEY para poder realizar las peticiones. No obstante, también comenta que los resultados sin API pueden ofrecer informaciones “degradadas”, o lo que es lo mismo, que en ocasiones no ofrezca resultado (mostrando el error que comentas).

En concreto, esto es lo que google ha comunicado:

A partir del 11 de junio de 2018, tendrás que habilitar la facturación con cargo a una tarjeta de crédito y contar con una clave de API válida para todos los proyectos. Esto te permitirá escalar el servicio fácilmente con períodos inactivos más cortos y menos problemas de rendimiento. Además, hemos reducido las 18 API individuales a solo tres productos: Maps, Routes y Places.

En junio de 2016 anunciamos que las solicitudes sin clave de API o ID de cliente dejarían de admitirse. Este cambio se hará efectivo el 11 de junio. A partir de esa fecha, no se podrá acceder sin clave y las llamadas sin clave a las API de Street View y JavaScript de Maps devolverán mapas de baja resolución con la marca de agua “for development purposes only.” (solo con fines de desarrollo). Las llamadas sin clave a cualquiera de las API siguientes devolverá un error: Maps Static API (incluida Static Street View), Directions API, Distance Matrix API, Geocoding API, Geolocation API, Places API, Roads API y Time Zone API.”

Aquí podréis leer sobre el tema: ENLACE NOTICIA

A pesar de ello, no voy a eliminar el post, dado que la programación puede ser interesante para otros proyectos o puede que deseéis modificarla para introducir la KEY (para lo que recomiendo que os pongáis en contacto con Google para proceder con total seguridad a introducir datos de tarjeta de crédito y habilitar la facturación).

Anuncios

8 pensamientos en “API GEOLOCALIZACIÓN EN VBA CON FORMATO XML

    • Hola Felipe:

      Creo que el problema es que has roto las referencias a la función “caracter_a” que se encuentra en la hoja2.

      Debes tener en cuenta siempre esa hoja, dado que es ahí donde la función lee parte de los datos, si has modificado el archivo inicial es probable que este sea el problema.

      Si te sigue mostrando ese error, puedes enviarme el archivo a excelsignum@yahoo.es

      Saludos.

      Me gusta

  1. Excelente articulo, gracias por el articulo, pero necesito ver si es posible si apartir de una ubicacion, direccion me genera coordenadas geograficas

    Me gusta

  2. Buenas tardes Segu
    Me he bajado los dos ficheros que compartes api
    El primero he cambiado a un nombre de calle nueva en “B2” y me da las coordenadas perfectas
    Pero luego he intentado poner otra direccion en “B3”, “B4″….. y me sale error, pero si vuelvo a poner la misma direccion que la “B2”, si me vuelve a dar las mismas coordenadas, intento también cambiar otra direccion en “B2” y ya me sale error
    Serias tan amable que me puede faltar de hacer?
    En el segundo fichero para XML, he probado también pero este las coordenadas me lo deja en blanco.

    Me gusta

    • Hola Chema,

      Posiblemente sea un problema de tiempo de respuesta de la consulta que se envia a maps y el resultado que trae es un blanco. Por otra parte, google está haciendo cambios de forma que está obligando a todos los usuarios del API a tener una KEY para realizar consultas.

      Creo que por ahora no ha cortado el acceso, sino que lo hace de forma itinerante. Es algo que tengo que investigar y verificar.

      Por otra parte, intenta en las direcciones especificar bien la dirección y volver a pasar la función otra vez, dado que es posible que ya acceda a los datos.

      Saludos.

      Me gusta

  3. Buenas tardes Segu como estás?, Primero agradecerte este gran aporte y pues te cuento,lo había descargado la semana pasada (Jueves 4 de octubre) y me funcionó muy bien, pero hoy que reviso nuevamente ya no funciona, me deja los espacios en blanco 😦
    Lo de la dirección lo intente pero no funciona, y si, me fijé en la página de google API y ya aparece como si se tuviera que poner una “KEY”, de todas formas estaré pendiente de cualquier respuesta o si en definitiva ya no se podrá utilizar la macro con esa página, un saludo!

    Me gusta

¿Te ha gustado?, Realiza un comentario.

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.