Convertir direcciones en latitud y longitud automáticamente en Power BI a través de la API de Google

 In Destacado, Power Query

En este post vamos a aprender como obtener las coordenadas de nuestros clientes atacando la api de Google a partir de una dirección.

Existe un vídeo, en portugués, de Luis Gustavo Serra donde lo explica todo paso a paso y no quería dejar de mencionarlo ya que fue a través de este vídeo como descubrí esta técnica.

https://www.youtube.com/watch?v=QaTlRuBEpfw

Lo primero que hay que hacer es darse de alta en la api de Google para obtener una api key

Entraremos en la web

https://console.developers.google.com

Lo primero que haremos será crear un nuevo proyecto dando a seleccionar proyecto, crear nuevo.

 

Una vez creado vamos a Enable Apis and Services

Y buscamos Geocoding API

La seleccionamos y presionamos en HABILITAR

 

Una vez habilitada vamos a Credenciales y presionamos en Crear Credenciales_ Clave de API

Y obtendremos como resultado una Clave alfanumérica.

 

 

La petición que tenemos que hacer a la web para obtener las coordenadas a partir de una dirección es la siguiente:

 

https://maps.googleapis.com/maps/api/geocode/json?key=APIKEY&address=DIRECCION

 

Por ejemplo si queremos saber las coordenadas de la dirección del Museo Reina Sofía en Madrid, Calle Santa Isabel 52 28018, Madrid, la petición sería la siguiente:

 

https://maps.googleapis.com/maps/api/geocode/json?key=***********MY API  KEY*********&address=Calle Santa Isabel 52 28018, Madrid

y el resultado que nos devuelve es un archivo json como el que se puede ver en la imagen, que contiene la longitud y la latitud además de los datos completos de la dirección.

 

Como trasladar esto a Power BI y automatizar la carga de latitud y longitud de nuestros clientes es el siguiente paso.

 

Abrimos nuestro Power BI Desktop le damos a nuevo origen, web y copiamos la dirección web a la que hemos hecho la petición de los datos con la API KEY incluida

A partir de aquí con una serie de sencillos pasos acabamos obteniendo la latitud y la longitud:

1º Presionamos en lista

2º Presionamos en Record

3º Presionamos en Geometry – Record

4º Presionamos en Location – Record

5º Convertimos en tabla

6º Eliminamos la columna Name

7º Transponemos la columna Value

8º Renombramos la Columna 1 como Latitud y la 2 como longitud

9º Cambiamos el tipo de datos de ambas a decimal

 

De esta manera obtenemos la latitud y la longitud de nuestra dirección

Pero, ahora bien, como transformamos todos estos pasos en una función para poder aplicarla en masa a nuestra tabla de clientes.

 

Lo primero que vamos a hacer es convertir nuestra API Key en un parámetro

Y copiamos en el valor actual el valor de nuestra ApiKey

 

En la tabla que hemos creado con la latitud y longitud, sustituimos la apikey por el parámetro, de manera que quedaría como sigue:

let

Origen = Json.Document(Web.Contents(«https://maps.googleapis.com/maps/api/geocode/json?key=»&(APIKEY)&»&address=Calle Santa Isabel 52 28018, Madrid»)),

results = Origen[results],

results1 = results{0},

geometry = results1[geometry],

location = geometry[location],

#»Convertido en tabla» = Record.ToTable(location),

#»Columnas quitadas» = Table.RemoveColumns(#»Convertido en tabla»,{«Name»}),

#»Tabla transpuesta» = Table.Transpose(#»Columnas quitadas»),

#»Columnas con nombre cambiado» = Table.RenameColumns(#»Tabla transpuesta»,{{«Column1», «Latitud»}, {«Column2», «Longitud»}}),

#»Tipo cambiado» = Table.TransformColumnTypes(#»Columnas con nombre cambiado»,{{«Latitud», type number}, {«Longitud», type number}})

in

#»Tipo cambiado»

 

Ya tenemos de este modo nuestra APIKEY parametrizada y en segundo lugar vamos a convertir toda esta tabla en una función sustituyendo la dirección por el parámetro de la función quedando de la siguiente manera:

 

De esta manera nuestra tabla se convierte en una función

Si introducimos la dirección en nuestro parámetro, nos devolverá directamente latitud y longitud tal y como lo teníamos en la tabla que hicimos al principio

 

Si nos vamos a nuestro modelo y en nuestra tabla Clientes, agregamos una columna invocando función personalizada e invocamos la función que hemos creado, utilizando como parámetro el campo de la dirección del cliente nos traerá la latitud y la longitud para cada línea de nuestra base de datos de clientes.

 

Recomiendo que el campo que utilicemos como dirección sea lo más detallado posible. Lo mejor es crear una columna concatenada de los campos dirección, localidad, código postal y país, al menos.

 

Limitaciones….

 

La API de Google es una api de pago aunque al registrar la cuenta e introducir una tarjeta como medio de pago, te dan un crédito de 300 USD para gastar en las apis que quieras.

No cobran absolutamente nada sin antes cambiar la cuenta a “cuenta premium”

Yo he probado la captura de más de 19000 lineas para una tabla de clientes y el coste que me refleja es el siguiente:

 

Pero evidentemente no cobran nada al estar dentro del límite de crédito gratuito

Las 19000 peticiones tardaron en ejecutarse aproximadamente 3 horas

Para que no realice esa petición cada vez que queramos actualizar el modelo es necesario guardar los datos devueltos, para lo que podemos, por ejemplo, crear una tabla con el id del cliente, la latitud y la longitud y copiarla en csv con herramientas como dax studio Y una vez guardados los datos, eliminar la invocación de la función del modelo.

 

 

 

 

 

 

 

Recommended Posts
Showing 2 comments
  • GABRIEL

    HOLA

    QUE VALOR LE DISTE AL APIKEY, MUCHAS GRACIAS

  • geomar

    Buenas noches, busco información del programa.