What is the duration of a multi-way ferry route?

A ferry route is conventionally mapped as a single route=ferry way from terminal to terminal, with a duration tag so routers don’t have to assume the boat’s speed. But occasionally it becomes necessary to split the way and join the ways with a route=ferry relation. Logically, the relation would have a duration tag, but should each member way also have a duration tag? If so, should each way have the same overall duration or some fraction of the duration based on its length?

For example, this car ferry between Manitowoc, Wisconsin, and Ludington, Michigan, is a popular alternative to driving all the way around Lake Michigan. It’s supposed to take around 4½ hours. Unlike a similar ferry to the south, the Manitowoc–Ludington ferry is currently represented by two route=ferry ways that meet at the Wisconsin–Michigan state line (which is also the Central–Eastern time zone boundary). The entire route is part of U.S. Route 10, which, like every U.S. Route, is split into a separate relation per state. (In principle, the same thing could happen with two routes belonging to different networks.)

The differing relations requires us to maintain multiple ways. The relation approach used extensively for situations like this. However, the documentation is silent on how to determine the duration of each member way. When this ferry’s way was split in 2018, the duration remain unchanged at 4½ hours. Unfortunately, if you get walking directions from GraphHopper, OSRM, or Valhalla, the estimated travel time is a whopping 9 hours:

GraphHopper foot

But if you drive, some ostensibly faster options become available. GraphHopper and Valhalla avoid the ferry in favor of a parallel ferry to the south between Milwaukee, Wisconsin, and Muskegon, Michigan. This ferry route needs only one way because it doesn’t belong to any highway route. Its faster boat takes only 2½ hours, but it’s so out of the way that it adds about 2 hours to the trip, for a total travel time of 6½ hours:

GraphHopper Valhalla

BRouter, Openrouteservice, and OSRM take a detour all the way around the lake via Chicago, taking 6½–7½ hours for what was supposed to be a 4½-hour trip:

BRouter Openrouteservice OSRM

As for mobile applications, I couldn’t get either OsmAnd or Organic Maps to calculate a route between these two endpoints, but Magic Earth prefers driving on the Manitowoc–Ludington ferry. It thinks the ferry takes only 3 hours, probably because it ignores the duration tag:

In this case, ignoring the duration is probably better than giving an unhelpful route around the lake. If the ways lack duration tags, then perhaps routers could know to consult the relation. Or maybe it’s OK to just tag each way with half the duration. Both edits are easy, but I’m curious if others have come across a similar situation elsewhere. Whichever interpretation is correct, we should be consistent and document our expectations so that routing engines can ensure reliability.

1 Like

I haven’t come across exactly this similar situation elsewhere (though I have encountered this exact ferry in my mapping of US Bicycle Routes). However, I have come across situations where “breaking out the data into ‘componentized’ (if that’s a word) elements” makes sane calculations (such as one-way vs. roundtrip) possible.

So, I’d suggest, even recommend that “reducing to simpler elements” be done here, meaning in this context, as you note, “tag each way with half the duration.” Whether it is duration, directionality, uphill vs. downhill, “there is weather that allows westward passage but eastward is delayed until the storm is over” or a thousand other reasons, it is always better, because it is possible to “combine elements together,” (if you need to), than it is to “break them apart…but where and how?” because you don’t know “where and how.” Where boundaries exist (by being componentized) you can do this. Where things are glommed into a whole, you can’t.

1 Like

I would suggest to use a single way and if you don’t want to choose between both states, create a separate route relation for the ferry part of U.S. Route 10 - I also did this for the E 30 in the North Sea.

Even if you split the duration across both ways, it won’t work, because you’ll probably still duplicate the waiting time estimates in routers (which can be estimated based on the tagged frequency).


A separate relation for the overlake portion of the route sounds like a decent compromise, though it only addresses cases where the two routes belong to the same network and have the same number – essentially, where they would get the same shield on a map. Hopefully I don’t come across a case of two unrelated routes on different halves of a ferry route immediately after accepting this answer. :smiley:

Incidentally, it hasn’t been tagged yet, but this ferry between Indonesia and Singapore is part of Asian Highway AH2, which has a different-looking shield in either country. But renderers probably have to do some postprocessing to figure out how to draw AH shields in each country anyways.

Actually, the screenshots and links demonstrate that routers double the estimated travel time when both ways have the overall duration, but if both ways have only half the duration, then routers would add up both halves. (This is how a multi-stop ferry would be tagged anyways.) The question is whether we find that approach acceptable or consider it to be a hack (tagging for the renderer, where “renderer” is all the routers). In practical terms, it would pose a problem to any renderer that attempts to label the duration, as some print maps do.

1 Like

Actually E-routes are signed in the Netherlands but unsigned in the UK. But I don’t think we need to worry about having the route labels terminate mid-water, since road routes are never signed on buoys anyway. :laughing:

If there is really a network change then I guess you could include the ferry in both routes or in neither. BTW Your example is Indonesia-Indonesia and does not enter Singapore.

1 Like

A bit tongue-in-cheek, and an aside to an otherwise interesting and looking-like-it-will-become-a-ferry-issue-we’ll-eventually-solve, I’ll confirm that the (Muskegon-Milwaukee) ferry for USBR 30 (the ship has a “USBR 10” shield painted on it, itself kind of sly, certainly worthy of a grin) may or may not be “multi-way” but from a quote of an email by Kerry Irons (Adventure Cycling Association) sent to me April 2020:

“The Lake Michigan ferries are NOT part of the federal or state highway system. This was specifically addressed with USBR 20 in Michigan where the last bit of the route on the west end is on US 10. Even though the ferry to Wisconsin has “US 10” painted on the stern, neither Wisconsin nor Michigan nor AASHTO recognizes the ferry as part of the federal highway system. And since Michigan doesn’t have a USBR 30 there is no point in having a short spur in Muskegon. The route ends at the Milwaukee ferry dock. If Michigan some day does a USBR 30, it would end at the Muskegon ferry dock.”

The moral(s) of these stories: things are not always as simple as they seem, nor as simple as they seem they might be. And, I do hope we get figured out “what is the duration of a multi-way ferry route?,” even if this seems much more a “renderer” (router, really) issue, though it does happen that such issues propagate back to the need for better data in OSM in the first place. Perhaps this flavor of issue should be given a name in OSM, so frequently does Minh seem to bring them to our attention. (I’m glad he does: better data are better data). And sometimes, “better” means simply “more precisely specified.”

That teaches me to respond from a phone! There’s apparently another ferry leg from Batam to Singapore, but this portion of the route isn’t that well specified. This official OSM-based map skips over Batam entirely, even though there’s no direct ferry service between Jakarta and Singapore.

In 2015, AASHTO officially designated the ferry as part of U.S. 10 in response to a joint request by the Michigan and Wisconsin transportation departments, on the basis that a ferry is “no different than a toll bridge”. (Minor details.) According to this index of AASHTO minutes, they don’t appear to have deleted it from the route since then. Plus it’s clearly verifiable on the, uh, ground.

I do agree that it makes sense to split out the overlake segment as a separate route relation, if only because the ferry runs seasonally. Changeset 131,899,892 creates a new Lake Michigan–only relation for U.S. 10, with notes explaining the situation. Changeset 131,900,047 updates the duration and months of operation.