Implicit rural and urban speed limits

If a mapper is on a field survey, how should they explicitly indicate that the road segment they’re standing beside has no speed limit sign in sight? In most of the country, speed limits are routinely signposted. However, the speed limit may be posted on a sign farther away, such as at the entrance to the neighborhood or the city limits, or it may be established by state law or local ordinance based on certain criteria. The specific situations when this occurs vary from state to state.

The global community previously debated what to do about the complex system of speed limit laws in the U.S. but didn’t come to a clear agreement on a solution. A straw poll at the time resulted in a majority against speed_limit_implied=yes.

In the U.S., it has long been common practice to fill in maxspeed=* mph with the correct value whether or not it is signposted. Some mappers prefer to first blanket the map with speed limit tags based on heuristics, such as applying maxspeed=25 mph to all the highway=residential ways within the city limits. Afterwards, they’ll inspect individual streets in street-level imagery or in field surveys, correcting each one as it turns out to have a higher or lower speed limit. By contrast, other mappers prefer to map maxspeed=* based on imagery or field survey. Only once they’ve finished examining all the streets do they backfill any missing speed limit based on state or local law. Occasionally, two mappers working in the same locality have fought bitterly over which approach to take.

A field editor such as StreetComplete makes it easy for mappers on the ground to survey speed limits and could potentially head off these conflicts. By design, StreetComplete would always apply some tag to the roadway, even if all it means is that the user couldn’t answer the question specifically. This prevents the application from asking a subsequent user for an explicit speed limit that they can’t provide either. Since a user standing by the curb won’t have a compendium of state statutes handy, it doesn’t require them to come up with a numeric speed limit, but they do have to choose a symbolic speed zone.

@westnordost has compiled a digest of state speed limit laws and developed the osm-legal-default-speeds library to parse that digest into machine-readable rules. A router would use that library to estimate a travel time along the roadway even if no sign is present.

The next release of StreetComplete will come with a question about speed limits. If the user can’t see a speed limit sign from where they’re standing, they have to choose between “built-up” and “not built-up”. These two options correspond to legal provisions about built-up areas in many states. It’ll result in tags like maxspeed:type=US-VA:rural and maxspeed:type=US:CA:urban, which until now have been very rare.

This feature promises to increase coverage of speed limits in the U.S. However, I’m concerned that the average user will have very little awareness of whether they’re standing in a “rural” or “urban” district according to the relevant speed law. For example, is a suburban residential area “urban”? Is a business strip along a rural highway still “rural”? Only Iowa, New Jersey, and Wisconsin have a distinct suburban speed limit. Most states only additionally distinguish between residential and business districts.

The main purpose for this “built-up” or “not built-up” choice is to indicate “I couldn’t tell on the spot.” If both US-*:rural and US-*:urban mean roughly the same thing, then it doesn’t really matter if the user sometimes chooses a value inconsistent with whatever invisible line is being drawn by state law. Unfortunately, the difference between these values can be upwards of 40 miles per hour in some states, all things being equal. I’m concerned that this is what osm-legal-default-speeds will be telling routers to assume based on the tagged values. I don’t think it’s entirely unlikely that some applications might even misuse the library to display a wildly incorrect speed limit to the user.

Can we come up with an alternative tag to mean “no speed limit sign here”, to avoid muddling the distinction between rural and urban in maxspeed:type=*? @westnordost has indicated an openness to switching to an alternative that we come up with, but we would need to come to a decision before the next release puts the question in users’ hands.

1 Like

Video here: Maxspeed compose by westnordost · Pull Request #6758 · streetcomplete/StreetComplete · GitHub


And also, to provide this information, because it is necessary for data consumers (routers, …) to actually determine the speed limit, if not signed. So, it is useful data. As @Minh_Nguyen 's map shows, indeed the speed limits within and outside built-up areas are usually quite different - the US is no exception here to the rest of the world.

When not tagged explicitly whether a road is within or outside a built-up area, data consumers have to guess, and the question is if such a guess based on some algorithm is going to be more precise than the assessment of a mapper / driver that had been there, on-site.


Hence, I’d ask you (the US community): Well, do you want to?

@Minh_Nguyen is obviously concerned about the quality of the data, as the mapper’s assessment of whether a particular road is within or outside a built-up area may not coincide with the legal definition.
I do not share that concern, though, for the following reasons:

  1. In the absence of a sign, any driver also has to assess whether any particular road he is in a built-up area. That driver is in the same situation as the OSM mapper here. (The quest is not asked if a maxspeed is already present)

  2. (Hence) I would expect that in places where the intuitive answer is not clear, there will actually be a sign - many parts of US state default speed limit regulations I have read sound like they are rather designed to order the road traffic authority where to put up which signs.

  3. Most mapping with StreetComplete is done on foot and in built-up areas. The situation that a mapper passes a few houses on an otherwise very sparsely settled road that will make him wonder whether this is built-up now or not will occur rather rarely. And for any insecurities, there is always the option to answer “Can’t Say” and leave a note or hide the quest.

  4. Hey, it’s a collaborative map. If mistakes are made, they can be corrected. Same as if someone determines that the set maxspeed is actually wrong. For example all the errors introduced by people who map speed limits the way …

…will also need to be corrected later. To me, data determined on-site is much more trustworthy than that.

  1. The quest is disabled by default with the below note (shown to the user), …

This quest type is disabled by default because you are usually required to check the whole street for speed limit signs, not just the highlighted section. This can sometimes be a lot of work just to solve a single quest.

… so the user inclined with adding this data is warned that it may be a little more time-intensive to answer a single quest of this type.

3 Likes

How else should a router get to the allowed speed if not telling him, it’s rural or urban default?

maxspeed:signed=no?

3 Likes

Especially since some of the library maximums aren’t entirely accurate, as from what I’ve seen states tend to give a lot of leeway to post speed limits above the maximum. I can tell just by looking at the map that SD, WY, NE, KS, CO, UT, and ID (at least) routinely post speed limits higher than the listed maximum.
Additionally, using a default speed limit from state law could end up with speed limits higher than they should be. I know that here in SD, the default speed for county-maintained roads is 55 mph but that’s nowhere in state law, it’s just DOT policy. Applying a tag like maxspeed:type=US-SD:rural to ways like Way: ‪474th Avenue‬ (‪9904107‬) | OpenStreetMap and assuming the default is 65 mph could lead to some problems (note to self, update speed limits).

1 Like

Only if it really isn’t signed. WA-291 westbound out of Spokane, for example, doesn’t have any speed-limit signs between Rifle Club Road and Parkview Lane, a distance of four and a half miles (and nine intersections), but that doesn’t make it an unsigned speed limit.

To be clear, I see StreetComplete as a big help. We can finally get past the intractable debates between one armchair-mapping style and the reverse by getting people to go out in the field and see for themselves.

The only concern I have is when the person on the ground doesn’t have enough situational context to make an informed decision. The “Uh…” option would be perfectly fine, except that someone is only going to click it when they know they don’t know. The bulk of streets missing maxspeed=* tags are in suburban areas,[1] which don’t neatly fall into a binary rural/urban divide. One user will think it’s built up and the other will think it isn’t, depending whether they’re coming from a more or less built-up area. When you say that most mapping happens in “built-up areas”, I assume you include suburbs but have no idea if that means rural or urban as far as speed laws are concerned.

Disabling the quest by default goes a long way in mitigating this concern. The note correctly indicates that you need to survey the whole street – and maybe beyond. To me, it acknowledges that armchair mappers need to work hand in hand with field surveyors. Some situations will be easier for one group and some situations will be easier for the other group. As long as “Uh…” is a possible answer, why not just make that the answer, rather than nudging the user to make a fraught choice? We would still get the benefit of any posted speed limits, just not the implicit ones.

I thought we already determined in the GitHub issue that you only intend for these inferred speeds to be used for travel time estimation. If so, then the driver’s predicament is irrelevant. Incorrect speed classification only affects route quality: a rosy time estimate makes for an unrealistic route on back roads (where maxspeed=* tags are less prevalent) instead of more convenient high-capacity roads.

Otherwise, if we do expect the inferred speeds to be communicated to the driver as speed limits, then you’ve given a good argument as to why bad data is worse than no data. The ambiguous situations are precisely when a driver turns to their electronics to have an answer they can’t just see for themselves. They want an armchair mapper to do the research, not a field surveyor to make the same guess they could make themselves. And if a wrong guess is magnified by osm-legal-default-speed’s assumptions, then their trust in OSM suffers.

Yes and no. The laws you’re referring to do authorize posting speed limit signs, but there are still many situations where signs are out of sight, including most suburban neighborhoods in some states.

A few U.S. cities have what appear to be comprehensive coverage of traffic_sign=maxspeed or traffic_sign=US:R2-1, allowing us to get a visual sense of the spatial distribution of speed limit signs. These cities show a typical pattern: speed limit signs along arterial and collector streets and minimally at the entrances to residential areas.

Some of these cities proper are not quite as built-up as StreetComplete’s artwork implies, but most users will consider the city center built-up, quite in keeping with the state speed law. The problem is those outlying areas on the outskirts of town, where there are plenty of streets. When the norm is to only post a speed limit sign at the entrance to something, is StreetComplete going to tell users to keep track of every sign they pass by before answering the quest?

I’m not arguing against tagging that it’s the rural or urban default. I’m suggesting that we shouldn’t count on StreetComplete users to do it. Depending on the state, you need to be able to calculate housing density along the street or cross-reference an urban area map from the U.S. Census Bureau. These are appropriate tasks for someone sitting in their armchair, while the StreetComplete users are out sign spotting.

I’m aware that the library is not intended to be a perfect answer to the question of the legal speed limit for a given road. There’s always the caveat that all its heuristics could be irrelevant because of a sign that hasn’t been mapped yet. I’d rather not add an additional caveat that the heuristics started from a guess.


  1. I can’t definitively prove this point, because we don’t have any tagging for a suburb. ↩︎

Can we find a tag to say exactly what you just said? Instead of “This speed limit is unsigned,” how about, “There’s no literal speed limit sign here”? @westnordost mentioned that StreetComplete could split the way around the user’s location, to limit the impact of any ambiguous answer.

Just spitballing, no:traffic_sign=maxspeed on the way? traffic_sign:maxspeed:count=0? is_signed:with:maxspeed=no?[1]


  1. Kidding on that last one, of course. ↩︎

maxspeed:signed=no as mentioned above by @AntiCompositeNumber matches the design of other SC quests (e.g. maxweight:signed=no maxweight=default).

However, I believe that the Just-In-Time education notice when you attempt to enable this quest:

is going to be largely good enough for people to realize that they need to check the entrances of the residential blocks. Actually, I suppose it could be changed to mention “check the whole street or the whole residential area for speed limit signs”

To be clear, this is what’s under the “Uhhh…” option:

  • It does not exist… - delete the road or leave a Note
  • Show/edit tags - full tag editor for the element (SCEE only)
  • Can’t say…
    • Hide Quest locally
    • Leave Note (w/ option to upload picture)

Users that haven’t explicitly enabled the quest will need to be (1) using SC Expert Edition with expert mode turned on, and (2) enter the tag editor and tap the speed limit quest, in order to encounter the quest without seeing the education notice.

That would be appropriate for a speed limit that’s signposted at a nearby entrance. I think we can trust that the mapper can apply common sense that a speed limit sign is only posted at transitions between speed zones, not absolutely every block.

Unfortunately, this is the easy case. In another very common case, the default speed limit is posted at the county line or city limits, right next to an exception. The moment you turn off the main road, the exception ceases to apply, but you won’t see any sign about that.

What does urban mean when a fully built-up city has multiple default speed limits depending on functional classification?

Functionally identical signs at international border crossings are the reason Europe relies on maxspeed:type=* instead of blanketing the map with inferred maxspeed=* tags. Unfortunately, the many local default speed limits across the U.S. are considered out of scope. Even details about major cities have been removed. If anyone in Seattle, for instance, answers this quest as designed, they’re guaranteed to mistag the street and cause the library to overestimate a speed limit that’s strictly enforced.

At least those cases are signposted somewhere. Many of the urban and rural keywords listed on the wiki page depend not on signs but rather on counting or measuring things over a certain distance or keeping track of boundaries. Some of the distances are too great to reasonably travel for just a single question.

Distance Boundaries States
¼ mile (0.4 km) Kansas, Massachusetts, Maine, Minnesota, New Jersey,[1] North Dakota, Pennsylvania, South Carolina, South Dakota, Texas, Utah, Wyoming
1,000 feet (305 m) City limits Wisconsin[1:1]
600 feet (180 m) Alabama, Alaska, Arizona, California, Colorado, Georgia, Idaho, Illinois, Kentucky, Michigan, Nebraska, Oregon, Rhode Island, West Virginia
500 feet (152 m) Indiana
300 feet (91 m) Delaware, Florida, Iowa, Maryland, New Hampshire, New Mexico, Ohio, Virginia
City limits North Carolina, Washington

Special mention:

  • Arkansas, Montana: not defined in statute (unsure about case law, regulation, or agency policy)
  • Missouri: population and population density (area not defined in statute)

Of course, none of this matters. No StreetComplete user knows about any of these laws. They’re going to look at the icons on screen, check if there are tallish buildings spaced closely together like on the icon, and answer accordingly. StreetComplete will tag urban or rural, completely independently of any of these laws that the developer meticulously catalogued on the wiki, and the tags will become untrustworthy. We’re told that this is normal, that wrong data can always be corrected. This is true: when we go to correct the data after the fact, every instance of urban or rural will be suspect, and both tags will be equivalent. We’ll need to reevaluate each one, replacing it with urban2 or rural2 based on the real rules. In the meantime, routers will be fed data that they shouldn’t trust.

I don’t have a problem with StreetComplete offering this quest. What I want to flag is that we’re missing an opportunity for StreetComplete to actually be useful in these known tricky situations. Can someone situated miles away from the city limits really do a better job of surveying which implicit speed limit applies than someone sitting behind a desk? No. We only need the StreetComplete user to tell us if the person at the desk needs to do that analysis. Replacing the sure-sounding urban and rural options with a more ambiguous unspecified keyword would allow that to happen. In the meantime, a router would have to guess based on something else. As much as I despise the fallbacks based on highway classification, that would be better than polluting maxspeed:type=*.


  1. StreetComplete conflates urban with suburban. ↩︎ ↩︎

5 Likes

I’m trying to think about how I decide what speed to drive when on a road where I don’t know the speed limit and I haven’t seen a sign. Mostly I consider what speed feels reasonable for the design of the road and the speed of other vehicles. If the road is narrow or curvy I go slower for example. I’m sure whether the surroundings are urban, suburban, exurban, or rural plays a part in my decision making, but it certainly isn’t a clear binary choice where I decide between urban or rural and attempt to recall what the default speed limit for either situation is (I likely wouldn’t know this anyway). So at least for me the process of deciding on a speed to drive is rather different than deciding on a maxspeed value to add to OSM in the absence of a sign.

4 Likes