How FCD Reveals Urban Congestion Patterns
What is FCD
Floating Car Data comes from GPS-equipped vehicles recording position, speed, heading and timestamp. Ride-hailing, taxis and buses are common sources. It offers wide coverage at low cost, but is noisy and unevenly sampled.
From GPS to traffic state
Raw GPS is not "speed"; it takes three steps:
1. Map-matching: snap GPS points to the network. I use an HMM with observation probability (point-to-edge distance) and transition probability (edge reachability). 2. Aggregation: aggregate by 5-min bin and edge, taking the median—not the mean—since the median is robust to outliers. 3. State estimation: map speed to Level-of-Service via the fundamental diagram.
pythondef aggregate(df, bin='5min'): df['t'] = df['timestamp'].dt.floor(bin) g = df.groupby(['edge_id', 't'])['speed'] return g.median().reset_index()
A counter-intuitive finding
On one arterial I found low-speed samples even during "free-flow" midnight hours—those were vehicles waiting at red lights. Taking the mean would be dragged down. The fix is to filter stopped vehicles, or use quantiles instead of means.
Data does not lie, but it stays silent. We must supply the context.