OpenStreetMap User's Diaries
Prioritizing Traffic Light Penalties with Traffic Counts
Impetus
Many routers, such as OSRM,1 set penalties for barriers like traffic lights or at-grade crossings, to estimate time lost at these points. For intersections with traffic lights, the standard procedure is to put a tag of highway=traffic_light at the intersecting node. For divided highway intersections, common practice is to tag each intersecting node also.
♦
T
Impetus
Many routers, such as OSRM,1 set penalties for barriers like traffic lights or at-grade crossings, to estimate time lost at these points. For intersections with traffic lights, the standard procedure is to put a tag of highway=traffic_light at the intersecting node. For divided highway intersections, common practice is to tag each intersecting node also.

This quickly adds up to excess penalty for the simple router.2 On a cross-traffic turn (left turns in the United States), this will lead the router to count three penalties per intersection. But, time spent at these intersections is not near three times the normal intersection, especially considering a cross-traffic turn often has first priority and protected access along divided highways.
The more-detailed method of tagging removes the unnecessary penalties. Instead of tagging highway=traffic_light at every intersection, a node is placed at every stop line to the intersection.
Now, in every road-legal path, the route will pass through only one traffic light node, with the following tags:
OSM
highway = traffic_light
traffic_light = signal
traffic_light:direction = forward/backward
The directionality tag is not necessary on one-way segments, but it is better to keep explicit and consistent with two-way segments.
Although this tagging is ideal, it would be intensive for mappers to correct every intersection like this. An intersection of two undivided highways, for instance, need not be updated, since the node graph already adds only one traffic light penalty. But any intersection with at least one divided highway has a route that will pass through multiple intersecting nodes.
To prioritize the routes most in-need of review, I searched for intersections likely to accumulate the most delay from these penalties. The first method analyzed high-volume roadways, and the second analyzed intersections with the most accidents.
Highway traffic volume
My first method was to look at stretches of highway with the most annual average daily traffic (AADT). Due to being high volume, these roads are likely to be divided, and are also guaranteed to have vehicles passing through key intersections (resulting in lots of total excess penalty).
I downloaded the 2026 data on AADT from IDOT’s webpage.3 I removed all motorways without traffic lights and filtered the data for segments in Chicagoland with an AADT over 40,000 vehicles per day (sorted by distance from downtown), returning the following short list:
- Cicero Ave (Ogden–87th),
- Harlem (Stevenson–50th),
- First Ave (Ogden–Stevenson),
- North Ave (Mannheim–1st),
- Mannheim Ave (I-194–Butterfield),
- 87th St (Roberts–Central),
- La Grange Rd (143rd–191st),
- Roosevelt Rd (Meyers–I 294),
- Kingery Ave (Touhy–Stevenson),
- Butterfield Rd (Veterans Tlwy–22nd),
- North Ave (Gary–Kingery),
- and a few small sections of road between Elgin and Addison)
I reviewed every intersection on these segments for divided highways, and tagged appropriately.
Intersection crashes
The second method was to analyze which intersections them receive the most crashes per year. By itself, an intersection with many crashes indicates that drivers already have some difficulty in navigating the roadway, so the extra detail is doubly appropriate.
IDOT also maintains a database of vehicle crash data by year.4 Based on the 2025 data, I found 70,287 intersection-related crashes in Chicagoland, out of 300,000 total crashes in Illinois. I clustered the individual crashes to a radius of 400 feet (the average length of a block in Chicago). Below is a table with the most total crashes, as well as their neighborhood.
Cluster name
Crashes in 2025
Neighborhood
Ohio Street off-ramp
224
Near North Side, Chicago
Congress Parkway off-ramp
157
Loop, Chicago
Wacker/Michigan Ave
141
Loop, Chicago
79th/Stony Island/South Chicago
127
South Shore, Chicago
Ohio/Michigan
108
Near North Side, Chicago
Ohio/Dearborn
100
Near North Side, Chicago
111th/Harlem
77
Worth, IL
Pershing/Western
72
McKinley Park, Chicago
95th/Stony Island
68
South Deering, Chicago
Stevenson Expwy/Cicero
60
Garfield Ridge, Chicago
I 57/Halsted
54
Washington Heights, Chicago
Madison/Cicero
54
Austin, Chicago
Ogden/Lincoln
52
Montgomery, IL
Golf Rd/Wolf Rd (Cumberland Circle)
58
Des Plaines, IL

The cluster radius of 400 feet turned out to be too large to analyze individual intersections, but it was still useful for generating high-crash areas.
- Ohio Street off-ramp (Kennedy–LSD)
- Michigan Ave (LSD–Balbo)
- Ida B. Wells Dr
- Roosevelt (Halsted–LSD)
- Stony Island Ave (71st–Bishop Ford)
All of these stretches were reviewed for special traffic lights via CookOrtho2025 imagery, licensed from NearMaps.
-
Project OSRM, OSRM Backend, “penalty.feature.” ↩
-
I could not find a router which clusters close-together traffic lights into one. Either way, explicit tagging is better for all routing purposes, at the cost of being less clear for network maps. ↩
-
Illinois Department of Transportation, Annual Average Daily Traffic, 2026. ↩
-
Illinois Department of Transportation, Crashes - 2025. ↩
Many routers, such as OSRM,1 set penalties for barriers like traffic lights or at-grade crossings, to estimate time lost at these points. For intersections with traffic lights, the standard procedure is to put a tag of highway=traffic_light at the intersecting node. For divided highway intersections, common practice is to tag each intersecting node also.
♦
T
Impetus
Many routers, such as OSRM,1 set penalties for barriers like traffic lights or at-grade crossings, to estimate time lost at these points. For intersections with traffic lights, the standard procedure is to put a tag of highway=traffic_light at the intersecting node. For divided highway intersections, common practice is to tag each intersecting node also.

This quickly adds up to excess penalty for the simple router.2 On a cross-traffic turn (left turns in the United States), this will lead the router to count three penalties per intersection. But, time spent at these intersections is not near three times the normal intersection, especially considering a cross-traffic turn often has first priority and protected access along divided highways.
The more-detailed method of tagging removes the unnecessary penalties. Instead of tagging highway=traffic_light at every intersection, a node is placed at every stop line to the intersection.
Now, in every road-legal path, the route will pass through only one traffic light node, with the following tags:
OSM
highway = traffic_light
traffic_light = signal
traffic_light:direction = forward/backward
The directionality tag is not necessary on one-way segments, but it is better to keep explicit and consistent with two-way segments.
Although this tagging is ideal, it would be intensive for mappers to correct every intersection like this. An intersection of two undivided highways, for instance, need not be updated, since the node graph already adds only one traffic light penalty. But any intersection with at least one divided highway has a route that will pass through multiple intersecting nodes.
To prioritize the routes most in-need of review, I searched for intersections likely to accumulate the most delay from these penalties. The first method analyzed high-volume roadways, and the second analyzed intersections with the most accidents.
Highway traffic volume
My first method was to look at stretches of highway with the most annual average daily traffic (AADT). Due to being high volume, these roads are likely to be divided, and are also guaranteed to have vehicles passing through key intersections (resulting in lots of total excess penalty).
I downloaded the 2026 data on AADT from IDOT’s webpage.3 I removed all motorways without traffic lights and filtered the data for segments in Chicagoland with an AADT over 40,000 vehicles per day (sorted by distance from downtown), returning the following short list:
- Cicero Ave (Ogden–87th),
- Harlem (Stevenson–50th),
- First Ave (Ogden–Stevenson),
- North Ave (Mannheim–1st),
- Mannheim Ave (I-194–Butterfield),
- 87th St (Roberts–Central),
- La Grange Rd (143rd–191st),
- Roosevelt Rd (Meyers–I 294),
- Kingery Ave (Touhy–Stevenson),
- Butterfield Rd (Veterans Tlwy–22nd),
- North Ave (Gary–Kingery),
- and a few small sections of road between Elgin and Addison)
I reviewed every intersection on these segments for divided highways, and tagged appropriately.
Intersection crashes
The second method was to analyze which intersections them receive the most crashes per year. By itself, an intersection with many crashes indicates that drivers already have some difficulty in navigating the roadway, so the extra detail is doubly appropriate.
IDOT also maintains a database of vehicle crash data by year.4 Based on the 2025 data, I found 70,287 intersection-related crashes in Chicagoland, out of 300,000 total crashes in Illinois. I clustered the individual crashes to a radius of 400 feet (the average length of a block in Chicago). Below is a table with the most total crashes, as well as their neighborhood.
| Cluster name | Crashes in 2025 | Neighborhood |
|---|---|---|
| Ohio Street off-ramp | 224 | Near North Side, Chicago |
| Congress Parkway off-ramp | 157 | Loop, Chicago |
| Wacker/Michigan Ave | 141 | Loop, Chicago |
| 79th/Stony Island/South Chicago | 127 | South Shore, Chicago |
| Ohio/Michigan | 108 | Near North Side, Chicago |
| Ohio/Dearborn | 100 | Near North Side, Chicago |
| 111th/Harlem | 77 | Worth, IL |
| Pershing/Western | 72 | McKinley Park, Chicago |
| 95th/Stony Island | 68 | South Deering, Chicago |
| Stevenson Expwy/Cicero | 60 | Garfield Ridge, Chicago |
| I 57/Halsted | 54 | Washington Heights, Chicago |
| Madison/Cicero | 54 | Austin, Chicago |
| Ogden/Lincoln | 52 | Montgomery, IL |
| Golf Rd/Wolf Rd (Cumberland Circle) | 58 | Des Plaines, IL |

The cluster radius of 400 feet turned out to be too large to analyze individual intersections, but it was still useful for generating high-crash areas.
- Ohio Street off-ramp (Kennedy–LSD)
- Michigan Ave (LSD–Balbo)
- Ida B. Wells Dr
- Roosevelt (Halsted–LSD)
- Stony Island Ave (71st–Bishop Ford)
All of these stretches were reviewed for special traffic lights via CookOrtho2025 imagery, licensed from NearMaps.
-
Project OSRM, OSRM Backend, “penalty.feature.” ↩
-
I could not find a router which clusters close-together traffic lights into one. Either way, explicit tagging is better for all routing purposes, at the cost of being less clear for network maps. ↩
-
Illinois Department of Transportation, Annual Average Daily Traffic, 2026. ↩
-
Illinois Department of Transportation, Crashes - 2025. ↩
OpenStreetMap Blogs






























































The talk ended at 4:43 pm.






