Cómo utilizar un script de Python para geocodificar direcciones y generar archivos KML
En este artículo, exploraremos un script de Python que permite geocodificar direcciones desde un archivo Excel y generar un archivo KML que puede ser utilizado en aplicaciones de mapas. Este proceso es útil para quienes necesitan visualizar datos geográficos de manera sencilla.
Resumen del script
El script que vamos a analizar realiza las siguientes funciones:
- Obtener coordenadas geográficas: Utiliza la API de Google Maps para convertir direcciones en coordenadas de latitud y longitud.
- Leer un archivo Excel: Busca un archivo Excel en el directorio actual que contenga una columna con direcciones.
- Generar un archivo KML: Crea un archivo KML que contiene marcadores para cada dirección geocodificada, lo que permite visualizar estas ubicaciones en aplicaciones como Google Earth.
- Guardar resultados: Exporta un nuevo archivo Excel con las coordenadas obtenidas.
Instalación de librerías necesarias
Antes de utilizar el script, asegúrate de tener instaladas las siguientes librerías de Python. Puedes instalarlas utilizando pip:
pip install pandas requests tqdm openpyxl
- pandas: Para manipular datos en formato tabular (Excel).
- requests: Para realizar solicitudes HTTP a la API de Google Maps.
- tqdm: Para mostrar una barra de progreso durante la ejecución del script.
- openpyxl: Para leer y escribir archivos Excel.
Uso del script paso a paso
1. Configurar la API de Google Maps
Antes de ejecutar el script, necesitas obtener una clave de API de Google Maps. Esto se puede hacer a través de la Consola de Google Cloud:
- Crea un nuevo proyecto.
- Habilita la API de Geocodificación.
- Genera una nueva clave de API.
Reemplaza 'TUAPI'
en el script con tu clave de API.
2. Preparar el archivo Excel
Crea un archivo Excel (.xlsx) que contenga una columna llamada direccion
con las direcciones que deseas geocodificar. Asegúrate de que no haya otras columnas con el mismo nombre.
Ejemplo de un archivo Excel:
Item | Direccion |
---|---|
1 | Álvarez 910, Tercero de Cobián, Torreón, Coah. |
2 | Calz Cuitláhuac 189, Moctezuma, Torreón, Coah. |
3 | Río Volga 1300, Magdalenas, Torreón, Coah. |
3. Ejecutar el script
Guarda el script en un archivo Python (por ejemplo, geocodificador.py
) y colócalo en el mismo directorio donde se encuentra tu archivo Excel. Luego, ejecuta el script desde la terminal:
python geocodificador.py
import os
import pandas as pd
import requests
from glob import glob
from tqdm import tqdm
import time
GOOGLE_MAPS_API_KEY = 'TUAPI'
def obtener_coordenadas(direccion):
url = f'https://maps.googleapis.com/maps/api/geocode/json?address={direccion}&key={GOOGLE_MAPS_API_KEY}'
response = requests.get(url)
data = response.json()
if data['status'] == 'OK':
location = data['results'][0]['geometry']['location']
return location['lat'], location['lng']
else:
print(f"No se encontraron coordenadas para la dirección: {direccion}")
return None, None
def generar_kml(df, output_dir):
kml_content = '<?xml version="1.0" encoding="UTF-8"?>\n'
kml_content += '<kml xmlns="http://www.opengis.net/kml/2.2">\n'
kmlcontent += ' <Document>\n'
for , row in df.iterrows():
if pd.notnull(row['Latitud']) and pd.notnull(row['Longitud']):
kml_content += ' <Placemark>\n'
kml_content += f' <name>{row["direccion"]}</name>\n'
kml_content += ' <Point>\n'
kml_content += f' <coordinates>{row["Longitud"]},{row["Latitud"]},0</coordinates>\n'
kml_content += ' </Point>\n'
kml_content += ' </Placemark>\n'
kml_content += ' </Document>\n'
kml_content += '</kml>\n'
kml_filename = os.path.join(output_dir, 'output_geocodificado.kml')
with open(kml_filename, 'w', encoding='utf-8') as f:
f.write(kml_content)
print(f"Archivo KML guardado en: {kml_filename}")
def procesar_excel():
# Busca un archivo Excel en el directorio actual
input_files = glob("*.xlsx")
if len(input_files) == 0:
print("Error: No se encontró ningún archivo Excel en el directorio.")
return
elif len(input_files) > 1:
print("Error: Hay más de un archivo Excel en el directorio. Solo debe haber uno.")
return
input_filename = input_files[0]
df = pd.read_excel(input_filename)
if 'direccion' not in df.columns:
print("Error: La columna 'direccion' no se encontró en el archivo.")
return
latitudes = []
longitudes = []
# Utilizar tqdm para mostrar la barra de progreso
for direccion in tqdm(df['direccion'], desc="Obteniendo coordenadas", unit="dir"):
lat, lng = obtener_coordenadas(direccion)
latitudes.append(lat)
longitudes.append(lng)
# Agrega una pausa de 0.5 segundos entre cada solicitud
time.sleep(0.5)
df['Latitud'] = latitudes
df['Longitud'] = longitudes
output_dir = os.path.join(os.path.dirname(input_filename), 'processed')
os.makedirs(output_dir, exist_ok=True)
output_filename = os.path.join(output_dir, 'output_geocodificado.xlsx')
df.to_excel(output_filename, index=False)
print(f"Archivo guardado en: {output_filename}")
# Generar archivo KML
generar_kml(df, output_dir)
# Ejecuta el procesamiento del archivo de Excel
procesar_excel()
El script buscará automáticamente el archivo Excel en el directorio actual, leerá las direcciones, obtendrá las coordenadas y generará un nuevo archivo Excel con las columnas de latitud y longitud. También creará un archivo KML en una carpeta llamada processed
dentro del mismo directorio.
4. Visualización de resultados
Una vez que el script haya terminado de ejecutarse, encontrarás un archivo llamado output_geocodificado.xlsx
en la carpeta processed
. Este archivo contendrá las direcciones originales junto con sus respectivas coordenadas.
Además, el archivo KML llamado output_geocodificado.kml
estará disponible para ser abierto en aplicaciones de mapas como Google Earth. Para visualizar el archivo KML:
- Abre Google Earth.
- Selecciona “Archivo” > “Abrir”.
- Navega hasta el archivo
output_geocodificado.kml
y ábrelo.
5. Ejemplo de archivo KML
Este script es una herramienta poderosa y fácil de usar que permite transformar direcciones en coordenadas geográficas y generar archivos KML para visualización. Con solo unos pasos, puedes geocodificar un conjunto de direcciones y obtener visualizaciones útiles para tu trabajo o proyectos personales.