Let's talk about highway classification in OSM

So, after not getting any suggestions to a previous post, I thought about the solutions myself.

First and foremost, motorway=* and expressway=*. I really think these could have a common key and be used as values and I finally realised what they could be. We could come back to the parameter classification, highway:quality, whatever you want to call it concept but this time the difference is that this tag is primarily for renderers and slightly less for routers. The way it would work is: each country defines their own criteria, similarly to how it is with international equivalence for tags like highway=trunk. To give an example, in Poland a motorway would be a dual carriageway, at least 2-lane, fully access-controlled, limited access road. Roads that fulfill this criteria would be tagged as =motorway though each one of the parameters should be also tagged. A residential or local road would be a 1+1 road usually in a 30 km/h zone with speedbumps and tagged as =residential or =local. The difference this makes is:

  • Renderers display the road with a certain width depending on the value.
  • Routers have default parameters for each of the values but they only use them if a certain tag is missing. What this means is if the router’s default motorway speed limit is 120 and maxspeed isn’t tagged on that road, the router acts like maxspeed=120 is tagged but if the road is tagged with e.g. maxspeed=130, that value is then used.
    Also defaults relations, if supported by the data consumer, would also be applied to these values.

This solves the problem with parameter interpretation which I initially tried to solve with some weird grade=* tag as well as gives the answer to people saying that functional classification is also important.

Now, for the tag’s name. To be honest, it could even be highway=*. I know that the whole time I was arguing for highway=road but since railway=* has values like =rail, =tram, =narrow_gauge instead of railway=track + tram/train/etc.=yes, maybe let’s not make such a big change which won’t even make it consistent with railways (yes, railway tagging isn’t great but it is better than current highway tagging). When looking at taginfo, the actual majority of highway=* values are the functional ones (residential, service, track), so maybe we can adapt the values not to importance one, such as highway=primary or highway=local + service=driveway, but instead to the functional ones. This means the only deprecated values are trunk, primary, secondary, tertiary, unclassified, maybe residential in favour of local and get moved to adequate importance=* values.
The alternative is highway=road + service=motorway/expressway/etc. which just sounds stupid and many people opposed the very usage of the service=* key.

The proposed new values are:

  • highway=motorway_ramp,
  • highway=expressway,
  • highway=expressway_ramp,
  • highway=ramp,
  • highway=slip_lane/slip_road
  • I’m debating whether the current service=driveway, etc. should stay as subtags or be moved to their own highway=driveway, etc. tags.

And last but not least these, which, keep in mind, all depend on parameters and not function, so the name of these values could be improved:

  • highway=arterial,
  • highway=collector,
  • highway=local.

Well, that was a lot. Moving to the second point, I’m still open to hear what these roads should be tagged as because motorway=ramp doesn’t fit and I don’t think motorway=yes works the best—right now the road is tagged as highway=motorway_link, not highway=motorway.

Now, you might be confused why I wrote motorway=ramp when I had just stated that highway=motorway_ramp would be used instead. That’s because the current highway=* tags can’t be replaced without breaking data consumers and if all goes right, I’ll be proposing and implementing these changes in parts, with importance=* being the first. motorway=* and expressway=* can be used right away and as a temporary tag when the conception for highway=* values, or perhaps a different key, is being finalised.

Lastly I still am not sure what tag to use for admin_level related values for highway managing entities. I was going to use highway:category but I then realised that doesn’t work internationally with e.g. UK’s B-roads unless it could be country dependent and countries with such classifications will maybe use highway:class=B instead. I’ll think about it more but feedback is welcome.