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.
Índice
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.
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:
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.
Tutor del curso online de Análisis GeoEspacial con Python y de los cursos online de webmapping. Echa un vistazo a todos nuestros cursos de SIG online.