5 librerías de Python para trabajar con OpenStreetMap

OpenStreetMap (OSM) es un proyecto colaborativo y de código abierto que proporciona mapas y datos geográficos de todo el mundo. Los datos incluyen geometrías como puntos, líneas y polígonos, así como etiquetas que describen características específicas (por ejemplo, highway=residential o building=school). Esta colección de datos puede ser utilizada de muchas formas. Aquí nos centraremos en 5 librerías de Python para trabajar con OpenStreetMap.

La lista que vamos a proponer aquí no es exhaustiva ni mucho menos, solo son algunas herramientas para visualizar, manejar mapas y datos de OSM.

librerías de Python para trabajar con OpenStreetMap

1. OSMnx

Para la descarga de datos de OSM desde Python podemos utilizar OSMnx que está construida sobre las librerías NetworkX y GeoPandas.

NetworkX es un paquete de Python para la creación, manipulación y estudio de la estructura, dinámica y funciones de redes complejas. Permite crear y analizar grafos a través del análisis de sus nodos, aristas y atributos. GeoPandas es una librería de Python de código abierto para trabajar con datos vectoriales.

Las características de OSMnx son las siguientes:

  • Permite descargar redes de calles de cualquier lugar del mundo mediante el uso de nombres de lugares, coordenadas geográficas o polígonos.
  • Incluye herramientas para analizar y manipular grafos de redes urbanas (por ejemplo, calcular la longitud de una calle o  encontrar la ruta más corta).
  • Puede descargar y procesar cualquier tipo de geometría de OSM usando etiquetas (por ejemplo, edificios, parques, carreteras, infraestructura).
  • Es compatible con filtrado avanzado por atributos de OSM para obtener datos específicos, como {«amenity»: «school»} para escuelas.
  • OSMnx puede simplificar automáticamente las redes de calles eliminando nodos redundantes y haciendo que la red sea más manejable para análisis.
  • Permite convertir entre diferentes formatos de datos geoespaciales, como convertir una red de calles en un GeoDataFrame de Geopandas.

Ejemplo de uso de OSMnx

Puedes empezar a probar facilmente OSMnx desde Google Colab.

Instalamos OSMnx con pip:

!pip install osmnx

Importamos la librería:

import osmnx as ox

Ahora podemos realizar una petición a los datos de OSM. Vamos a consultar la calles de la ciudad de Salamanca (España):

# Descargar la red de calles de Salamanca
G = ox.graph_from_place('Salamanca, Spain', network_type='drive')

# Dibujar el grafo
ox.plot_graph(G)
  • ox.graph_from_place(): Es una función de OSMnx que permite descargar y construir un grafo de la red de calles de un área geográfica específica.
  • network_type=’drive’: Indica el tipo de red de calles a descargar. El tipo ‘drive’ selecciona las calles accesibles para automóviles, excluyendo caminos peatonales y ciclovías.
Cálculo de rutas óptimas con NetworkX

El resultado es una colección de nodos y aristas representando el callejero de la ciudad de Salamanca, lo que nos puede servir, por ejemplo, para calcular rutas óptimas con NetworkX.

2. GeoPandas

GeoPandas es una extensión de Pandas para datos espaciales. Se trata de una de las librerías de Python para trabajar con OpenStreetMap que utiliza GeoDatrafames, un GeoDatrafame es como un Dataframe de Pandas pero con una columnas para datos espaciales. Por tanto la estrategia será utilizar los datos que descargamos con OSMnx para convertirlos en un Geodataframe.

En el ejemplo siguiente descargamos los datos referentes a los edificios de la ciudad de Salamanca, los convertimos a Geodaframe y los visualizamos con Matplotlib:

import osmnx as ox
import geopandas as gpd
import matplotlib.pyplot as plt

# Configurar el nombre del lugar (por ejemplo, una ciudad o un área específica)
place_name = "Salamanca, Spain"

# Descargar los datos de edificios de la región especificada
buildings = ox.geometries_from_place(place_name, tags={"building": True})

# Convertir a GeoDataFrame de Geopandas 
buildings_gdf = gpd.GeoDataFrame(buildings)

# Visualizar los edificios con Geopandas y Matplotlib
buildings_gdf.plot(figsize=(12, 12), color='red')

plt.title("Edificios en Salamanca")
plt.xlabel("Longitud")
plt.ylabel("Latitud")
plt.show()

El resultado lo vemos a continuación:

Edificios de Salamanca (descarga con GeoPandas)

3. Pyrosm

Pyrosm es una biblioteca Python para leer archivos OpenStreetMap en el formato Protocolbuffer Binary Format (PBF) permitiendo convertirlos en un GeoDataFrames. Pyrosm facilita la extracción de varios conjuntos de datos de los archivos pbf de OpenStreetMap, incluidos, por ejemplo, redes de carreteras, edificios, puntos de interés (POI), uso del suelo, elementos naturales, límites administrativos etc… Permite configurar las consultas , lo que permite analizar cualquier tipo de datos de OSM, incluso con filtros más específicos.

Pyrosm es fácil de usar y ofrece una interfaz de usuario similar a la de OSMnx. La principal diferencia entre pyrosm y OSMnx es que OSMnx lee los datos mediante una API de OverPass, mientras que Pyrosm lee los datos de los volcados de datos locales de OSM que se descargan de los proveedores de datos PBF (Geofabrik, BBBike). Esto permite analizar los datos de OSM más rápido y hace más factible la extracción de datos que cubren regiones extensas.

4. request: consultas a OpenStreetMap mediante la API de Overpass

En este caso necesitamos importar la biblioteca requests, que se utiliza para realizar solicitudes HTTP en Python.

import requests

Escribimos a continuación la petición de los datos. En el ejemplo siguiente vamos a realizar una petición de los datos de los museos de la ciudad de Salamanca.

overpass_url = "http://overpass-api.de/api/interpreter"
overpass_query = """
    [out:json];
    node["tourism"="museum"](40.9400,-5.7150,40.9940,-5.6100);
    out;
"""

# Realizar la solicitud
response = requests.get(overpass_url, params={'data': overpass_query})

# Convertir la respuesta a JSON
data = response.json()

# Mostrar los resultados
for element in data['elements']:
    print(f"ID: {element['id']} - Lat: {element['lat']} Lon: {element['lon']}")

En la primera línea se puede observar la URL del endpoint de la API de Overpass, que se utiliza para enviar consultas a la base de datos de OpenStreetMap.

A continuación se realiza la consulta utilizando el formato Overpass QL.

  • [out:json];: Especifica que la salida de la consulta debe estar en formato JSON, que es fácil de procesar con Python.
  • node[«tourism»=»museum»]: Busca nodos en OpenStreetMap que tengan la etiqueta tourism=museum, es decir, que representen museos.
  • (40.7128,-74.0060,40.7138,-73.9950);: Define un cuadro delimitador (bounding box) usando coordenadas de latitud y longitud.
  • out;: Indica que se deben devolver los resultados.

Luego se realizar la solicitud y se convierten los datos a JSON. Por último se muestran los resultados, que será una lista de los museos contenidos en los límites señalados.

ID: 1316127394 - Lat: 40.9600241 Lon: -5.6684191 
ID: 7710283964 - Lat: 40.9580491 Lon: -5.667846 
ID: 8223859727 - Lat: 40.9661153 Lon: -5.6674698 
ID: 8223859729 - Lat: 40.9620945 Lon: -5.6606547 
ID: 8777617581 - Lat: 40.949114 Lon: -5.6272316 
ID: 8792621486 - Lat: 40.9602062 Lon: -5.664677

5. Folium: creación de mapas interactivos con datos de OpenStreetMap

Folium nos permite crear un mapa con una capa de fondo de OpenstreetMap de forma rápida y sencilla.

Folium es una biblioteca de Python utilizada para la creación de mapas interactivos de manera sencilla y eficiente. Está construida sobre la biblioteca de JavaScript Leaflet.js, que es una de las herramientas más populares para crear mapas web interactivos. Folium permite a los usuarios de Python integrar fácilmente mapas en sus aplicaciones y análisis sin necesidad de trabajar directamente con JavaScript.

Importamos Folium.

import folium

Ahora necesitamos definir el centro del mapa y a continuación hacemos una instancia a Map para indicar el nivel de zoom inicial estableciendo la capa de OpenStreetMap como mapa de tiles.

# Definir las coordenadas centrales de Salamanca
salamanca_coords = [40.9644, -5.6635]

# Crear un mapa centrado en Salamanca con Folium
mapa_salamanca = folium.Map(location=salamanca_coords, zoom_start=14, tiles="OpenStreetMap")
mapa_salamanca

Si quieres continuar aprendiendo a trabajar con más librerías de Python puedes inscribirte en el curso online de Análisis Geoespacial con Python, que comenzará próximamente y que incluye alguna de estas librerías de Python para trabajar con OpenStreetMap.

Deja un comentario