Archivo de la etiqueta: longitud

api-geolocalizacion-vba-con-formato-xml

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

 

Anuncios
api-geolocalizacion-en-vba4

API GEOLOCALIZACIÓN EN VBA

Uno de los post que tiene más visitas en Excel Signum es API MATRIZ DE DISTANCIAS, donde obtenemos el tiempo y la distancia a partir de un origen y un destino, realizando la petición de información a Google Maps.

Hace unos días, un lector me solicitó ayuda para conseguir los datos de geolocalización  de una serie de direcciones (latitud y longitud) y me pareció interesante para realizar una nueva entrada basada en esta consulta.

Antes de nada, comentar que existen varias alternativas para realizar este trabajo, todas ellas pasando por el API de Google Maps de geolocalización. Para este ejemplo usaré el API con formato de datos de salida jSON (en breve os mostraré otra versión con formato XML). Si queréis leer acerca del API y sus especificaciones, podáis hacerlo aquí: Google Maps Geocoding API

Utilizaremos un caso práctico para ilustrar el ejercicio, imaginad que hemos previsto realizar un pequeño viaje y queremos visitar: La Plaza Mayor (Chinchón), El Palacio Real (Aranjuez) y el Alcázar de Toledo. El punto de partida en el que hemos quedado es la Plaza de Santa Ana (Madrid), y queremos obtener las coordenadas de dichos lugares a partir de sus direcciones. Lo indicamos de la siguiente forma en nuestra hoja Excel:

api-geolocalizacion-en-vba

La idea es crear una función que capture el elemento de la columna B (Dirección) y nos devuelva en la columna C las coordenadas de latitud y longitud. Para ello vamos a utilizar 3 funciones. Una será la principal y las otras dos serán secundas pero muy importantes.

Antes de montar la función principal vamos a ver las otras, la primera es Carácter_e:

Private Function Caracter_e(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_e = Destino
End With
End Function

Con esta función, a la hora de pasar los parámetros a Maps, convertimos aquellos caracteres especiales  (ejem: tildes, eñes, etc) que normalmente crear errores a caracteres válidos. Los parámetros los he puesto en la segunda hoja, (en caso de que necesitéis añadir alguno más solo tenéis que indicarlo como el resto):

api-geolocalizacion-en-vba1

La otra función que vamos a utilizar es aquella que extraerá de la cadena de datos solo los números, las comas, los puntos y los guiones.

Public Function Numeros(LatLong As String)
Dim i As Double, j As Double
Dim num As Variant
'extraemos números, comas, guiones y puntos de la cadena alfanumérica
With Sheets(1)
For i = Len(LatLong) To 1 Step -1
If IsNumeric(Mid(LatLong, i, 1)) Or Mid(LatLong, i, 1) = "," Or Mid(LatLong, i, 1) = "-" Or Mid(LatLong, i, 1) = "." Then
j = j + 1
num = Mid(LatLong, i, 1) & num
End If
If j = 1 Then num = (Mid(num, 1, 1))
Next i
Numeros = num
End With
End Function

Esta función (Numeros) es necesaria dado que cuando extraemos los datos mediante la función principal, en formato jSON, tendremos que extraer la información de Latitud y Longitud. Este es el formato de salida:

api-geolocalizacion-en-vba2

Ahora que ya hemos visto estas dos funciones os dejo la función principal Geocoding()

Function Geocoding(Destino As String) As String
Dim Consulta As String
Dim ObjetoXML As Object
Dim Peticion As String
Dim Marcador As Long
Dim sCadena As String
Dim LatLong As String
'Pasamos parámetros de la consulta y aplicamos función caracter_e
'por su tenemos caracteres especiales
Consulta = "http://maps.googleapis.com/maps/api/geocode/json?" _
& "&address=" & Caracter_e(Destino) & "&sensor=false"
'Enviamos la consulta y recibimos respuesta
Set ObjetoXML = CreateObject("Microsoft.XMLHTTP")
ObjetoXML.Open "GET", Consulta, False
ObjetoXML.send
Peticion = ObjetoXML.responseText
'extraemos los datos de latitud y longitud que necesitamos
'de la cadena que hemos obtenido
Marcador = InStr(1, Peticion, "location")
sCadena = Application.WorksheetFunction.Trim(Mid(Peticion, Marcador, 120))
'Para extraer las coordenadas usamos la función Números para que extraiga numeros, puntos, comas y guiones
LatLong = Numeros(Mid(sCadena, InStr(1, sCadena, "{"), (InStr(1, sCadena, "}") - InStr(1, sCadena, "{") + 1)))
'Obtenemos el resultado
Geocoding = LatLong
'Liberamos variable ObjetoXML
Set ObjetoXML = Nothing
End Function

Una vez que tenemos la cadena de texto, solo tendremos que realizar algunos ajustes para extraer los datos que necesitamos y que realizamos con diferentes funciones y recogeremos en las variables Marcador, sCadena y  LatLong

El resultado es el siguiente:

api-geolocalizacion-en-vba3

El botón que he colocado en la página es para visualizar mediante una sencilla macro la ruta que queremos realizar tomando como datos los códigos, está en el módulo2 de la hoja:

Sub Mapa()
Dim URL As String
With Sheets(1)
'Componemos la url para mostrar el mapa con la ruta.
URL = "https://www.google.com/maps/dir/" & .Range("C2") & "/" & .Range("C3") & "/" & .Range("C4") & "/" & .Range("C5")
ActiveWorkbook.FollowHyperlink URL, NewWindow:=False
End With
End Sub

Y la información que pasamos a maps nos muestra el siguiente mapa:

api-geolocalizacion-en-vba4

Como habéis podido comprobar, la información es correcta. He querido utilizar esta forma de extraer información de un archivo jSON para utilizar algunas de las funciones que hemos visto en el blog y demostrar así su utilidad (Números o Carácter_e).

Por último me gustaría recordaros que esta versión del API tiene una limitación diaria a 2.500 consultas. Lo podéis ver aquí: Límites de uso

En los próximos días os mostraré otra función pero trabajando con datos XML y utilizando otras variables y funciones para extraer la misma información.

Pues esto ha sido todo, como siempre os dejo el archivo:

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