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.

Screenshot of the Fermata app: the 5-minute walkshed of a Bologna stop, with the street segments actually walked and the composite index panel

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.