Análisis de datos geoespaciales con OSMnx

'Geospatial data analysis with OSMnx'

Aprende cómo descargar, analizar y visualizar datos de OpenStreetMap con Python

Foto de Denys Nevozhai en Unsplash

Este es el cuarto artículo de la serie sobre Análisis de Datos Geoespaciales:

  1. Análisis de Datos Geoespaciales con QGIS
  2. Guía para empezar con OpenStreetMap
  3. Análisis de Datos Geoespaciales con GeoPandas
  4. Análisis de datos geoespaciales con OSMnx (este post)

En los tutoriales previos, cubrí varios aspectos del Análisis de Datos Geoespaciales. Empecé mostrando ejemplos prácticos de datos geoespaciales sin usar ningún código para que puedas entender profundamente los conceptos. El análisis de datos geoespaciales es un campo ubicuo que se dedica a trabajar con un tipo especial de datos, los datos geoespaciales.

Consiste en agregar la ubicación a datos no geográficos. Está lleno de ejemplos. Puedes pensar en cafeterías, hospitales, carreteras, ríos, imágenes satelitales y mucho más. Incluso cuando buscas un lugar con Google Maps, estás interactuando con datos geoespaciales.

Esta vez me voy a enfocar en descargar, visualizar y analizar datos de OpenStreetMap, que es la base de datos geográfica gratuita y editable más grande, donde hay voluntarios de todo el mundo que colaboran en este enorme proyecto. Todo este tutorial es posible gracias a un paquete de Python llamado OSMnx. ¡Empecemos!

Tabla de contenidos:

  • Introducción a OSMNx
  • Descargar y visualizar datos de OSM
  • Convertir grafo a GeoDataframe
  • Extraer puntos de interés
  • Encontrar la ruta más corta

Introducción a OSMNx

OSMnx es una biblioteca para descargar, analizar y visualizar datos de red de OpenStreetMap. Depende de dos bibliotecas, NetworkX y GeoPandas. En particular, explota el módulo graph de la biblioteca NetworkX para recuperar datos de red.

Además, nos permite interactuar con dos API de OpenStreetMap:

  • Nominatim para geocodificación, que consiste en encontrar ubicaciones por nombre y dirección.
  • Overpass API para extraer puntos de interés, como carreteras, escuelas y parques.

Descargar y visualizar datos de OSM

En lugar de descargar los datos manualmente desde el sitio web o desde Geofabrik, podemos hacerlo directamente con OSMnx.

Primero, necesitamos importar cuatro bibliotecas que se utilizarán más adelante en el tutorial:

import osmnx as oximport foliumimport contextily as cximport matplotlib.pyplot as plt

Además de OSMnx y matplotlib, vamos a aprovechar folium, que es conocido por su capacidad para crear un mapa interactivo de hoja, y contextily para agregar el mapa de fondo. Este aspecto puede ser muy importante para obtener mapas realistas.

Al igual que la otra vez, leemos y visualizamos los datos de la red de calles de OSM de Bolonia, una de las ciudades más grandes de Italia.

PLACE_NAME = 'Bologna, Italy'G = ox.graph_from_place(PLACE_NAME, network_type='drive')ox.plot_graph(G) 
Visualización en blanco y negro de Bolonia

Desde la visualización en blanco y negro, podemos observar los puntos, que representan los nodos, y las líneas, que representan las líneas. En comparación con el sitio web de OpenStreetMap, puede parecer muy estático y básico. Folium viene a rescatarnos con sus mapas sólidos e interpretables:

ox.plot_graph_folium(G)
Mapa de Bologna obtenido con Folium

¡Esto es mucho mejor, ¿no crees? Los colores brillantes y la posibilidad de interactuar con el mapa son características cruciales cuando usamos Google Maps para ir a lugares desconocidos.

Si revisas mejor el sitio web de OpenStreetMap, puedes notar que la capa estándar es la predeterminada. Además de la capa estándar, hay otras capas, como el Mapa de Ciclismo y el Mapa de Transporte. Es increíble cómo podemos explotar diferentes capas según nuestros propósitos.

Si somos apasionados por las bicicletas, estaríamos más interesados en el Mapa de Ciclismo. Esto es posible siempre con una línea de código:

G = ox.graph_from_place(PLACE_NAME, network_type='bike')

Estamos considerando el gráfico estándar en las siguientes secciones.

Convertir el gráfico a GeoDataframe

Lidiar con gráficos no es tan intuitivo como trabajar con Dataframes y GeoDataframes. Por esta razón, es posible que deseemos convertir el gráfico a un GeoDataframe:

area,edges = ox.graph_to_gdfs(G)area.head()

edges.head()

Puedes notar que hemos obtenido dos GeoDataframes, uno para nodos y otro para aristas. Es evidente si se observa la geometría. El GeoDataFrame de área tiene solo un par de coordenadas, latitud y longitud, mientras que hay dos pares de coordenadas en el GeoDataFrame que contiene aristas.

Extraer Puntos de Interés

Cuando trabajamos en proyectos de ciencia de datos, intentamos agregar información a nuestro conjunto de datos buscando datos abiertos en Internet. A partir de los datos de OSM, es posible extraer Puntos de Interés (POI), que son lugares que podríamos encontrar interesantes dependiendo del propósito de nuestro análisis. Ejemplos son restaurantes, iglesias, museos y parques.

Por ejemplo, nos gustaría analizar el tráfico en Bologna para optimizar y reducir el costo del transporte. En este contexto, sería útil conocer las autopistas, las gasolineras, los estacionamientos y otros lugares que están relacionados con el posible cuello de botella.

Tomemos todas las gasolineras de la ciudad. Esto es posible especificando combustible como el valor de la clave de amenidad.

fuel_stations = ox.geometries_from_place(    PLACE_NAME,    {"amenity": "fuel"},)fuel_stations.head()

Dado que hemos extraído todas las gasolineras, sería más útil comprender dónde se encuentran mediante la visualización del mapa. Además, podemos agregar el mapa base para contextualizar mejor nuestros resultados.

area_crs = area.to_crs('3857')edges_crs = edges.to_crs('3857')fuel_stations_crs = fuel_stations.to_crs('3857')fig, ax = plt.subplots(figsize=(10, 14))area_crs.plot(ax=ax, facecolor='white')edges_crs.plot(ax=ax, linewidth=1, edgecolor='blue')fuel_stations_crs.plot(ax=ax, color='red', alpha=0.9, markersize=12)plt.tight_layout()cx.add_basemap(ax,crs=area_crs.crs.to_string())

¡Eso es genial! Podemos notar que la mayoría de las estaciones de servicio están concentradas en la periferia. Además, podemos distinguir diferentes grupos de estaciones de servicio, que deberían tenerse en cuenta al medir el tráfico fuera del centro.

Encuentra la ruta más corta

Otra funcionalidad útil de la biblioteca OSMnx es la posibilidad de calcular la ruta más corta entre dos puntos.

origin = (    ox.geocode_to_gdf("Parco della Montagnola, Bologna, Italy")     .to_crs(edges.crs)      .at[0, "geometry"]      .centroid  )destination = (    ox.geocode_to_gdf("Esso, Bologna, Italy")    .to_crs(edges.crs)    .at[0, "geometry"]    .centroid )origin_node_id = ox.nearest_nodes(G, origin.x, origin.y)destination_node_id = ox.nearest_nodes(G, destination.x, destination.y)

Esto es posible con el método shortest_path() que utiliza por defecto el algoritmo Dijkstra para calcular la ruta entre el nodo de origen y el nodo de destino.

route = ox.shortest_path(G, origin_node_id, destination_node_id)route#[400881920,# 250763178,# 250763179,# 250763533, ...# 1694666466]

También podemos tratar de visualizar tanto el grafo como la ruta más corta en un mapa único:

ox.plot_route_folium(G, route, route_linewidth=6, node_size=0)

¡Et voilà! Es como si hubiéramos usado Google Maps para encontrar el camino, pero en su lugar, utilizamos la funcionalidad de la biblioteca OSMnx para buscarlo.

Pensamientos finales:

Esta fue una guía para informarte sobre cómo trabajar con datos de OSM utilizando Python. He encontrado que OSMnx es la biblioteca Python más completa para trabajar con datos de OpenStreetMap. Por supuesto, es más adecuado para explorar lugares más pequeños, como ciudades. En el caso de que haya conjuntos de datos más grandes, es mejor utilizar software más especializado, como QGIS, para visualizarlos. ¿Has probado otras bibliotecas para trabajar con datos de OSM? Por favor, comenta en la historia si lo conoces. Échale un vistazo al código aquí . ¡Gracias por leer! ¡Que tengas un buen día!

Recursos útiles:

  • Documentación de OSMnx
  • Puntos de interés
  • OSMnx: Python para redes de calles
  • Automatización de procesos de SIG