que es la geocodificacion
Mapa con silueta multicolor.

¿Qué Es La Geocodificación?

La geocodificación es el acto de transformar direcciones, nombres de lugares y otra información de ubicación en coordenadas geográficas (en valores de latitud y longitud), para fines de mapeo y análisis. Este proceso posibilita la unión de datos geográficos con otros conjuntos de datos, permitiendo el análisis y la visualización de los patrones y relaciones que se dan entre ellos.

Tipos De Geocodificación

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

  1. 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.
  2. Basada en 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.
  3. Inversa: convierte las coordenadas en la correspondiente dirección. Eficaz a la hora de analizar datos de sistemas antiguos.
  4. 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. Estos análisis espaciales pueden involucrar el uso de técnicas estadísticas y algoritmos que incorporan datos de ubicación y otras variables para identificar patrones geográficos significativos. Esta capacidad 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, la calidad de estos, el algoritmo utilizado y el servicio de geocodificación elegido. No todos los servicios de geocodificación 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 eficaces para garantizar resultados precisos.

Por ejemplo, Google Maps es una opción popular para la geocodificación, pero hay muchas otras disponibles, como Bing Maps, OpenStreetMap, y MapQuest. A la hora de comparar estos servicios, se deben tener en cuenta factores como la facilidad de uso, la rapidez en proporcionar resultados, la cobertura global y la precisión en localizaciones rurales o en áreas con direcciones más complejas.

Geocodificación y Ciencia de Datos

La geocodificación se integra ampliamente en la ciencia de datos. Su uso en campos como la epidemiología, donde puede ayudar a rastrear y predecir la propagación de enfermedades, y la logística, donde puede optimizar las rutas de entrega, son solo dos ejemplos de su utilidad.

La geocodificación también se aplica en el marketing, permitiendo a las empresas orientar su publicidad en base a las ubicaciones de sus clientes y a análisis de datos geográficos. El análisis de datos geográficos proporciona información detallada sobre tendencias de consumo, áreas de alta demanda y patrones de comportamiento, lo que ayuda a las empresas a diseñar estrategias de marketing más efectivas y personalizadas.

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

# En caso de no usar notebooks, eliminar '!'
!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. Esto suele ser consecuencia de áreas geográficas menos desarrolladas o menos mapeadas, nuevas construcciones o cambios recientes en la infraestructura de una zona.
  • 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. Por ejemplo, una fuente puede listar una dirección como “Calle 50 #10-34”, mientras que otra puede referirse a la misma ubicación como “50 Calle, 10-34”.
  • 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.