Animazione dei movimenti spaziali in Python

Animazione dinamica dei movimenti spaziali in Python

Come trasformare una matrice di origine-destinazione in un’animazione incantevole

Mappa statica degli spostamenti dai dati di bike sharing. Immagine dell'autore.

I dati spaziali sono intrinsecamente visivi e i progressi nella visualizzazione di dati (geo-)spaziali in Python hanno reso molto facile tracciare rapidamente mappe di tutte le forme e dimensioni. È anche possibile creare facilmente animazioni di grafici e mappe semplici. In particolare, le mappe coropletiche, con poligoni statici e colori che cambiano, possono essere facilmente create grazie a funzioni predefinite.

Ma quando si tratta di dati di movimento e di animare delle linee, il compito è un po’ più complicato. Qui cercherò di dare un esempio di come ho cercato di risolvere l’animazione dei dati di movimento spaziale in Python.

Dati iniziali

Per iniziare, abbiamo bisogno di alcuni dati con timestamp (linea-data); in questo esempio userò i dati di bike sharing del sistema di bike sharing di Oslo, in Norvegia. I dati sono liberamente disponibili sotto la Norwegian Licence for Open Government Data (NLOD) 2.0/Open Government License, dal sito web di Oslo Bysykkel.

import geopandas as gpd
import pandas as pd
# Importa dati da un file csv
data = pd.read_csv("https://data.urbansharing.com/oslobysykkel.no/trips/v1/2023/10.csv")
data = data[['started_at', 'ended_at', 'duration', 'start_station_latitude', 'start_station_longitude', 'end_station_latitude', 'end_station_longitude']]
# Seleziona solo i dati di un giorno
data['start_day'] = data['started_at'].apply(lambda x: int(x[8:11]))
data = data[data["start_day"]==day]
data

Dato che i dati consistono nei punti di partenza e arrivo dei viaggi, dobbiamo creare una linea tra i punti e per farlo possiamo utilizzare l’implementazione dell’algoritmo di Dijkstra in NetworkX.

Creazione delle linee di movimento

Prima di poter creare le linee di movimento, abbiamo bisogno di una rete di strade che possiamo utilizzare per il calcolo del percorso più breve. Con osmnx possiamo ottenere una rete ciclabile da OpenStreetMap dell’area di nostro interesse. Utilizzeremo l’estensione dei dati dei viaggi in bicicletta come area di studio.

import osmnx as ox
# Crea un GeoDataFrame dalle stazioni
initial_data = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data['start_station_longitude'], data['start_station_latitude']), crs="EPSG:4326")
# Ottieni i limiti totali
total_bounds = ...