Quadro scientificoScientific framework

La metodologia del movimento urbano The methodology of urban movement

Questa pagina descrive come raccogliamo, elaboriamo e analizziamo i dati sulla velocità e le fermate dei tram di Milano. VeloTrack è un progetto open-source: tutto il codice sorgente è disponibile su GitHub. This page describes how we collect, process, and analyze data about Milan's tram speeds and stops. VeloTrack is an open-source project: all source code is available on GitHub.

database

1. Raccolta dati1. Data collection

Tracce GPSGPS traces

I dati provengono da tracciati GPS registrati a bordo dei tram di Milano da volontari tramite app di tracking (come Strava, OsmAnd, o simili). I file vengono esportati in formato GPX (GPS Exchange Format), uno standard aperto ampiamente utilizzato. Ogni traccia contiene una sequenza di punti con latitudine, longitudine, quota e timestamp. Data comes from GPS traces recorded aboard Milan trams by volunteers using tracking apps (such as Strava, OsmAnd, or similar). Files are exported in GPX (GPS Exchange Format), a widely-used open standard. Each trace contains a sequence of points with latitude, longitude, elevation, and timestamp.

Fermate tram (GTFS)Tram stops (GTFS)

Le posizioni delle fermate tram sono scaricate dal dataset GTFS (General Transit Feed Specification) ufficiale del Comune di Milano, pubblicato come open data su dati.comune.milano.it. Tram stop locations are downloaded from the official GTFS (General Transit Feed Specification) dataset published by the City of Milan as open data on dati.comune.milano.it.

SemaforiTraffic lights

Le posizioni dei semafori che intersecano i percorsi tranviari sono mappate manualmente dai volontari tramite una mappa interattiva integrata nel progetto. Ogni semaforo è georeferenziato con coordinate precise. Traffic light positions along tram routes are manually mapped by volunteers using an interactive map built into the project. Each traffic light is georeferenced with precise coordinates.

location_on

2. Elaborazione GPS2. GPS parsing

Per ogni file GPX, il sistema ordina i punti per timestamp e calcola, tra ogni coppia di punti consecutivi: For each GPX file, the system sorts points by timestamp and computes, between each pair of consecutive points:

  • Distanza: formula dell'emisenoverso (haversine). Distance: haversine formula.
  • Intervallo di tempo: differenza in secondi. Time delta: difference in seconds.
  • Velocità: distanza / tempo × 3.6 Velocity: distance / time × 3.6

Le velocità superiori a 50 km/h vengono limitate per filtrare errori GPS. Speeds above 50 km/h are capped to filter GPS errors.

route

3. Allineamento ai binari e filtro teleport3. Track snapping & teleport filter

Allineamento OSMOSM track snapping

I punti GPS hanno un'imprecisione di 5–10 m. Per ottenere una geometria pulita sulle mappe, ogni punto viene proiettato sui binari reali della linea tramviaria corrispondente, usando la geometria railway=tram di OpenStreetMap. Un bonus di continuità favorisce segmenti adiacenti, evitando salti tra binari paralleli o agli scambi. Solo latitudine e longitudine vengono aggiornate — distanze e velocità originali sono preservate per mantenere curve di accelerazione realistiche. GPS points have 5–10 m of inherent inaccuracy. For clean map geometry, each point is projected onto the actual tram tracks for its line, using OpenStreetMap railway=tram geometry. A forward-chain continuity bonus favors adjacent segments, preventing jumps between parallel tracks or at switches. Only lat/lon are updated — original distances and velocities are preserved to maintain realistic acceleration curves.

Filtro teleportTeleport filter

Quando il ricevitore GPS perde il segnale, i punti possono "teletrasportarsi" avanti e indietro per centinaia di metri. Una finestra scorrevole confronta la distanza cumulativa con lo spostamento netto: se il rapporto supera 5×, quei punti vengono rimossi e la traccia si interrompe in modo pulito. When the GPS receiver loses lock, points can "teleport" back and forth over hundreds of meters. A sliding window compares cumulative distance to net displacement: if the ratio exceeds 5×, those points are removed and the trace breaks cleanly at the gap.

departure_board

4. Rilevamento fermate4. Stop detection

Una fermata viene identificata quando il gap temporale è >5s e lo spostamento <15m. A stop is identified when the time gap is >5s and movement <15m.

SoglieThresholds >5s & <15m
category

5. Classificazione fermate5. Stop classification

Ogni fermata rilevata viene classificata in base alla prossimità a punti di riferimento noti: Each detected stop is classified based on proximity to known reference points:

CategoriaCategory CriterioCriterion
Tram stopEntro 30m da fermata GTFS, non vicino a semaforoWithin 30m of GTFS stop, not near traffic light
Traffic lightEntro 25m da semaforo, non vicino a fermataWithin 25m of traffic light, not near tram stop
CombinedEntro 30m da fermata e 25m da semaforo (−12s stimati per salita/discesa)Within 30m of stop and 25m of light (−12s estimated boarding)
BottleneckNessuna corrispondenza (congestione, incroci)No match (congestion, intersections)
compare_arrows

6. Corse multiple e medie6. Multi-ride averaging

Più tracce GPS per la stessa linea vengono combinate per aumentare la precisione. Le fermate vengono unite per punto fisico e le statistiche usano medie pesate per frequenza. Multiple GPS traces for the same line are combined for accuracy. Stops are merged by physical point and statistics use frequency-weighted averages.

I colli di bottiglia sotto il 50% di frequenza vengono rimossi come eventi casuali. Bottlenecks below 50% frequency are removed as random events.

speed

7. Metriche di velocità7. Speed metrics

Media in movimentoAvg movingDistanza ÷ tempo in movimentoDistance ÷ moving time
Media corsaAvg tripDistanza ÷ tempo totale (incl. fermate)Distance ÷ total time (incl. stops)
MedianMediane pesate per tempoTime-weighted medians
PeakVelocità massima di segmentoHighest segment speed
P25/P75Percentili pesati per tempoTime-weighted percentiles
labs

8. Analisi scenari8. Scenario analysis

Green waveSenza attese ai semaforiNo traffic light waits
Red waveCaso peggiore: ritardo massimoWorst case: max delay
MiglioreBestPriorità + no bottleneckPriority + no bottlenecks
pin_drop

9. Hotspot di rete9. Network hotspots

Aggreghiamo i dati per posizione fisica, unendo le osservazioni anche da linee diverse. Per ogni hotspot calcoliamo numero di osservazioni, attesa media, mediana, percentili, ripartizione per fascia oraria e contributo per linea. We aggregate data by physical location, merging observations across lines. For each hotspot we compute observation count, mean wait, median, percentiles, time band breakdown, and per-line contributions.

Fasce orarie: punta mattino (6–9), centro giornata (10–15), punta sera (16–19), sera (20–23), notte (0–5). Fuso orario: Europe/Rome. Time bands: morning peak (6–9), midday (10–15), evening peak (16–19), evening (20–23), night (0–5). Timezone: Europe/Rome.

analytics

10. Proiezioni di rete10. System-wide projections

Incrociamo i dati con le corse giornaliere da GTFS per calcolare ore perse ai semafori e corse aggiuntive possibili. Proiezioni separate per giorni feriali, sabato e domenica. We cross-reference data with daily trips from GTFS to compute hours lost at traffic lights and extra rides possible. Separate projections for weekdays, Saturdays, and Sundays.

timer Ore perse = Σ (attesa × corse) ÷ 3600Hours lost = Σ (wait × trips) ÷ 3600
directions_transit Corse extra = ore risparmiate ÷ durata media corsaExtra rides = saved hours ÷ avg trip duration
info

11. Limitazioni e trasparenza11. Limitations and transparency

  • Campione: registrazioni volontarie, non statisticamente rappresentative. Più corse = medie più affidabili.Sample: volunteer recordings, not statistically representative. More rides = more reliable averages.
  • GPS: precisione 3–10m. Filtriamo anomalie ma piccole imprecisioni possono influire sulla classificazione.GPS: 3–10m accuracy. We filter anomalies but small inaccuracies can affect classification.
  • Semafori: mappati manualmente. Quelli non mappati risultano "bottleneck". Mappa completa.Traffic lights: manually mapped. Unmapped ones appear as "bottleneck". Full map.
  • Tempo salita: stima fissa di 12s per fermate "combined".Boarding time: fixed 12s estimate at "combined" stops.
  • Variabilità: condizioni di traffico variano per ora, giorno e stagione.Variability: traffic conditions vary by hour, day, and season.
volunteer_activism

12. Come contribuire12. How to contribute

Chiunque può contribuire registrando una corsa in tram con una app GPS e condividendo il file GPX. Per istruzioni dettagliate, visita il repository GitHub. Anyone can contribute by recording a tram ride with a GPS app and sharing the GPX file. For detailed instructions, visit the GitHub repository.

13. Contatti13. Contact

Per domande sulla metodologia, richieste dati o collaborazioni, contattaci attraverso il repository GitHub o i canali di PensaMiCiclabile e Velocipiedi. For questions about the methodology, data requests, or press inquiries, reach us through the GitHub repository or the channels of PensaMiCiclabile and Velocipiedi.