Interactive tool
Fermata
How much of the city does a bus stop really reach? An analysis of the 1,308 TPER stops in the city of Bologna that measures coverage by walking real streets, not by drawing circles on a map.

The problem
The circle on the map overstates coverage by 3.49 times
Almost every public transport accessibility study draws a circle around the stop and calls that the served area. On real data for the city of Bologna we measured the gap: the euclidean circleoverstates covered area by 3.49 times — 89.34 km² claimed against25.57 km² genuinely reachable by walking the street network.
Service decisions get made on top of that gap. Fermata is the tool we built to measure it.
Circles ignore the city
A 375-metre radius around a stop happily crosses rivers, railways, walls and dead ends: it counts as reachable what simply is not, on foot.
No measure of what a stop is worth
How many people it actually serves, how accessible it is, how safe the walk to it is: data that exists, but sits in separate silos.
Decisions without simulation
Adding or removing a stop is expensive and hard to undo, yet it is usually decided without any way to estimate the effect beforehand.
The approach
Walk the real streets, then weigh what a stop is worth
The base measure is the area genuinely reachable on foot. On top of it we build a composite value index per stop, holding together demand and equity (who lives there, how vulnerable they are, how low the area's income is), accessibility and safety of the walk (crossings, dropped kerbs, steps, gradient, accidents) and interchange proximity.
On income the choice is deliberately equity-first: a lower median-income area weighs more, because it has fewer mobility alternatives.
The stack: Python data pipeline, FastAPI what-if backend, React + MapLibre GL frontend.
Isochrones on the real street graph
For every stop, a shortest-path search (Dijkstra) over 5 minutes of walking at 4.5 km/h: a 375-metre budget spent on streets that exist, not as the crow flies.
Three pedestrian networks compared
The official RIFTER street graph, OpenStreetMap, and the two merged — comparable stop by stop, plus a third-party isochrone service as a cross-check.
Composite value index
Six factors in a single score: population served, share of vulnerable residents, inverted income (equity-first), accessibility and safety of the walk, distance to the nearest interchange.
What-if simulations
Add or remove a stop and immediately see covered area, population gained or lost and value index, computed on the spot across the whole network.
The results
The city's real coverage, stop by stop
1,308
physical stops analysed in the city
3.49×
how much the circle overstates coverage
747
stops with no exclusive coverage
25.57 km²
area genuinely reachable on foot
The 1,308 physical stops come from deduplicating the 4,183 platform records in the TPER export for the city of Bologna. The 747 are stops whose covered area is already fully served by other stops: ageometric redundancy signal, the first filter in a review — not a list of cuts, which also requires weighing frequency, demand and equity.
See the app
Video walkthrough
Just under two minutes on the real application with real Bologna data: the map layers, building an analysis, walking area versus euclidean circle, simulating a new stop and ranking the whole network. Narration is in Italian — English captions are available from the player.
Have a similar problem to solve?
If you have geospatial, operational or regulatory data to cross-reference for better decisions, let's talk.