Captura1

En este artículo, exploraremos un script en Python que utiliza la API de Nominatim para convertir coordenadas geográficas (latitud y longitud) almacenadas en un archivo de Excel en direcciones legibles. Este enfoque combina la manipulación de datos con la potencia de las APIs de geocodificación, permitiendo que los usuarios obtengan información geográfica de manera eficiente.

¿Qué Hace el Script?

El script realiza las siguientes funciones:

  1. Carga un archivo de Excel que contiene coordenadas geográficas.
  2. Consulta la API de Nominatim para obtener las direcciones correspondientes a cada par de coordenadas.
  3. Almacena los resultados en una nueva columna del DataFrame y guarda el resultado en un nuevo archivo de Excel.

Este proceso es especialmente útil para aquellos que trabajan con datos de ubicación y necesitan convertir coordenadas en direcciones para análisis posteriores.

Paso a Paso para su Uso

A continuación, se detallan los pasos necesarios para utilizar el script:

1. Preparar el Entorno

Antes de ejecutar el script, asegúrate de tener instalado Python en tu sistema. También necesitarás instalar algunas bibliotecas que son fundamentales para su funcionamiento.

2. Instalación de Bibliotecas Necesarias

El script utiliza las siguientes bibliotecas:

  • pandas: Para manipulación de datos y carga de archivos Excel.
  • requests: Para realizar solicitudes HTTP a la API de Nominatim.
  • concurrent.futures: Para realizar consultas a la API de forma concurrente y mejorar la eficiencia.

Puedes instalar estas bibliotecas utilizando pip. Abre una terminal y ejecuta el siguiente comando:

pip install pandas requests openpyxl

3. Preparar el Archivo de Excel

Asegúrate de que tu archivo de Excel contenga al menos dos columnas con las etiquetas Latitud y Longitud. El script buscará estas columnas para obtener las coordenadas.

4. Configurar el Script

Copia el siguiente código en un archivo Python (por ejemplo, geocodificador.py):

import os
import pandas as pd
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed

# Obtener el directorio donde se encuentra el script
script_dir = os.path.dirname(os.path.abspath(__file__))

# Listar archivos en el directorio y encontrar el único archivo Excel
excel_files = [f for f in os.listdir(script_dir) if f.endswith('.xlsx')]

if len(excel_files) != 1:
    raise ValueError(f"Se esperaba un solo archivo Excel en el directorio, pero se encontraron: {excel_files}")

# Ruta al único archivo Excel en el mismo directorio que el script
file_path = os.path.join(script_dir, excel_files[0])
df = pd.read_excel(file_path)

# Crear una nueva columna para las direcciones
df['direccion'] = ''

# URL base de la API de Nominatim
base_url = 'https://nominatim.openstreetmap.org/reverse'

# Agente de usuario y correo electrónico para la solicitud
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
params = {
    'email': 'xxx@gmail.com'  # Cambia esto por tu correo electrónico
}

# Función para obtener la dirección a partir de latitud y longitud
def obtener_direccion(index, lat, lon):
    try:
        specific_params = params.copy()
        specific_params.update({
            'lat': lat,
            'lon': lon,
            'zoom': 18,
            'format': 'jsonv2',
            'addressdetails': 1
        })
        response = requests.get(base_url, params=specific_params, headers=headers)
        response.raise_for_status()  # Esto lanzará una excepción para códigos de estado 4xx/5xx
        data = response.json()
        if 'display_name' in data:
            return index, data['display_name']
        else:
            return index, 'No address found'
    except Exception as e:
        print(f'Error fetching address for lat: {lat}, lon: {lon} - {e}')
        return index, 'Error'

# Función para procesar y guardar direcciones concurrentemente
def procesar_direcciones(df):
    with ThreadPoolExecutor(max_workers=10) as executor:
        future_to_index = {executor.submit(obtener_direccion, index, row['Latitud'], row['Longitud']): index for index, row in df.iterrows()}
        for future in as_completed(future_to_index):
            index = future_to_index[future]
            try:
                index, direccion = future.result()
                df.at[index, 'direccion'] = direccion
                print(f'Processed row {index + 1}/{len(df)}: {direccion}')
            except Exception as exc:
                print(f'Error in future for index {index}: {exc}')

# Ejecutar el procesamiento
procesar_direcciones(df)

# Guardar los resultados finales en un nuevo archivo Excel en el mismo directorio que el script
output_file_path = os.path.join(script_dir, 'archivo_con_direcciones.xlsx')
df.to_excel(output_file_path, index=False)
print(f'Output saved to {output_file_path}')

5. Ejecutar el Script

Coloca el archivo de Excel en el mismo directorio que el script y ejecuta el script desde la terminal con el siguiente comando:

python geocodificador.py

6. Revisar los Resultados

Después de ejecutar el script, se generará un nuevo archivo de Excel llamado archivo_con_direcciones.xlsx en el mismo directorio. Este archivo contendrá las coordenadas originales junto con las direcciones obtenidas.

Este script proporciona una forma eficiente y automatizada de convertir coordenadas en direcciones utilizando Python y la API de Nominatim. Con una configuración mínima, puedes transformar datos de ubicación en información útil para análisis y visualización.