• Saltar a la navegación principal
  • Saltar al contenido principal
Geoinnova

Consultoría y Formación en SIG, Territorio y Medio Ambiente

  • Geoinnova
    • Quiénes somos
    • Coworking
    • Alianzas Estratégicas
    • Visor de proyectos Geoinnova
  • SIG y Desarrollo
    • Plugins QGIS
    • GeoNode
    • QElectricGIS
    • Planero Web
  • Consultoría Territorial
    • Planes de Emergencia Municipales de Protección Civil
    • Planes Urbanos de Actuación Municipal – PUAM
    • Evaluación Ambiental Estratégica de planes y programas
    • Minimización de Impacto Territorial y Declaración de Situación Individualizada en suelo no urbanizable
    • Turismo sostenible
  • Consultoría Ambiental
    • Trámites de Economía Circular
    • Prevención y gestión ambiental
    • Responsabilidad social corporativa
    • Estrategia de sostenibilidad
  • Formación
    • Todos los cursos
    • Formación para empresas
    • Máster y Diplomas
    • Cursos de QGIS Online Certificados
    • Cursos de programación, desarrollo SIG y geoservicios
    • Cursos de Teledetección
    • Cursos de Giswater
    • Cursos de SIG con ArcGIS
    • Cursos de Medio Ambiente
    • Campus
  • Divulgación
    • Blog
    • Tertulia Territorio Geoinnova
    • TFMs y otro trabajos de alumnos
    • Noticias
    • Webinars
    • Geolibrería
  • Contacto
    • Soporte – Tickets
Programación y Desarrollo SIG APÚNTATE
Programación y Desarrollo SIG SIG Tecnología

RapidFuzz para normalización de textos en datos SIG

10/06/2025 Deja un comentario

La normalización de campos de texto, como nombres de calles, códigos o descripciones, es una tarea fundamental en cualquier sistema de información geográfica (SIG), especialmente cuando se integran fuentes de datos heterogéneas con diferentes convenciones o estructuras. RapidFuzz es una librería Python especializada en comparación de cadenas mediante algoritmos de fuzzy matching, que permite encontrar coincidencias aproximadas entre textos. En este artículo vamos a explorar una estrategia de normalización de textos con RapidFuzz y Python, aplicando algoritmos de comparación difusa (fuzzy matching) para geocodificar edificios a partir de capas de callejero.

RapidFuzz: una herramienta para normalización de textos en python

RapidFuzz ha sido optimizada para ofrecer un alto rendimiento en la comparación de cadenas y maneja de forma eficaz caracteres especiales y acentos. En este ejemplo, usamos la función partial_ratio, ratio y token_sort_ratio, para capturar tanto coincidencias parciales como exactas e independientes del orden de las palabras. El objetivo final es corregir el campo addr:street de cada edificio asignándole la calle más similar de su entorno, combinando precisión léxica y proximidad espacial. Esta técnica forma parte de una estrategia de normalización de textos con RapidFuzz y Python aplicada a datos espaciales.

Ejemplo práctico: normalización de direcciones en SIG

Partimos de dos capas vectoriales en formato GeoPackage: una de edificios (edificios.gpkg) descargada desde OpenStreetMap y otra de callejero (callejero.gpkg) procedente de la Infraestructura de Datos Espaciales (IDE) del Ayuntamiento de Madrid. Al provenir de fuentes distintas, es común que existan diferencias en la nomenclatura de las direcciones.

Paso a paso del proceso

Carga de capas con GeoPandas

import geopandas as gpd
from rapidfuzz import process, fuzz
# Leer las capas
gdf_edificios = gpd.read_file("edificios.gpkg")
gdf_callejero = gpd.read_file("callejero.gpkg")

En esta primera sección se realiza la carga de datos espaciales desde archivos GeoPackage, utilizando la librería GeoPandas. Estas capas contienen la información de los edificios y del callejero que serán comparados.

Comparación de direcciones mediante fuzzy matching

# Función para obtener la dirección más similar
def obtener_direccion_similar(row):
    direccion = row['addr:street']
    geometria_edificio = row['geometry']
    
    # Si ya tenemos esta dirección en el cache, la devolvemos
    if direccion in cache_direcciones:
        return cache_direcciones[direccion]
    
    # Filtrar calles en un radio de 1km
    buffer_1km = geometria_edificio.buffer(1000)
    calles_cercanas = gdf_callejero[gdf_callejero.intersects(buffer_1km)]
    
    # Obtener solo los nombres de las calles cercanas
    direcciones_cercanas = calles_cercanas['DIRECCION'].unique()
    
    # Si no hay calles cercanas, buscar en todo el callejero
    if len(direcciones_cercanas) == 0:
        direcciones_cercanas = gdf_callejero['DIRECCION'].unique()
    
    # Obtener las mejores coincidencias con diferentes scorers
    matches_partial = process.extract(direccion, direcciones_cercanas, scorer=fuzz.partial_ratio, limit=3)
    matches_ratio = process.extract(direccion, direcciones_cercanas, scorer=fuzz.ratio, limit=3)
    matches_token_sort = process.extract(direccion, direcciones_cercanas, scorer=fuzz.token_sort_ratio, limit=3)
    
    # Combinar y ponderar los resultados
    mejores_matches = {}
    for match in matches_partial + matches_ratio + matches_token_sort:
        nombre = match[0]
        score = match[1]
        if nombre not in mejores_matches:
            mejores_matches[nombre] = score
        else:
            mejores_matches[nombre] = max(mejores_matches[nombre], score)
    
    # Seleccionar la mejor coincidencia
    if mejores_matches:
        mejor_match = max(mejores_matches.items(), key=lambda x: x[1])
        if mejor_match[1] >= 80:  # Umbral de similitud
            cache_direcciones[direccion] = mejor_match[0]
            return mejor_match[0]
    
    cache_direcciones[direccion] = None
    return None

Aquí se define la lógica de comparación fuzzy para encontrar la dirección más parecida del callejero a la dirección de un edificio. Se utiliza una estrategia que combina diferentes scorers (partial_ratio, ratio, token_sort_ratio) y se aplica un umbral mínimo del 80% para asegurar la calidad del emparejamiento. También se emplea una caché para evitar repetir búsquedas y se filtran previamente las calles dentro de un buffer de 1 km alrededor del edificio.

Aplicación del algoritmo y exportación de resultados

# Aplicar la función a cada fila de gdf_edificios
gdf_edificios['DIRECCION_CORREGIDA'] = gdf_edificios.apply(obtener_direccion_similar, axis=1)
# Guardar resultado
gdf_edificios.to_file("edificios_geocodificados.gpkg", driver="GPKG")

Finalmente, se aplica la función definida a cada registro de la capa de edificios, se seleccionan solo las columnas relevantes y se exporta el resultado corregido a un nuevo archivo GeoPackage. Este archivo contendrá las direcciones originales junto con su equivalente corregido y podrá ser utilizado en otros análisis o visualizaciones SIG.

Tras aplicar el procedimiento, podemos ver como algunas de las direcciones iniciales han sido correctamente asignadas a la dirección definida desde la capa del callejero.

Resultados del procedimiento con RapidFuzz

Ventajas de usar RapidFuzz para normalización de textos en SIG

Este enfoque se apoya en una combinación de estrategias que mejoran tanto el rendimiento como la precisión del emparejamiento o comparación de direcciones en entornos SIG:

  • Optimización espacial: limita las comparaciones a calles dentro de un radio de 1 km, reduciendo el número de comparaciones y acelerando el proceso.
  • Uso de caché: evita recalcular coincidencias para direcciones repetidas, mejorando la eficiencia.
  • Comparación avanzada con múltiples scorers: utiliza distintas funciones de RapidFuzz para medir la similitud entre cadenas:
    • partial_ratio: útil para coincidencias parciales.
    • ratio: ideal para coincidencias exactas.
    • token_sort_ratio: permite comparar cadenas con las mismas palabras en distinto orden.
  • Combinación de resultados y umbral de calidad: se obtienen las tres mejores coincidencias con cada función, se combina la puntuación más alta por calle y solo se acepta la coincidencia si supera un umbral del 80% de similitud.

Este enfoque evita falsos positivos y mejora la fiabilidad, resolviendo casos como «Plaza de la Armería» frente a «Plaza de Armería», donde token_sort_ratio puede identificar que ambas contienen las mismas palabras aunque en diferente orden, y el umbral garantiza que no se seleccionen coincidencias dudosas. En conjunto, se trata de una solución eficaz de normalización de textos con RapidFuzz y Python en entornos geoespaciales.

Aplicaciones en el ámbito SIG

La normalización de textos con RapidFuzz y Python no solo mejora la calidad de los datos, sino que también abre la puerta a otras posibles aplicaciones en el entorno SIG.

  • Normalización de direcciones: unificar nomenclaturas entre fuentes distintas.
  • Geocodificación local: asignar nombres de calles a edificios en ausencia de coordenadas precisas.
  • Integración de datos: comparar registros con diferentes esquemas de codificación o nomenclatura.
  • Limpieza de datos: detectar y corregir errores ortográficos o inconsistencias.

Resumiendo

La combinación de RapidFuzz con optimización espacial y almacenamiento en caché representa una solución robusta para tareas de geocodificación y limpieza de direcciones en entornos SIG. Este enfoque permite una mejora significativa en la precisión y eficiencia del tratamiento de datos alfanuméricos vinculados a ubicaciones geográficas.

Apúntate a nuestra newsletter semanal

"*" señala los campos obligatorios

Este campo es un campo de validación y debe quedar sin cambios.
Consentimiento*

Artículos relacionados

centro-de-datos-sostenibles-en-España-geoinnova-sostenibilidad
Centros de datos sostenibles en España: los nuevos requisitos de energía, agua y renovables que plantea el Gobierno
01/09/2026
GeoServer-3-desarrollo-SIG-programación-web-GIS-Geoinnova
GeoServer 3: cambios en la interfaz, requisitos de sistema y checklist de migración
07/09/2026
cómo-digitalizar-en-Qgis-geoinnova-sig
Cómo digitalizar en QGIS: Guía completa paso a paso
01/09/2026

Miquel Febrer

Graduado en Geografía por la Universitat de les Illes Balears (2011-2015) y Máster en Tecnologías de la Información Geográfica para la Ordenación del Territorio (2016-2017) por la Universidad de Zaragoza. Desde 2018 viene colaborando con Geoinnova como docente en diversos cursos y en el desarrollo de algunas herramemientas. Ya en 2022 se incorpora al equipo Geoinnova como técnico y desarrollador GIS.

Interacciones con los lectores

¿Quieres comentarnos algo? Adelante! Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Geoinnova
c/ Luis Morondo Urra nº 8 Bajo A
31006 Pamplona (Navarra)
info@geoinnova.org
+34 948 117 137

Horario de atención

Lunes a Viernes - 09:00 a 14:00 y de 16:00 a 19:00.
Fines de semana y Festivos - Exclusivamente por mail.
Horario de Verano (01 de julio al 30 de agosto): De lunes a viernes de 8 a 15h.

Otras páginas de interes

  • Promociones y descuentos en formación
  • Formación bonificada FUNDAE
  • Verificador y descarga de Certificados de aprovechamiento
  • Cursos certificable por QGIS.org

Legal

  • Aviso Legal
  • Política de privacidad
  • Política de seguridad
  • Política de cookies
  • Términos y condiciones
Entidad adherida a Confianza Online Certificado de inscripción en el Registro de huella de carbono, compensación y proyectos de absorción Logo Plazox Certificado de conformidad con el ENS

Todo el contenido publicado desde 2009 hasta 2026 en el Blog de Geoinnova por Geoinnova y colaboradores está licenciado bajo CC BY-NC-ND 4.0
Para usos específicos, contactar con Geoinnova.

© 2026 · Desarrollada por Geoinnova

Gestionar el Consentimiento de las Cookies
Utilizamos tecnologías como las cookies para almacenar y/o acceder a la información del dispositivo. Lo hacemos para mejorar la experiencia de navegación y para mostrar anuncios personalizados. El consentimiento a estas tecnologías nos permitirá procesar datos como el comportamiento de navegación o las identificaciones únicas en este sitio. No consentir o retirar el consentimiento, puede afectar negativamente a ciertas características y funciones.
Funcional Siempre activo
El almacenamiento o acceso técnico es estrictamente necesario para el propósito legítimo de permitir el uso de un servicio específico explícitamente solicitado por el abonado o usuario, o con el único propósito de llevar a cabo la transmisión de una comunicación a través de una red de comunicaciones electrónicas.
Preferencias
El almacenamiento o acceso técnico es necesario para la finalidad legítima de almacenar preferencias no solicitadas por el abonado o usuario.
Estadísticas
El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos. El almacenamiento o acceso técnico que es utilizado exclusivamente con fines estadísticos anónimos. Sin una requerimiento, el cumplimiento voluntario por parte de su proveedor de servicios de Internet, o los registros adicionales de un tercero, la información almacenada o recuperada sólo para este propósito no se puede utilizar para identificarlo.
Marketing
El almacenamiento o acceso técnico es necesario para crear perfiles de usuario para enviar publicidad, o para rastrear al usuario en un sitio web o en varios sitios web con fines de marketing similares.
  • Administrar opciones
  • Gestionar los servicios
  • Gestionar {vendor_count} proveedores
  • Leer más sobre estos propósitos
Personalizar
  • {title}
  • {title}
  • {title}