que es la geocodificacion
mapa con códigos sobre ello

¿En Qué Consiste La Geocodificación?

La geocodificación consiste en el procesamiento de direcciones, nombres de lugares y otra información de ubicación en coordenadas geográficas (en valores de latitud y longitud), con fines de mapeo y análisis. Este proceso permite la integración de datos geográficos con otros conjuntos de datos, haciendo posible analizar y visualizar los patrones y relaciones que presentan entre ellos.

Tipos de Geocodificación

Hay varios tipos de geocodificación, cada uno con su propio conjunto ventajas y limitaciones:

  • Basada en direcciones: convierte direcciones de calles, como “Calle Pio IX, Valencia, ES” en coordenadas geográficas. Útil para analiizar patrones de delincuencia y fenómenos a pie de calle.
  • Basada en nombres de lugares: convierte los nombres de lugares: convierte los nombres de lugares, como “Plaza del Sol, Madrid” en coordenadas geográficas. Conveniente para mapear lugares históricos y fenómenos en zonas específicas.
  • Inversa: convierte las coordenadas en la correspondiente dirección. Eficaz a la hora de analizar datos de sistemas antiguos.
  • Por lotes: convierte multiples direcciones o nombres de lugares en las coordenadas pertinentes, usado con grandes conjuntos de datos cuyas coordenadas comprendan un área extensa.

Geocodificación en servicios

El uso de la geocodificación es crucial en los servicios que funcionan mediante la ubicación del usuario (aplicaciones móviles, mayoritariamente). Pudiendo utilizarse para -por ejemplo- llegar a una ubicación específica, detectar radares o congestiones de tráfico a tiempo real u obtener información sobre lugares de interés cercanos:

Software de Geocodificación y SIG

El software GIS (ArcGIS, QGIS…) hace uso de la geocodificación para crear mapas y realizar análisis espaciales, lo que resulta útil para una amplia gama de aplicaciones; incluyendo el planeamiento urbanístico, la gestión de recursos naturales y la respuesta a cualquier tipo de emergencias.

Calidad de los servicios de geocodificación

La precisión de los resultados obtenidos mediante la geocodificación depende significativamente de la cantidad de datos, el algoritmo utilizado y el servicio de geocodificación elegido (no todos son iguales, la calidad y precisión pueden variar significativamente). Un buen servicio de geocodificación es aquel que proporciona datos de alta calidad y emplea algoritmos avanzados.

Geocodificación y ciencia de datos

La geocodificación se integra perfectamente con la ciencia de datos al permitir la integración de datos de ubicación para obtener nuevas perspectivas sobre el conjunto de datos a tratar. Por ejemplo, geocodificación se puede utilizar en el campo de la logística y la planificación de rutas, para optimizar la entrega de productos y/o servicios. Determinando la mejor ruta para sus repartidores, basándose en la ubicación de los clientes y el tráfico en tiempo real.

Ejemplo de geocodificación con Python

Un ejemplo sencillo de geocodificación con Python, usando SPARQL & Folium, sería obtener un mapa con la ubicación de todos los futbolistas registrados en Wikidata:

I) Instalamos rdf-lib y sparqlwrapper

pip install -q rdflib
pip install -q rdflib-jsonld
pip install -q sparqlwrapper

II) Incluimos las librerías y funciones necesarias:

# Importamos las librerías necesarias para trabajar con SPARQL y procesar los datos

import io
import urllib.request
import rdflib
import rdflib_jsonld
from rdflib import Graph, plugin
from SPARQLWrapper import SPARQLWrapper, JSON, XML, N3, RDF , POST, GET, POSTDIRECTLY, CSV
import warnings
warnings.filterwarnings ("ignore")

# Importamos las librerías necesarias para visualizar los datos en un mapa

from IPython.display import HTML
import matplotlib.pyplot as plt
import math
import json 
import requests
import pandas as pd
import numpy as np
import unittest
from datetime import datetime

# Función para crear el cliente SPARQL

def create_sparql_client ( endpoint , result_format=JSON , query_method=POST , token=None ):
    ''' Crea un cliente SPARQL '''
    sparql = SPARQLWrapper(endpoint) 
    if token:
        sparql.addCustomHttpHeader ("Authorization","Bearer {}".format(token))
    sparql.setMethod ( query_method )
    sparql.setReturnFormat ( result_format )
    if query_method == POST:
        sparql.setRequestMethod(POSTDIRECTLY)
    return sparql

# Función para ejecutar la consulta SPARQL

def query_sparql ( sparql , prefix, query ):
    ''' Ejecuta una consulta SPARQL '''
    sparql.setQuery ( prefix + query  )  
    results = sparql.query()               
    if sparql.returnFormat == JSON:
        return results._convertJSON()
    return results.convert()

# Función para mostrar los resultados de la consulta SPARQL

def print_results ( results, limit =''):
    ''' Imprime los resultados de una consulta SPARQL '''
    resdata = results["results"]["bindings"]
    if limit != '':
        resdata = results["results"]["bindings"][:limit]
    for result in resdata:
        for ans in result:
            print('{0}: {1}'.format(ans, result[ans]['value']))
        print()

#Función para convertir los resultados de la consulta SPARQL en un dataframe:

def json2dataframe (results):
    ''' Genera un dataframe con los resultados de una consulta SPARQL. 
    Cada una de las filas es un resultado y en columnas cada uno de los atributos'''
    data = []
    for result in results['results']['bindings']:
        row = {}
        for var in results['head']['vars']:
            row[var] = result[var]['value']
        data.append(row)
    df = pd.DataFrame(data)
    return df

# Función para ejecutar la consulta y generar el dataframe

def dataframe_results(sparql, prefix, query ):
    ''' Ejecuta consulta y genera el dataframe '''
    sparql.setQuery(prefix + query)
    results = sparql.query().convert()
    df = json2dataframe(results)
    return df

III) Ejecutamos la consulta y creamos el mapa con los datos geográficos de cada futbolista:

# Creamos la consulta SPARQL para obtener los datos de los futbolistas

q = '''
SELECT DISTINCT ?person ?personLabel (COALESCE(?image, "") as ?image) ?lat ?lon

WHERE {
  ?person wdt:P106 wd:Q937857 .
  ?person rdfs:label ?personLabel . 
  ?person  wdt:P166 ?work .
  ?work rdfs:label ?workLabel .      

  OPTIONAL {?person wdt:P18 ?image} 

  OPTIONAL {?person wdt:P19 ?country .  
            ?country rdfs:label ?countryLabel .
            ?country wdt:P625 ?coords .
            ?country p:P625/psv:P625 ?node.
            ?node wikibase:geoLatitude ?lat.
            ?node wikibase:geoLongitude ?lon.
           }
  
  FILTER ( LANG ( ?personLabel ) = "en" )   
  FILTER ( LANG ( ?workLabel ) = "en" ) 
  FILTER ( LANGMATCHES ( LANG ( ?countryLabel ), "en" ) ) 
  
}
GROUP BY ?person ?personLabel ?image ?lat ?lon
'''

# Creamos el cliente SPARQL con el endpoint

wikidata_endpoint = "https://query.wikidata.org/sparql"
wd_sparql = SPARQLWrapper(wikidata_endpoint)
wd_sparql.setQuery(q)
wd_sparql.setReturnFormat(JSON)
results = wd_sparql.query().convert()
df_wiki = pd.json_normalize(results['results']['bindings'])

df_wiki = dataframe_results (wd_sparql, '', q)
df_wiki.drop_duplicates(inplace = True)

import folium

world_map = folium.Map(prefer_canvas=True)

# Recorremos el dataframe, agregando -en forma de círculo- las coordenadas de donde proceden los deportistas

for p in range ( df_wiki.shape[0]):
  lat = df_wiki.iloc[p]['lat']
  lon =  df_wiki.iloc[p]['lon'] 
  name = df_wiki.iloc[p]['personLabel'] 
  folium.CircleMarker ( [lat , lon ], 
                       radius=1.5, 
                       line_color='#3186cc',
                       fill_color='#3186cc', 
                       fill=True,
                       tooltip = name
                       ).add_to(world_map)

# Obtenemos el mapa

world_map

-------------------------------------------------------------

mapa con la procedencia de los futbolistas presentes en wikidata

Ejecutando el código se debería obtener una imagen como la de arriba, habiendo entonces completado un ejemplo de geocodificación – es decir, el acto de obtener los datos geográficos de latitud y longitud de los futbolistas sacados de Wikidata mediante una consulta SPARQL para posteriormente visualizarlos en un mapa.

Problemas de la geocodificación

A pesar de su utilidad, la geocodificación presenta problemas que siempre debemos recordar:

  • Datos faltantes: pese a que la geocodificación se base en datos precisos y complejos, puede darse el caso de que algunas direcciones falten o estén incompletas; complicando el proceso de ubicación.
  • Datos inconsistentes: si utilizamos datos de múltiples fuentes, puede que utilicen una nomenclatura u orden diferente a la hora de por ejemplo escribir el nombre de las calles, incrementando la dificultad del mapeo.
  • Datos obsoletos: algunos datos pueden estar basados en lugares con el nombre cambiado, mapas antiguos o imágenes satelitales antiguas y poco exactas, haciendo confusa -y poco precisa- la geocodificación.

Conclusión

La geocodificación es un proceso importante dentro de la ciencia de datos que permite vincular la información de ubicación geográfica con otros datos para su posterior mapeo y análisis. Permitiendo identificar patrones y establecer relaciones entre los datos. Además de ser importante en una gran variedad de áreas y servicios de los cuales todos hacemos uso; aún así, es importante tener en cuenta que la precisión de los resultados obtenidos depende en gran medida de la calidad de los datos de entrada, los algoritmos utilizados, y la calidad del servicio de geocodificación.