El formato técnico de latitud y longitud es muy útil para que las computadoras y los sistemas alrededor del mundo puedan procesar información geográfica fácilmente, pero nosotros, los humanos, necesitamos formas más amigables para ubicarnos en el mundo. Por eso usamos direcciones con calle, número, código postal, etcétera. Vamos a seguir aprovechando el potencial de la integración de Google Sheets y Google Maps para hacer un proceso llamado geocodificación inversa (reverse geocoding), que implica obtener una dirección física a partir de un par de coordenadas geográficas. Como el nombre lo dice, es el proceso inverso a geodificar, que ya aprendimos a hacer una vez aquí.
Preparando nuestras coordenadas
Primero, preparemos nuestra hoja de cálculo con las coordenadas ya en el formato que las necesitamos, es decir, una columna para Latitud y otra columna para Longitud. A veces los dos datos vienen en un solo, separados por una coma. Si es tu caso, puedes usar la fórmula SPLIT para separarlos antes de seguir.
Vamos a usar el set de datos al que estamos acostumbrados desde el ejemplo donde aprendimos a geocodificar, que ya sabemos que son direcciones de lugares de interés para visitar en la Ciudad de México.
Configurando nuestro proyecto de Apps Script
Esta vez también vamos a usar código de Apps Script para enviarle los datos de latitud y longitud a Google Maps, esperando que nos regrese una dirección física legible por humanos.
Entonces vamos al menú Extensiones – Apps Script
Ahora creamos un menú llamado Geocodificación, que incluye a su vez el submenú ‘Convertir coordenadas en direcciones‘, el cual ejecutará la función geocodificacion_inversa()
. El código que te aparece por default, lo reemplazaremos por este, que hace lo que acabamos de decir:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRangeAll = sheet.getDataRange();
var ultimaFila = dataRangeAll.getLastRow();
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Geocodificación')
.addItem('Convertir coordenadas en direcciones', 'geocodificacion_inversa')
.addToUi();
}
// Geocodificar inversamente todas las filas a partir de la 2da
function geocodificacion_inversa() {
}
Lenguaje del código: JavaScript (javascript)
Geocodificación inversa de coordenadas de latitud y longitud a direcciones físicas
Lo que nos resta por hacer ahora es codificar la función que recorra todas las filas a partir de la segunda, tome los datos de latitud y longitud de las columnas correspondientes y del resultado que nos devuelva el proceso de reverse geocoding de Google Maps, extraer la información de la dirección en texto.
// Geocodificar inversamente todas las filas a partir de la 2da
function geocodificacion_inversa() {
var filaInicial = 2;
var dataRange = sheet.getRange(filaInicial, 1,ultimaFila, 3);
var data = dataRange.getValues();
// Recorremos todas las filas del rango
for(var i=0; i< data.length; i++) {
var fila = data[i];
var latitud = fila[0];
var longitud = fila[1];
// Solamente haremos algo si no están vacías las coordenadas,
// para no generar errores inesperados
if(latitud != "" && longitud != "") {
// Aquí es donde nos conectamos con Google Maps
var reverseGeocoder = Maps.newGeocoder().reverseGeocode(latitud, longitud);
var resultado = reverseGeocoder.results[0];
var direccion = "";
// Si el geocoder de Google Maps nos devuelve un resultado satisfactorio,
// escribimos la dirección en las celdas correspondientes a la fila
if(resultado) {
direccion = resultado.formatted_address;
sheet.getRange(filaInicial + i, 3).setValue(direccion);
}
}
}
}
Lenguaje del código: JavaScript (javascript)
La primera y segunda celda de cada fila, las guardaremos en variables llamadas latitud y longitud. Después revisamos que no estén vacías las variables, y pedimos a Google Maps que haga geocodificación inversa con el método reverseGeoCode
de que provee la API de Google Maps.
En la última parte del código puedes ver cómo estamos revisando cada resultado para asegurarnos de que tiene datos, porque si no, quiere decir que no pudo obtener la dirección a partir de esas coordenadas. Si todo salió bien, guardamos en la variable direccion
el dato formatted_address
que viene en el resultado que nos regresa.
Después, escribimos el valor que guardamos en la variable direccion
en la fila correspondiente según el recorrido del ciclo for
y en la tercera columna.
Igual que siempre, te dejo del código completo para que solamente copies, pegues y pruebes 😀
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRangeAll = sheet.getDataRange();
var ultimaFila = dataRangeAll.getLastRow();
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Geocodificación')
.addItem('Convertir coordenadas en direcciones', 'geocodificacion_inversa')
.addToUi();
}
// Geocodificar inversamente todas las filas a partir de la 2da
function geocodificacion_inversa() {
var filaInicial = 2;
var dataRange = sheet.getRange(filaInicial, 1,ultimaFila, 3);
var data = dataRange.getValues();
// Recorremos todas las filas del rango
for(var i=0; i< data.length; i++) {
var fila = data[i];
var latitud = fila[0];
var longitud = fila[1];
// Solamente haremos algo si no están vacías las coordenadas,
// para no generar errores inesperados
if(latitud != "" && longitud != "") {
// Aquí es donde nos conectamos con Google Maps
var reverseGeocoder = Maps.newGeocoder().reverseGeocode(latitud, longitud);
var resultado = reverseGeocoder.results[0];
var direccion = "";
// Si el geocoder de Google Maps nos devuelve un resultado satisfactorio,
// escribimos la dirección en las celdas correspondientes a la fila
if(resultado) {
direccion = resultado.formatted_address;
sheet.getRange(filaInicial + i, 3).setValue(direccion);
}
}
}
}
Lenguaje del código: JavaScript (javascript)
Ejecutando el código de geocodificación inversa
Ya casi terminamos, solo nos falta ejecutar y probar el código del proyecto. Primero damos click en el botón de Guardar proyecto (o presionamos CTRL + S), y después usamos el botón de Ejecutar una vez.
Esto hará que nos pida los permisos correspondientes para que el proyecto pueda leer y escribir en nuestra hoja de cálculo, entonces los aceptamos:
Vamos a ver el código en acción. Regresamos a la pestaña de la hoja de cálculo y para asegurarnos de que se cargue el código y se muestre el menú, refrescamos la página. Tendremos que ver este menú de ‘Geocodificación’, con la opción de ‘Convertir coordenadas en direcciones’:
Cuando lo ejecutemos, veremos cómo se llena la columna de Dirección a partir de cada par de coordenadas de las columnas de Latitud y Longitud:
Documentación oficial y límites de uso
En la documentación oficial de Google puedes revisar más información sobre todo lo que se puede hacer con el resultado que devuelve Google Maps, ya que nosotros solo estamos usando la dirección completa, pero podrías obtener por separado el país o el código postal, por ejemplo.
También es importante que tengas en cuenta los límites diarios de uso de las peticiones de Google Maps, por si tienes muchas coordenadas que quieras convertir y no sepas por qué de repente dejó de funcionar el código.
Perfecto, ahora ya sabes cómo convertir coordenadas de latitud y longitud a direcciones en formato humano. Puedes combinar esta guía con la otra en donde aprendimos a geocodificar para poder hacer las dos cosas en la misma hoja de cálculo, por si solo tienes las direcciones o solo tienes las coordenadas. Además, estas direcciones las puedes usar para crear un mapa con Google My Maps, como explico en esta otra guía.
Plantilla terminada para descargar
Guía en video
Si tienes dudas puedes ver esta misma guía explicada en video:
¡Espero que te haya sido útil esta guía! No olvides seguirnos en YouTube y checar nuestro curso de Google Sheets para más tips, trucos y guías de productividad.
Alekz es un apasionado de la tecnología y los videojuegos. Además de ser locutor comercial, disfruta de la expresión artística más sastisfactoria y técnica que existe: programar (y pintar algo de pixel art). Fundó Tesel para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Es un absoluto nerd de Star Trek.
Alekz es un apasionado de la tecnología y los videojuegos. Además de ser locutor comercial, disfruta de la expresión artística más sastisfactoria y técnica que existe: programar (y pintar algo de pixel art). Fundó Tesel para ayudar a empoderar a las empresas a desarrollar su máximo potencial mediante la tecnología. Es un absoluto nerd de Star Trek.
Aleks, una pregunta en que parte de tu código debería colocar la unción utilities.sleep(1000) para que el código corra y no se detenga cuando tenga 5000 filas con coordenadas latitud y longitud?
Yo la agregué acá, pero no funciona el código:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var dataRangeAll = sheet.getDataRange();
var ultimaFila = dataRangeAll.getLastRow();
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu(‘Geocodificación’)
.addItem(‘Convertir coordenadas en direcciones’, ‘geocodificacion_inversa’)
.addToUi();
}
// Geocodificar inversamente todas las filas a partir de la 2da
function geocodificacion_inversa() {
var filaInicial = 2;
var dataRange = sheet.getRange(filaInicial, 1,ultimaFila, 3);
var data = dataRange.getValues();
// Recorremos todas las filas del rango
for(var i=0; i< data.length; i++) {
var fila = data[i];
Utilities.sleep(200);
var latitud = fila[0];
var longitud = fila[1];
// Solamente haremos algo si no están vacías las coordenadas,
// para no generar errores inesperados
if(latitud != "" && longitud != "") {
// Aquí es donde nos conectamos con Google Maps
var reverseGeocoder = Maps.newGeocoder().reverseGeocode(latitud, longitud);
var resultado = reverseGeocoder.results[0];
var direccion = "";
// Si el geocoder de Google Maps nos devuelve un resultado satisfactorio,
// escribimos la dirección en las celdas correspondientes a la fila
if(resultado) {
direccion = resultado.formatted_address;
sheet.getRange(filaInicial + i, 3).setValue(direccion);
}
}
}
}
Hola Carlos, revisa los límites diarios del uso de la API de Google Maps porque puede ser que más bien se detenga porque sobrepasas ese uso y no tanto por el código o el número de filas. Lo puedes checar en este link: https://developers.google.com/apps-script/guides/services/quotas . La otra opción que puedes probar es usando un trigger que ejecute el proceso cada cierto tiempo y así cuenten como ejecuciones separadas para tener un efecto similar al de Utilities.sleep(). También puedes probar usándola solamente cuando llegues al límite que ya identificaste ej. if(i == 4999) { Utilities.sleep(1000) } . Espero que te ayude 😀
Hola. Qué comandos tengo que colocar para que NO me de la dirección, pero SI el código postal?
Holaaa! Buenas tardes, el video es muy util, sin embargo no se como hacer porque las direcciones me apareen en este formato: 67P76Q3H+6H y no se como cambiarlo.
Ayuda, Gracias!
buenas tardes, como le puedo hacer para cambiarlo de lugar.
Em la D tengo Longitud(4) y en La E(5) tengo Latitud, quiero que me escriba en la F(6) la dirección
estoy empezando en esto todavía.
gracias por el apoyo
Hola Alekz, al ejecutar el código, me aparece el mensaje: “Exception: Argumento no valido: location” ¿Qué tengo que hacer? Muchas gracias
¡Hola! Gracias por comentar. Eso puede pasar si el código no está tomando los datos correctamente de la hoja, es decir, si está tomando filas vacías o cosas así. Asegúrate de que el orden de las columnas sea como se ven en el video porque el código está pensado para ese orden particular. También asegúrate de poner el código tal cual como se ve o cópialo de acá: https://tesel.mx/convertir-coordenadas-de-latitud-y-longitud-en-direcciones-con-google-sheets-y-google-maps-reverse-geocoding-8059/ . Espero que te ayude, ¡un saludo! 😃
hola llegué al uso máximo diario ayer 17-06-24, pero hoy nuevamente arroja el mismo mensaje, favor su apoyo