How to map periodic contraflow HOV lanes?

Hi.
I’ve manually replaced deprecated hov=lane tags with hov:lanes=* in the US over time, please see pluton_od's Diary | Contraflow HOV lanes | OpenStreetMap for more information. And I now have the last, most complicated case. I’m reposting a part of that diary here in order to consult the community how to map this in the best way.

Contraflow HOV lanes near Boston

The last 80 segments are the most complicated yet. They are for a part of I-93 south of Boston, MA: overpass turbo. The complication comes from this: note:lanes = during rush hours, 5 lanes (left one hov) in peak direction and 3 in off-peak direction. This is confirmed by Southeast Expressway HOV lane, whereas Boston I-93 HOV Lane has an image of it:

I’ve mapped the permanent barriers between the directions in Changeset: 138024161 | OpenStreetMap.

I see two ways of mapping the HOV lane:

1. As a separate way along the interstate

but in the opposite direction. Even though it’s one lane of the already mapped road (in the opposite direction), there is always a physical separation (present when the lane is open), so it makes sense to map it separately; also there is no interaction of these two directions:

  • Once in the HOV lane, drivers do not have access to exits

Tagging is simpler with this approach:

  • for the HOV lane:
bus=designated
change=no
hgv=no
highway=motorway
horse=no
hov:minimum=2
hov=designated
lanes=1
maxspeed=55 mph
maxweight=5
motorcycle=designated
name=Southeast Expressway HOV Lane
oneway=yes
opening_hours=Mo-Fr 05:00-10:00
ref=I 93;US 1;MA 3
shoulder=no
trailer=no

opening_hours is important; I’m not sure how else to indicate that this lane is present only during certain hours.

  • the regular road needs to indicate fewer lanes, meaning if it has
hgv:lanes=no|no|yes|yes|yes
lanes=5
turn:lanes=||||merge_to_left

it now also needs

hgv:lanes:conditional=no|yes|yes|yes @ (Mo-Fr 05:00-10:00)
lanes:conditional=4 @ (Mo-Fr 05:00-10:00)
turn:lanes:conditional=|||merge_to_left @ (Mo-Fr 05:00-10:00)

These new lanes need to be mapped accurately parallel to the road and added to the road relations, which is not a fast process. Yes, the result would look unusual — two extra roads in the opposite direction along the highway.

2. As conditional tags on the interstate

This is simpler in mapping, but would create a lot of extra conditional tags because the road wouldn’t be one way and the extra, HOV tags would be mapped as *:backward:conditional. An example segment would go from 23 to 35 tags:

attribution=Office of Geographic and Environmental Information (MassGIS)
bicycle=no
bus:backward:conditional=designated @ (Mo-Fr 05:00-10:00)
change:lanes:backward:conditional=no @ (Mo-Fr 05:00-10:00)
change:lanes:forward:conditional=not_left|yes|yes|yes @ (Mo-Fr 05:00-10:00)
condition=good
foot=no
hazmat=designated
hgv:backward:conditional=no @ (Mo-Fr 05:00-10:00)
hgv:lanes:forward:conditional=no|yes|yes|yes @ (Mo-Fr 05:00-10:00)
hgv:lanes=no|no|yes|yes|yes
hgv=designated
highway=motorway
horse=no
hov:backward:conditional=designated @ (Mo-Fr 05:00-10:00)
hov:minimum:conditional=2 @ (Mo-Fr 05:00-10:00)
lanes:backward:conditional=1 @ (Mo-Fr 05:00-10:00)
lanes:forward:conditional=4 @ (Mo-Fr 05:00-10:00)
lanes=5
massgis:way_id=152796
maxspeed=55 mph
maxweight:backward:conditional=5 @ (Mo-Fr 05:00-10:00)
motorcycle:backward:conditional=designated @ (Mo-Fr 05:00-10:00)
name=Southeast Expressway
oneway:conditional=no @ (Mo-Fr 05:00-10:00)
oneway=yes
placement=right_of:2
ref=I 93;US 1;MA 3
shoulder:backward:conditional=no @ (Mo-Fr 05:00-10:00)
source=massgis_import_v0.1_20071009092358
surface=asphalt
trailer:backward:conditional=no @ (Mo-Fr 05:00-10:00)
turn:lanes:forward:conditional=|||merge_to_left @ (Mo-Fr 05:00-10:00)
turn:lanes=||||merge_to_left
width=61.0

I doubt that any program would parse all this information, and it would be confusing to humans too.

I’m trying out the first approach locally, carefully mapping and tagging the HOV lanes separately. I can upload the .osm file somewhere with what I have if anyone is interested how it looks.

Comments

User Kovoschiz in the comments adds this:

  1. opening_hours= is usually not considered on roads. This may be a case where highway:conditional=motorway @ (Mo-Fr 05:00-10:00) is correct, as the separate roadway doesn’t exist outside those times. Unfortunately, you still need highway=motorway for compatibility. Furthermore, due to how overriding works, you need to specific *:conditional=no @ (Mo-Fr 05:00-10:00) for each mode, as access:conditional=no @ (Mo-Fr 05:00-10:00) or motor_vehicle:conditional=no @ (Mo-Fr 05:00-10:00) will be overrideen by hov=designated etc. So it’s still not as simple as you think, and there’s advantage in 2 except for suffixing *:backward:*=.
  2. hov:minimum:conditional=2 @ (Mo-Fr 05:00-10:00) is not required. hov:minimum=2 @ (Mo-Fr 05:00-10:00) is always true.

Due to the overriding (I don’t know much about this), there may be a need to add extra tags to the separate lane: tag access=no (always) and hov:conditional = designated @ … (during certain times).

There are a few other comments there: pluton_od's Diary | Contraflow HOV lanes | OpenStreetMap.

What is the best way to map these HOV lanes?

Thanks!

Having driven on this road many, many times, I can confirm that this is how the contraflow lanes work. Early in the morning a special machine shifts a movable barrier on the southbound side to create an additional northbound lane. The opposite operation happens at lunchtime for the evening rush hour as well. Additionally, there are sections of I-95 around Boston that explicitly permit travel in the breakdown lane (aka the “shoulder” for those in other parts of the country) during certain rush hours.

I think it makes the most sense to model these as separate ways with conditional access, rather than a lane, since there is physical separation from the rest of the roadway. However, I am no expert on lane tagging.

1 Like

Same here: Way: ‪Golden Gate Bridge‬ (‪595194543‬) | OpenStreetMap

1 Like

If I am reading the tagging correctly, it sounds like the Golden Gate Bridge is a different situation, where the roadway is widened by moving the barrier. In the case of Boston’s Southeast Expressway, the additional lane is on the opposite side of the freeway and there’s a permanent concrete Jersey barrier between the temporary lane and the main freeway.

This is fine. Many urban freeways in the U.S. have multiple carriageways in the same direction, typically for express lanes.

I agree with @Kovoschiz’s analysis. Routers primarily consider access restriction tagging, so your proposed conditional access and lane tagging is necessary. It wouldn’t hurt to also conditionalize the primary feature key highway=*, but this is very unusual and unlikely to work well in any software, from editors to renderers to routers.

Minh, thanks. If I understand you correctly, these are the tags for the separate HOV lanes:

access=no
bicycle=no
bus:conditional=designated @ (Mo-Fr 05:00-10:00)
change=no
condition=good
foot=no
hgv=no
highway:conditional=motorway @ (Mo-Fr 05:00-10:00)
horse=no
hov:conditional=designated @ (Mo-Fr 05:00-10:00)
hov:minimum=2
lanes:conditional=1 @ (Mo-Fr 05:00-10:00)
maxspeed=55 mph
maxweight=5
motorcycle:conditional=designated @ (Mo-Fr 05:00-10:00)
name=Southeast Expressway HOV Lane
oneway=yes
ref=I 93;US 1;MA 3
shoulder=no
source=https://www.mass.gov/info-details/southeast-expressway-hov-lane
surface=asphalt
trailer=no

I also need to add them to the three relations of I 93, US 1, MA 3.

The confusing part is highway:conditional=motorway @ (Mo-Fr 05:00-10:00) vs highway=motorway. If I use the latter, is access=no enough to avoid the road for any routes by default?
Is it important that this lane is shown by the “standard” renderer, e.g. osm.org, OsmAnd, Organic Maps? If so, I’ll need to use highway=motorway (w/o the conditional tag because using both with the same value doesn’t make much sense).

I agree that access=no followed by all those other access-related *:conditional=* tags is what actually matters in terms of making sure routers know when to route down the HOV lane. However, access tags don’t say what the thing is.

Every feature needs a primary feature tag, which for a freeway would ordinarily be highway=motorway. If you do add highway:conditional=motorway @ …, you still need to say what the feature is when the condition evaluates to false. Both highway=no and no:highway=yes have been documented for this purpose.

Conditionalizing a primary feature tag is very weird. I would venture a guess that most occurrences of highway:conditional=* out there are rather obscure features, so it isn’t a big deal that no software knows what to do with these features or could be expected to for the foreseeable future. But a freeway HOV lane is kind of a big deal.

With that in mind, you could prioritize the more normal state, by combining highway=motorway with highway:conditional=no @ (Mo-Fr 00:00-05:00, 10:00-24:00; Sa, Su). Renderers that don’t understand highway:conditional=* will render the HOV lane in its open state, which is what a user would expect. Routers that don’t understand highway:conditional=* will only route down the HOV lane when the access tags allow it, which is correct.

That said, there’s been some uncertainty about whether a single freeway HOV lane or express lane should really be a highway=motorway or whether it should be just a highway=motorway_link. highway=motorway is more common across the U.S., but the wiki has recommended highway=motorway_link for a long time, and I think it’s right. This kind of lane is essentially a collector-distributor lane, which are always tagged as highway=motorway_link, except it happens to be on the left side and it typically lacks subexits.

highway=motorway_link would be advantageous to renderers. Most renderers draw highway=motorway_link thinner, which makes sense for a carriageway that typically is narrower and results in less clutter. OSM Americana renders toll roads in a different color than free roads, but express lanes sometimes obscure free lanes because it can’t distinguish between more and less important highway=motorway ways. Other renderers may experience similar issues.

Washington State Route 167 as two red lines running north to south; the northbound free lanes are overtaken by a gold-colored line representing the northbound toll lane

The gold-colored Interstate 35W Express completely obscures the red-colored Interstate 35W; State Highway 183 is completely obscured by an unlabeled State Highway 183 Express

Similarly, highway=motorway_link would be beneficial to routers. If the route includes the HOV lane, then an HOV driver hears “Take the left exit” at the HOV entrance while a solo driver hears nothing. But if the lane is tagged highway=motorway as you propose, then the solo driver hears “At the fork, keep right,” which is confusing and annoying.

As long as you tag it as a highway=motorway_link, then you won’t need to add it to any route relations, since the HOV lane isn’t signposted as a different route than the free lanes.

I think you’d have to pair this with lanes=0, weird as it may seem, to avoid implying that the lane is always present but just closed during part of the day. Or maybe you’d pair lanes=1 with lanes:conditional=0 @ …, using the inverse time span as with highway:conditional=* above.

1 Like

Minh, thank you for the detailed response! I didn’t know those details about highway=motorway_link. So the changed tags now look like this (the rest are the same as above):

highway:conditional=no @ (Mo-Fr 00:00-05:00,10:00-24:00; Sa,Su)
highway=motorway_link
lanes:conditional=0 @ (Mo-Fr 00:00-05:00,10:00-24:00; Sa,Su)
lanes=1

…nothing?! Because the lane is not there. But I agree, it doesn’t make much sense.

It’s the same route as the main road, that’s why I copied ref=I 93;US 1;MA 3 from it (should I?) and thought that I needed to add it to the three relations. Is it that highway=motorway_links aren’t added to route relations? I found this:

Link roads (highway=*_link) from and to the route. See highway=motorway_link. Note: this is at best extremely dubious, or maybe always unwanted. In many cases, maybe all, adding link roads from and to the route is incorrect.

(Relation:route - OpenStreetMap Wiki)
However here it refers to the usual, short on-/off-ramps: “from and to the route”. This HOV lane “link” doesn’t match that description because it doesn’t connect different routes/road types…

In any case, I’m fine with the tagging as is, there is no ideal solution here. I’ll continue with the mapping this way. Other ideas are welcome too.

1 Like

It’s unclear, but in the interest of minimizing forks in a route relation, you could create a separate route relation just for the HOV lane and make it a member of the same superrelation as the main route relation. That approach is normally required for special routes like “Interstate 35W Express”, which has slightly different route signs than Interstate 35W.

Done! Changeset: 138389282 | OpenStreetMap. Thanks for the discussion!

I’ve noticed here OpenStreetMap that the same I-405 with two left HOV lanes separated by a double solid white line (“do not cross”) is mapped in different ways in two directions: going South with all (5) lanes on one polyline and going North with 2 HOV lanes and 3 normal lanes on two separate polylines. Based on my research [1], since there is no physical separation, the former is correct, isn’t it?

[1]: Editing Standards and Conventions - OpenStreetMap Wiki, Key:lanes - OpenStreetMap Wiki, How many lanes should be extracted into separated way? - OSM Help, Mapping junctions of roads separated only by a crosshatched area - #3 by Mateusz_Konieczny.

Yes, technically it should be just one carriageway (with change:lanes=* and turn restrictions as appropriate). However, mappers sometimes see this as pedantic, since crossing over the line is unlawful (even moreso than crossing over a double-yellow line in some situations).

Part of the problem is that change:lanes=* is being used to represent both single and double solid white lane dividers. Single solid white lane dividers are vastly more common, but technically they only discourage lane changes. For example, in the scene below, when turning right from this driveway onto westbound Waycross Road, it’s perfectly OK to cross the solid lane dividers to get into the left turn lane, but if you’re already on Waycross Road, you aren’t supposed to cross these lines just to change lanes.

By contrast, crossing a double white lane divider is always a traffic violation, but it’s tagged identically as change:lanes=no|not_left|…. The separate carriageway at least serves to emphasize this separation. However, in practice, no router would ever recommend crossing a lane change restriction along a straightaway like the one you found on I-405, so in my opinion, there isn’t much harm in combining the carriageways.

I was referring to the situations where there is unquestionably a physical separation, such as a Jersey barrier. This is also common in urban freeways that have collector-distributor lanes.

1 Like