Let’s just try lowering speed limits now!

Seattle’s Department of Transportation (SDOT) put up a new speed limit map last week. Seattle had a couple of years ago changed local law so that default speed limits for arterials was lowered to 25 mph and non-arterials was lowered to 20 mph. But, it will take a long time to officially change all roads because the process described to me in email involved evaluating a handful of urban village streets per year. But after looking at the data a bit and confirming there are large differences in speed limits across districts, I think a better and more equitable process would be to just lower nearly all arterial streets (per the intent of the law), then measure speeds and impacts, and adjust as needed.

So the data! I used the Seattle Streets dataset which drives the map and the City Council District boundary data. The Seattle Streets data I ingested into a little sqlite3 database. Each short road segment (usually a block) has information about what kind of road it is, its textual name, the speed limit (duh), total segment length and width (in feet), and what is called in GIS software a “line string”. The “line string” is a list of 2 or more pairs of latitude and longitude values that describe the approximate path of that road segment. Most roads have two points but some segments have more. I used a Ruby library rgeo to ingest the shapefiles for the council district boundaries (very complex you might imagine!) and then for each road segment in the Seattle Streets dataset I tried to classify its line string as being in predominantly one district.

Assigning a council district to each road segment is probably the most arbitrary decision here. Most segments are cleanly in one district, but obviously along the boundaries it’s hard to programmatically assign the road to both equally (if it’s right on the boundary) or to the district it’s mostly in. So basically all road segments along the council boundaries are in arbitrarily one or the other or possible both (so I might have double counted some segments). I’ll probably revise my script (not posted yet, sorry) to do this classification to be a bit less arbitrary (and detect “this road is on the council boundary line” in a clean way). But looking at the data and knowing which big/fast roads are aligned with the district boundaries near me, I think it probably doesn’t change the overall themes I’m seeing. With that, here’s some summary data!

Total road segments at each speed in each district

District 0 20 25 30 35 40 45 50 55 60
1 2088 1187927.648 8891 350705 43877 20073 14997 24165 25718 9305
2 2860 1216594.168 41841 415246 145441 0 23451 20918 0 106183
3 1720.23 813071.9904 138318 196286 3355 0 0 20964 0 59557
4 418 816629.2432 1083 315178 12829 6430 0 0 0 43784
5 58 1022786.671 5316 233423 42433 7957 0 0 0 35023
6 103 1010982.671 19963 274106 10326 10379 0 0 0 22736
7 2831.9 732975.4421 197440.35 236803 12407 16740 0 9266 0 16331
Totals 10079.13 6800987.833 412877.35 2021777 270703 61619 38493 75363 25773 292979

Percent of total (city-wide) road distance at each speed in each district

District 0 20 25 30 35 40 45 50 55 60
1 20.72% 17.47% 2.15% 17.35% 16.21% 32.58% 38.96% 32.06% 99.79% 3.18%
2 28.38% 17.89% 10.13% 20.54% 53.73% 0.00% 60.92% 27.76% 0.00% 36.24%
3 17.07% 11.96% 33.50% 9.71% 1.24% 0.00% 0.00% 27.82% 0.00% 20.33%
4 4.15% 12.01% 0.26% 15.59% 4.74% 10.44% 0.00% 0.00% 0.00% 14.94%
5 0.58% 15.04% 1.29% 11.55% 15.68% 12.91% 0.00% 0.00% 0.00% 11.95%
6 1.02% 14.87% 4.84% 13.56% 3.81% 16.84% 0.00% 0.00% 0.00% 7.76%
7 28.10% 10.78% 47.82% 11.71% 4.58% 27.17% 0.00% 12.30% 0.00% 5.57%

Percent of in-district road distance at each speed in each district

District 0 20 25 30 35 40 45 50 55 60
1 0.12% 70.39% 0.53% 20.78% 2.60% 1.19% 0.89% 1.43% 1.52% 0.55%
2 0.14% 61.68% 2.12% 21.05% 7.37% 0.00% 1.19% 1.06% 0.00% 5.38%
3 0.14% 65.93% 11.22% 15.92% 0.27% 0.00% 0.00% 1.70% 0.00% 4.83%
4 0.03% 68.26% 0.09% 26.34% 1.07% 0.54% 0.00% 0.00% 0.00% 3.66%
5 0.00% 75.93% 0.39% 17.33% 3.15% 0.59% 0.00% 0.00% 0.00% 2.60%
6 0.01% 74.97% 1.48% 20.33% 0.77% 0.77% 0.00% 0.00% 0.00% 1.69%
7 0.23% 59.84% 16.12% 19.33% 1.01% 1.37% 0.00% 0.76% 0.00% 1.33%

But these are for all speeds which makes it hard to compare slow vs fast roads. So here are some rollups of data showing percents of road lengths at 25 mph and below and 30 mph and above. All of this data includes freeways and highways which is why some districts have a lot more 55+ mph distance: they have more of I-5 or I-90 in them.

Percent out of city-wide road distance in each district

District 25 and below 30 and above
1 11.98% 4.88%
2 12.60% 7.10%
3 9.52% 2.80%
4 8.17% 3.78%
5 10.27% 3.18%
6 10.30% 3.17%
7 9.32% 2.91%

Percent out of in-district road distance in each district

District 25 and below 30 and above
1 71.04% 28.96%
2 63.94% 36.06%
3 77.28% 22.72%
4 68.39% 31.61%
5 76.33% 23.67%
6 76.45% 23.55%
7 76.20% 23.80%

So … what?

Keeping in mind my data is a bit noisy, it seems clear that some districts, notably district 2 in southeast Seattle, have more roads over all and more roads with higher speed limits, both in absolute terms but also in terms of their share of roads in the city (or in district). Fast road speeds are a major cause of collisions and fatalities, especially for the people not in cars. The greater distance of road at higher speeds also indicate likely higher traffic volumes which means more air and noise pollution.

Part of the reason I started digging into this was I noticed that some streets I thought of as “quiet neighborhood streets” actually had 30 mph speed limits (signed even). Roads like Genesee or 50th Ave S, for example, should be slow streets as they run past parks and schools and houses. A short distance away, on Rainier, a short segment has been “calmed” and reduced to 25 mph. The results demonstrate that the slower speeds decrease collisions and fatalities dramatically. Why we haven’t quickly rolled this out to the rest of Rainier is a moral failure: if calming Rainier Ave S through Columbia City were a medical study, we’d have had to end the experiment early and give all the patients the clearly effective treatment.

Unfortunately, the process by which we lower other streets (including the rest of Rainier) will require years, as the email I got from SDOT about how they are evaluating speed limits throughout the city describes a process that won’t even get to most of the urban villages before 2020. Meanwhile, more people will die.

I think we should just reduce all the speed limits now, then start measuring. Instead of studying and improving each corridor as we have funds available, we should reverse it. Lower speed limits on every corridor we can immediately – signs are pretty cheap – then start measuring and studying. If we find that drivers don’t observe the speed limit there, then do spot improvements first to calm that segment. We can be innovative and use cheap fixes like paint and post calming bulb outs (see Beacon Ave & McClellan for an example) or planter boxes lining roadways or adding inexpensive and movable bike lanes as they did in Winnepeg. The current process, while orderly, is expensive and doesn’t force us to fix the worst corridors first. I was told the current urban villages being adjusted are Greenwood/Phinney then Green Lake, Roosevelt, U-District, U-Campus, and North Beacon Hill next year. Calming all of Rainier is currently planned to take years. Instead, let’s just lower all of them now, measure them and fix the worst sections Then keep measuring and fixing until 25 mph or lower is a reality everywhere.