Python

Python per l'elaborazione di dati spaziali: tecniche avanzate con GeoPandas

Python per l'elaborazione di dati spaziali: tecniche avanzate con GeoPandas
LT
Luca Terribili
Autore

Con GeoPandas è possibile caricare, trasformare e visualizzare dataset georiferiti senza dover ricorrere a software GIS tradizionali. La libreria si appoggia a Shapely per la manipolazione delle geometrie, a Fiona per l’accesso ai file vettoriali, a Pyproj per le conversioni di sistemi di riferimento e a Matplotlib per la creazione di mappe di alta qualità. Questa integrazione rende l’intero workflow di analisi spaziale rapido, efficiente e completamente programmabile in Python.

Nel resto dell’articolo approfondiremo come sfruttare GeoPandas per lavorare con dati geografici, eseguire operazioni avanzate di analisi e presentare visualizzazioni accattivanti. Ogni sezione è arricchita da esempi pratici e spiegazioni dettagliate, pensate per guidare sia i principianti che gli utenti esperti verso una migliore comprensione delle potenzialità offerte da questo ecosistema.

Lavorare con i dati spaziali

I dati geografici sono generalmente rappresentati mediante coordinate riferite a uno specifico sistema di riferimento (CRS). La corretta gestione del CRS è fondamentale per garantire che le operazioni di sovrapposizione, misurazione e analisi produrrebbero risultati accurati. GeoPandas semplifica questa attività, consentendo di rilevare automaticamente il CRS di un GeoDataFrame e di trasformarlo in modo trasparente quando necessario.

Il seguente esempio mostra come caricare un file shapefile, verificare il CRS originale e convertirlo al sistema di riferimento globale WGS84 (EPSG:4326). Questa conversione è particolarmente utile quando i dati provengono da fonti diverse e devono essere unificati per ulteriori analisi.

import geopandas as gpd  # Caricamento di un file shapefile
gdf = gpd.read_file("dati/strade.shp")
print(gdf.crs)  # CRS originale
gdf = gdf.to_crs(epsg=4326)  # Conversione al CRS WGS84

Una delle sfide più comuni nella gestione dei dati spaziali è la georeferenziazione di informazioni prive di coordinate, come indirizzi testuali. Utilizzando la libreria geopy, è possibile trasformare un indirizzo in coordinate latitudine/longitudine, rendendo così possibile l’integrazione con il resto del dataset georiferito.

from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="geo_example")
location = geolocator.geocode("Piazza del Duomo, Milano")
print(location.latitude, location.longitude)

Grazie a questi strumenti, anche gli utenti meno esperti possono arricchire i propri dati con informazioni spaziali di alta precisione, aprendo la porta a nuove analisi e visualizzazioni.

Tecniche avanzate di elaborazione di dati spaziali con GeoPandas

Le funzionalità di base di GeoPandas consentono di gestire e visualizzare i dati, ma la vera potenza della libreria si manifesta quando si combinano le sue capacità con quelle di altre librerie Python. In questa sezione esploreremo tre ambiti chiave: manipolazione dei dati, visualizzazione e analisi avanzata, ognuno corredato da esempi concreti.

Manipolazione dei dati

Grazie alla stretta integrazione con Pandas, è possibile filtrare, aggregare e trasformare i dati spaziali con poche righe di codice. Un’operazione tipica è la selezione di tutti gli oggetti che si trovano entro un certo raggio da un punto di interesse, ad esempio entro 5 km da un punto centrale di Milano.

from shapely.geometry import Point  # Punto di riferimento
centro = Point(9.1900, 45.4642)  # Milano (lon, lat)

# Creazione di un buffer di 5 km (in metri, quindi usiamo un CRS proiettato)
gdf_proj = gdf.to_crs(epsg=32632)  # UTM zone 32N
centro_proj = gpd.GeoSeries([centro], crs="EPSG:4326").to_crs(epsg=32632).iloc[0]
buffer = centro_proj.buffer(5000)  # 5 km

# Selezione geometrie che intersecano il buffer
vicini = gdf_proj[gdf_proj.intersects(buffer)]

Questo approccio sfrutta la capacità di Shapely di creare buffer e la trasformazione di coordinate tramite Pyproj, garantendo che le misure di distanza siano corrette. Dopo aver ottenuto il sottoinsieme “vicini”, è possibile eseguire ulteriori analisi, ad esempio calcolare la lunghezza totale delle strade o aggregare dati demografici per quella zona specifica.

Visualizzazione dei dati

Una buona visualizzazione è fondamentale per comunicare i risultati di un’analisi spaziale. Con Matplotlib integrato in GeoPandas, è possibile generare mappe tematiche personalizzate in pochi passaggi. Il codice seguente produce una mappa della rete stradale, colorando le strade in base alla loro classe (autostrada, arteria principale, ecc.) e aggiungendo una leggenda esplicativa.

import matplotlib.pyplot as plt
ax = gdf.plot(figsize=(10, 8), edgecolor='gray', column='classe_stradale', legend=True)
ax.set_title("Rete stradale per classe")
plt.show()

L’opzione column permette di associare un colore a ciascuna categoria, mentre edgecolor migliora la leggibilità dei contorni. È inoltre possibile personalizzare colori, stili di linea e aggiungere layers aggiuntivi, ad esempio punti di interesse o aree censuarie, combinando più GeoDataFrame in una singola visualizzazione.

Analisi dei dati

L’analisi spaziale può andare ben oltre la semplice visualizzazione, includendo tecniche statistiche avanzate che tengono conto della posizione geografica. Di seguito presentiamo tre esempi rappresentativi: analisi di vicinato, regressione spaziale e clustering spaziale.

Analisi di vicinato – individuare i punti più prossimi

Utilizzando le funzioni di Shapely, è possibile determinare per ciascuna geometria il punto più vicino all’interno dello stesso dataset. Questo tipo di operazione è utile per analizzare la densità di infrastrutture o per identificare collocazioni critiche.

from shapely.ops import nearest_points

def nearest(row, other):
    nearest_geom = nearest_points(row.geometry, other.unary_union)[1]
    return nearest_geom

gdf['nearest_point'] = gdf.apply(nearest, axis=1, other=gdf)

Il risultato è una nuova colonna che contiene la geometria del punto più vicino, aprendo la strada a calcoli di distanza, analisi di rete o valutazioni di accessibilità.

Regressione spaziale – modellare variabili dipendenti in funzione della posizione

Per studiare fenomeni influenzati dal contesto geografico, come la criminalità o la diffusione di malattie, si ricorre a modelli di regressione spaziale. L’esempio utilizza pysal, una libreria dedicata all’analisi spaziale, per costruire un modello SAR (Spatial Autoregressive) basato su un peso di vicinato k‑nearest neighbours.

import libpysal
import spreg  # Variabili indipendenti
X = gdf[['popolazione', 'densita']].values
y = gdf['indice_criminalità'].values

# Matrice di pesi basata sul k‑nearest neighbours
w = libpysal.weights.KNN.from_dataframe(gdf, k=5)
w.transform = 'r'

# Modello di regressione spaziale (SAR)
model = spreg.GM_Lag(y, X, w=w, name_y='indice_criminalità',
                    name_x=['popolazione', 'densita'])
print(model.summary)

Il modello tiene conto dell’influenza dei dati circostanti, migliorando l’accuratezza delle previsioni rispetto a una regressione tradizionale. È possibile estendere l’analisi includendo ulteriori covariate o utilizzando diversi schemi di pesi spaziali.

Clustering spaziale – raggruppare geometrie simili

Il clustering permette di identificare aree omogenee all’interno di un territorio. Combinando scikit‑learn con le coordinate dei centroidi delle geometrie, è possibile creare gruppi di punti con caratteristiche similari, ad esempio per definire zone di intervento urbano o per segmentare il mercato.

from sklearn.cluster import KMeans

# Calcolo dei centroidi
centroids = gdf.geometry.centroid
coords = centroids.apply(lambda p: [p.x, p.y]).tolist()

kmeans = KMeans(n_clusters=4, random_state=0).fit(coords)
gdf['cluster'] = kmeans.labels_

# Visualizzazione dei cluster
gdf.plot(column='cluster', cmap='Set2', legend=True, figsize=(8, 6))
plt.title("Clustering spaziale dei punti")
plt.show()

Il risultato è una mappa suddivisa in quattro gruppi, ogni colore rappresenta un cluster distintivo. Questa visualizzazione facilita l’individuazione di pattern geospaziali e supporta decisioni basate su evidenze territoriali.

Conclusioni

Abbiamo mostrato come GeoPandas, in sinergia con librerie come Shapely, Fiona, Pyproj, Matplotlib, geopy, pysal e scikit‑learn, costituisca un ecosistema completo per il workflow di analisi spaziale. Dalla lettura e trasformazione dei dati, passando per operazioni di filtraggio e aggregazione, fino alla creazione di mappe tematiche e all’applicazione di tecniche statistiche avanzate, tutto è gestibile interamente in Python.

La combinazione di una sintassi intuitiva con potenti capacità computazionali rende GeoPandas una scelta ideale per professionisti di enti pubblici, aziende private e organizzazioni non profit. Che si tratti di pianificazione urbana, monitoraggio ambientale o analisi socio‑economiche, gli strumenti presentati permettono di estrarre valore dai dati geografici in modo rapido ed efficace.

Invitiamo i lettori a sperimentare con i propri dataset, a esplorare ulteriori funzioni della libreria e a contribuire alla comunità open‑source. La continuità dell’evoluzione di GeoPandas e delle sue dipendenze garantisce che le possibilità di analisi spaziale in Python continueranno a crescere, aprendo nuove frontiere per il data science geospaziale.

Vedi tutti →
Anteprima articolo: Introduzione a SQLAlchemy

Introduzione a SQLAlchemy

Una delle sue qualità più apprezzate è la portabilità: lo stesso codice può funzionare con SQLite, MySQL, PostgreSQL, Oracle e altri sistemi, grazie a una stringa di connessione unificata