Level of Traffic Stress¶
Every road in the BNA network gets a stress level — a number that captures how comfortable it is to cycle on. Stress levels drive everything downstream: low-stress connectivity, scores, and ultimately the overall BNA grade for a city.
What is LTS?¶
Level of Traffic Stress (LTS) is a framework developed by the Mineta Transportation Institute for rating how comfortable roads are to cycle on. It was designed to match how different types of cyclists actually behave:
- LTS 1: Comfortable for virtually everyone, including children. Protected lanes, very slow streets.
- LTS 2: Comfortable for most adults. Conventional bike lanes on moderate-speed streets.
- LTS 3: Tolerable for experienced cyclists only. Sharrows on busy roads, unprotected lanes at speed.
- LTS 4: Uncomfortable for almost everyone. High-speed arterials, no facilities.
How BNA maps to LTS¶
BNA uses a simplified binary rather than the full four-level scale: road segments receive either stress 1 (comfortable) or stress 3 (uncomfortable). This two-value system is not a direct copy of the Mineta LTS levels — the mapping is:
- BNA stress 1 ≈ Mineta LTS 1 + LTS 2: roads that most cyclists find acceptable, including protected tracks, conventional bike lanes at moderate speeds, and very quiet residential streets.
- BNA stress 3 ≈ Mineta LTS 3 + LTS 4: roads that most cyclists avoid — high-speed streets without infrastructure, sharrows on busy roads, arterials.
BNA stress 2 is never produced by the default rules. It exists as a configurable intermediate level for researchers who want to distinguish between "very comfortable" (strict LTS 1 equivalent) and "moderately comfortable" (LTS 2 equivalent) within what BNA would otherwise treat as a single comfortable category. See the tutorial Add a finer stress level for a worked example.
Factors that determine stress¶
Segment stress¶
Stress on a road segment depends on three things:
- Vehicle speed — Higher speeds make cycling more dangerous and uncomfortable.
- Number of lanes — More lanes to cross or share with traffic increases stress.
- Bicycle infrastructure — The type of bike facility dramatically reduces stress.
The infrastructure hierarchy, from most to least protective:
| Infrastructure type | BNA name | Effect |
|---|---|---|
| Separated bike path | track |
Always stress 1, regardless of speed |
| Buffered bike lane | buffered_lane |
Stress 1 at ≤25 mph with single lane |
| Conventional bike lane | lane |
Stress 1 at ≤20 mph with single lane (≥4 ft wide) |
| Sharrow / shared lane | sharrow |
Stress 1 only at ≤15 mph with single lane |
| No infrastructure | — | Stress 1 only at very low speeds (quiet residential) |
Example: A protected lane on a 45 mph road is stress 1. The same road without infrastructure is stress 3.
Road type defaults¶
The BNA doesn't need an explicit speed tag to assign stress. Each road type has a default speed used when the OSM maxspeed tag is missing:
| Road type | Default speed | Default lanes |
|---|---|---|
| Primary, secondary | 40 mph | 2 |
| Tertiary | 30 mph | 1 |
| Residential | State/city default (e.g. 20 mph in DC) | — |
| Unclassified | 25 mph | 1 |
Class adjustments¶
Before stress is computed, the BNA promotes residential and unclassified roads to tertiary if they have: - Bike infrastructure in both directions (lane/buffered_lane/track on both sides), or - More than one lane in either direction, or - An explicit speed tag ≥ 30 mph
This ensures that a residential road with a painted bike lane is evaluated with the more demanding tertiary rules, not the lenient residential speed-only rule.
Intersection stress¶
Segment stress tells you how comfortable a road is to ride on. Intersection stress tells you how comfortable it is to cross a road.
ft_int_stress is the stress of crossing the intersection at the end of a road. tf_int_stress is the stress at the start. When a cyclist reaches an intersection, they may need to cross a busier road — that crossing contributes to overall route stress.
Signalized crossings are always low stress — a traffic signal gives cyclists a protected moment to cross regardless of the speed or number of lanes on the crossing road.
For unsignalized crossings, stress depends on the road being crossed: - Motorway or trunk: always high stress (crossing is essentially impossible) - Primary, secondary, tertiary: depends on speed, lanes, RRFB (Rectangular Rapid Flash Beacon), and median refuge islands
Crossing stress thresholds¶
For a two-way primary road: - Total lanes > 4 → high stress - Total lanes = 4, speed > 30 mph → high stress (or ≥30 with no median island) - Total lanes < 4, speed > 30 mph, no island → high stress
For a one-way primary road: - Lanes > 2 → high stress - Lanes ≤ 2, speed > 30 mph → high stress
An RRFB (flashing beacon) raises the threshold slightly, allowing more lanes at the same stress level.
The configurable threshold¶
By default, the BNA uses low_stress_threshold = 1: only roads with stress=1 are included in the comfortable routing network. This is the standard BNA setting and covers the full range of infrastructure that Mineta LTS would classify as LTS 1 or LTS 2.
You can introduce a finer distinction by adding custom rules that produce stress=2 and then setting the threshold to 2:
[graph]
low_stress_threshold = 2
With custom stress=2 rules in place, this setting restricts the comfortable network to only the most protected infrastructure (strict Mineta LTS 1 equivalent), excluding painted bike lanes on faster streets that default rules would have classed as stress=1.
Why only values 1 and 3?¶
The default rules assign only values 1 and 3 — value 2 is never produced by any default rule. This is intentional: BNA treats comfort as a binary distinction for most analyses. The intermediate value 2 is available for custom extensions when a finer split is needed.
When you add a custom rule that produces stress=2, StressConfig.n_levels automatically adjusts to accommodate the new value.
Relationship to brokenspoke-analyzer
The SQL scripts this stage replaces — and any points where the output intentionally differs — are catalogued in the Differences from brokenspoke-analyzer section.