Analisi dei dati geospaziali con OSMnx

Geospatial Data Analysis with OSMnx

Scopri come scaricare, analizzare e visualizzare i dati di OpenStreetMap con Python

Foto di Denys Nevozhai su Unsplash

Questo è il quarto articolo della serie riguardante l’Analisi dei Dati Geospaziali:

  1. Analisi dei Dati Geospaziali usando QGIS
  2. Guida per iniziare con OpenStreetMap
  3. Analisi dei Dati Geospaziali con GeoPandas
  4. Analisi dei Dati Geospaziali con OSMnx (questo post)

Nelle precedenti lezioni, ho coperto vari aspetti dell’Analisi dei Dati Geospaziali. Ho iniziato mostrando esempi pratici di dati geospaziali senza utilizzare alcun codice per farti comprendere a fondo i concetti. L’analisi dei dati geospaziali è un campo ubiquo che si occupa di lavorare con un tipo speciale di dati, i dati geospaziali.

Consiste nell’aggiungere la posizione ai dati non geografici. È pieno di esempi. Puoi semplicemente pensare a caffè, ospedali, strade, fiumi, immaginari satellitari e molto altro. Anche quando cerchi un luogo con Google Maps, stai interagendo con dati geospaziali.

Questa volta mi concentrerò sul download, la visualizzazione e l’analisi dei dati di OpenStreetMap, che è il più grande database geografico gratuito ed editabile, dove ci sono volontari provenienti da tutto il mondo che collaborano in questo enorme progetto. Questo tutorial è possibile grazie ad un pacchetto Python, chiamato OSMnx. Cominciamo!

Indice:

  • Introduzione a OSMNx
  • Scarica e visualizza i dati di OSM
  • Converti il grafo in GeoDataframe
  • Estrai i punti di interesse
  • Trova il percorso più breve

Introduzione a OSMNx

OSMnx è una libreria per il download, l’analisi e la visualizzazione dei dati di rete di OpenStreetMap. Dipende da due librerie, NetworkX e GeoPandas. In particolare, sfrutta il modulo graph della libreria NetworkX per recuperare i dati di rete.

Inoltre, ci consente di interagire con due API di OpenStreetMap:

  • Nominatim per il geocoding, che consiste nel trovare luoghi per nome e indirizzo.
  • Overpass API per estrarre i punti di interesse, come autostrade, scuole e parchi.

Scarica e visualizza i dati di OSM

Invece di scaricare manualmente i dati dal sito web o da Geofabrik, possiamo farlo direttamente con OSMnx.

Prima di tutto, dobbiamo importare quattro librerie, che verranno utilizzate in seguito nel tutorial:

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

Oltre a OSMnx e matplotlib, sfrutteremo folium, che è ben noto per la sua capacità di creare una mappa interattiva a foglia, e contextily per aggiungere la mappa di sfondo. Questo aspetto può essere molto importante per ottenere mappe realistiche.

Come l’altra volta, leggiamo e visualizziamo i dati della rete stradale di OSM di Bologna, una delle città più grandi d’Italia.

NOME_POSTO = 'Bologna, Italia'G = ox.graph_from_place(NOME_POSTO, network_type='drive')ox.plot_graph(G) 
Visualizzazione in bianco e nero di Bologna

Dalla visualizzazione in bianco e nero, possiamo osservare i punti, che rappresentano i nodi, e le linee, che rappresentano le linee. Rispetto al sito web di OpenStreetMap, può sembrare molto statico e di base. Folium ci viene in aiuto con le sue mappe forti ed interpretabili:

ox.plot_graph_folium(G)
Mappa di Bologna ottenuta con Folium

Questa è molto meglio, non credi? I colori vivaci e la possibilità di interagire con la mappa sono caratteristiche cruciali quando usiamo Google Maps per andare in posti sconosciuti.

Se controlli meglio il sito di OpenStreetMap, puoi notare che c’è il livello Standard come predefinito. Oltre al livello Standard, ci sono altri livelli, come ciclo mappa e trasporto mappa. È incredibile come possiamo sfruttare diversi livelli a seconda delle nostre finalità.

Se siamo appassionati di biciclette, saremmo più interessati alla mappa ciclo. Ciò è possibile sempre con una sola riga di codice:

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

Stiamo prendendo in considerazione il grafico standard nelle sezioni successive.

Converti il grafico in GeoDataFrame

Gestire i grafici non è intuitivo come lavorare con i Dataframe e i GeoDataframe. Per questo motivo, potremmo voler convertire il grafico in un GeoDataframe:

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

edges.head()

Puoi notare che abbiamo ottenuto due GeoDataframe, uno per i nodi e uno per le edges. È chiaro se si guarda la geometria. L’area GeoDataFrame ha solo una coppia di coordinate, latitudine e longitudine, mentre ci sono due coppie di coordinate nel GeoDataFrame che contiene le edges.

Estrai i punti di interesse

Nel lavoro sui progetti di data science, cerchiamo di aggiungere informazioni al nostro dataset cercando dati aperti su internet. Dai dati OSM, è possibile estrarre i punti di interesse (POI), che sono luoghi che potremmo trovare interessanti a seconda dello scopo della nostra analisi. Esempi sono ristoranti, chiese, musei e parchi.

Ad esempio, vorremmo analizzare il traffico a Bologna per ottimizzare e ridurre il costo del trasporto. In questo contesto, sarebbe utile conoscere le autostrade, le stazioni di servizio, i parcheggi e altri luoghi che sono legati al possibile collo di bottiglia.

Prendiamo tutte le stazioni di servizio nella città. Ciò è possibile specificando il carburante come valore della chiave amenity.

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

Dal momento che abbiamo estratto tutte le stazioni di servizio, sarebbe più utile capire dove si trovano visualizzando la mappa. Inoltre, possiamo aggiungere la mappa di base per contestualizzare meglio i nostri risultati.

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())

È fantastico! Possiamo notare che la maggior parte delle stazioni di servizio sono concentrate nella periferia. Inoltre, possiamo distinguere diversi gruppi di stazioni di servizio, che dovrebbero essere presi in considerazione quando si misura il traffico fuori dal centro.

Trovare il percorso più breve

Un’altra funzionalità utile della libreria OSMnx è la possibilità di calcolare il percorso più breve tra due punti.

origin = (    ox.geocode_to_gdf("Parco della Montagnola, Bologna, Italia")     .to_crs(edges.crs)      .at[0, "geometry"]      .centroid  )destination = (    ox.geocode_to_gdf("Esso, Bologna, Italia")    .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)

Ciò è possibile con il metodo shortest_path() che utilizza per impostazione predefinita l’algoritmo di Dijkstra per calcolare il percorso tra il nodo di origine e il nodo di destinazione.

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

Possiamo anche provare a visualizzare sia il grafo che il percorso più breve in una mappa unica:

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

Et voilà! È come se avessimo usato Google Maps per trovare la strada, ma invece abbiamo sfruttato la funzionalità della libreria OSMnx per cercarla.

Considerazioni finali:

Questo è stato una guida per farti sapere come lavorare con i dati di OSM utilizzando Python. Ho scoperto che OSMnx è la libreria Python più completa per gestire i dati di OpenStreetMap. Naturalmente, è più adatto per esplorare luoghi più piccoli, come le città. Nel caso in cui ci siano set di dati più grandi, è meglio utilizzare software più specializzati, come QGIS, per visualizzarli. Hai provato altre librerie per lavorare con i dati di OSM? Commenta la storia se lo sai. Dai un’occhiata al codice qui . Grazie per aver letto! Buona giornata!

Risorse utili:

  • Documentazione di OSMnx
  • Punti di interesse
  • OSMnx: Python per le reti stradali
  • Automazione dei processi GIS