Skip to content

Add quest to specify whether a ferry requires payment#6726

Open
mcliquid wants to merge 5 commits intostreetcomplete:masterfrom
mcliquid:feature/add-ferry-toll-quest-6333
Open

Add quest to specify whether a ferry requires payment#6726
mcliquid wants to merge 5 commits intostreetcomplete:masterfrom
mcliquid:feature/add-ferry-toll-quest-6333

Conversation

@mcliquid
Copy link
Copy Markdown
Contributor

This adds a new quest for ferries (route=ferry) to record whether using the ferry generally requires payment.

The quest is shown only when no toll=* or fee=* tagging is present and skips all already mapped or complex cases (e.g. toll:*, fee:*).

It uses a simple yes/no question:

  • Yes → toll=yes
  • No → toll=no

The applicability logic matches existing ferry access quests: ways that are part of a ferry route relation are excluded so that the quest is asked on the relation instead.

Closes #6333

image image

@westnordost
Copy link
Copy Markdown
Member

You're not from Hamburg, are you?

Copy link
Copy Markdown
Member

@westnordost westnordost left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand this supersedes #6556? Comparing the two, it looks like it is an (accidental) duplicate. It is funny how similar the implementations are, even the icon is (almost) the same.

The main difference being that this one tags toll and the other tags fee. Usages of both are roughly the same: about 3000 for either of them. So until there is a push from the community for either of them, I think it doesn't matter which one we use.

I don't want to make it complicated. @paulklie 's PR has been lying around unfinished for a while, so I'm fine with bringing this one to its completion and close the other.

Notes from the other PR:

  • I think override val wikiLink = "Tag:route=ferry" is slightly better (but I don't care that much)
  • Note the discussion in https://github.com/streetcomplete/StreetComplete/pull/6556/changes#r2779904792 - in short, what if only motor vehicles need to pay? Is it then even correct to tag fee=yes? Because if a fee is only imposed on motor vehicles, the answer to the question "Do you generally have to pay to use this ferry?" would still be yes, right?

@paulklie
Copy link
Copy Markdown
Collaborator

paulklie commented Feb 11, 2026

I don't want to make it complicated. @paulklie 's PR has been lying around unfinished for a while, so I'm fine with bringing this one to its completion and close the other.

The primary reason for this is that we have not reached concensus on how the fee tags should be asked in #6333.

Though we seem to have consensus on using toll and not fee, and asking for each form of transport individually. @mcliquid could you check out that discussion?

@mcliquid
Copy link
Copy Markdown
Contributor Author

You're not from Hamburg, are you?

Not really 😁

I understand this supersedes #6556?

Yes, indeed, that's my fault, I really overlooked or forgot that. That was very unfortunate.

The main difference being that this one tags toll and the other tags fee

I based my decision on the forum poll, in which 44% voted for toll and 32% for fee:
https://community.openstreetmap.org/t/toll-yes-or-fee-yes-for-ferry-routes/119341

I think override val wikiLink = "Tag:route=ferry" is slightly better (but I don't care that much)

I'm completely open about this, but shouldn't there be a link here to the tag that is also being changed?

Note the discussion in https://github.com/streetcomplete/StreetComplete/pull/6556/changes#r2779904792 - in short, what if only motor vehicles need to pay? Is it then even correct to tag fee=yes? Because if a fee is only imposed on motor vehicles, the answer to the question "Do you generally have to pay to use this ferry?" would still be yes, right?

AFAIK the consensus was essentially: toll=yes if any relevant use is subject to a charge, especially for motor vehicles.
This is because the vast majority of ferries are primarily transport connections. If vehicles have to pay, the ferry is effectively subject to a toll. toll=yes does not mean “for everyone,” but “there is a toll.”
We could change the wording to Is this ferry generally subject to a toll?

could you check out that discussion?

Yes, see link above:
image

@paulklie paulklie added the new quest accepted new quest proposal (if marked as blocked, it may require upstream work first) label Feb 11, 2026
@mcliquid mcliquid mentioned this pull request Feb 12, 2026
@westnordost
Copy link
Copy Markdown
Member

I think override val wikiLink = "Tag:route=ferry" is slightly better (but I don't care that much)

I'm completely open about this, but shouldn't there be a link here to the tag that is also being changed?

Not really. The link is meant to be a "read more" link for the specific quest type. This often relates to the key being changed, but also could relate to the feature itself being changed or some other wiki page.

@paulklie
Copy link
Copy Markdown
Collaborator

Yes, see link above:

I was mostly refering to how we would handle ferries where certain passengers need to pay and others do not. It seemed to me as if the consensus was to create one quest for each type of transport (motor_vehicle, bicycle, foot etc.).
We got stuck on if cyclist are considered pedestrians on ferries.

@mcliquid
Copy link
Copy Markdown
Contributor Author

I was mostly refering to how we would handle ferries where certain passengers need to pay and others do not. It seemed to me as if the consensus was to create one quest for each type of transport (motor_vehicle, bicycle, foot etc.).
We got stuck on if cyclist are considered pedestrians on ferries.

I interpret the discussion on this topic as follows:

AFAIK the consensus was essentially: toll=yes if any relevant use is subject to a charge, especially for motor vehicles.
This is because the vast majority of ferries are primarily transport connections. If vehicles have to pay, the ferry is effectively subject to a toll. toll=yes does not mean “for everyone,” but “there is a toll.”

With toll, it is already the case that in practice toll=yes is set if any means of transport has to pay, even if, for example, pedestrians and cyclists do not have to pay anything on the toll road.
And with fee=yes, it is actually the same IMO. A museum with fee=yes often has exemptions for certain groups of people (Disabled persons, military personnel, retirees, unemployed persons, ...) or small children. This means that there are cases where some people pay something and some do not.
As long as one group of persons has to pay for something, we simply set fee=yes or, in this case, toll=yes. If there are certain exceptions, you would have to add toll/fee:bicycle=no in more detail.

@mnalis
Copy link
Copy Markdown
Member

mnalis commented Feb 13, 2026

toll=yes does not mean “for everyone,” but “there is a toll.”

Yes, but SC users are not privy to wiki documentation, and might interpret it differently 🤷‍♂️

We could change the wording to Is this ferry generally subject to a toll?

I think it would mostly replace one confusion with another (i.e. what exactly is meant by "generally"? If the ratio of cars vs. pedestrians is about 50-50, and one group has to pay and other not, is there "generally a fee" or not? How about if it is 70-30 or 30-70? etc. )

If the quest were to remain in this simplistic format (i.e. only tagging toll=* and not toll:*=*), I would really suggest rephrasing as "Is using this ferry free for everyone?" (and tag toll=no if answered "yes", and toll=yes if answered "no"). At least to me, it would sound most clear and with least possible chances of different interpretations.

As long as one group of persons has to pay for something, we simply set fee=yes or, in this case, toll=yes. If there are certain exceptions, you would have to add toll/fee:bicycle=no in more detail.

That is reasonable explanation, I can accept that.

But I'd still consider it wasted opportunity if we tagged just simple toll=yes/no instead of using the opportunity of on-the-ground mapper to map extra details (toll:motorcar=yes/no, toll:foot=yes/no, etc.) if there is a way can reasonably easy gather and record that information (and I think we can do that for most cases, except perhaps bicycles where there is seemingly no consensus what toll:bicycle=* actually means1)

Footnotes

  1. i.e. does toll:foot=yes + toll:bicycle=no mean that all persons have to pay, but there is no extra surcharge for bringing on the bicycle; or does it mean that people who board without bicycles have to pay regular price, but those that board with bicycles do not have to pay anything - not for themselves nor for the bicycle?

@mcliquid
Copy link
Copy Markdown
Contributor Author

But I'd still consider it wasted opportunity if we tagged just simple toll=yes/no instead of using the opportunity of on-the-ground mapper to map extra details (toll:motorcar=yes/no, toll:foot=yes/no, etc.) if there is a way can reasonably easy gather and record that information

That would essentially be the GuidepostSports quest from SCEE, just with slightly fewer options, correct?
In SCEE, it would be a piece of cake for me to reuse that quest, but as far as I can see, the quest is not transferable to StreetComplete because StreetComplete does not have ImageSelect, correct?
How could such a multi-selection be implemented with graphics in SC? Or possibly even with text alone?

@paulklie
Copy link
Copy Markdown
Collaborator

Another thing to consider:
If a ferry only allows pedestrians, (foot=yes, bicycle=no etc...), any multi select form should only ask if pedestrians need to pay. However this might be confusing if there is an image select with only a single option.

So for such special cases we probably need a special solution.

@mcliquid
Copy link
Copy Markdown
Contributor Author

How could such a multi-selection be implemented with graphics in SC?

We could use my approach for the Charger Sockets here. Graphics of pedestrians, bicycles, cars, trucks, etc. to select several, and then the tag is set for each one.
image

If a ferry only allows pedestrians, (foot=yes, bicycle=no etc...), any multi select form should only ask if pedestrians need to pay. However this might be confusing if there is an image select with only a single option.

I have no idea whether it is possible to set up a split quest that uses multiple selection (see above) if more than one access tag (e.g., foot=yes + bicycle=yes) is set and a simple yes/no quest if only one is set. But that would solve it, in my opinion.
Of course, you could create two separate quests. One quest searches in elementFilter for all objects that have only one access tag. And a second one searches for objects with more than one access tag. That would be easier, but not as nice.

@mcliquid
Copy link
Copy Markdown
Contributor Author

Follow-up questions:

Which modes of transport should be supported?

We should confirm the final list of relevant access tags that should appear in the multi-select. Typical candidates would be:

  • foot
  • bicycle
  • motor_vehicle
  • motorcar
  • motorcycle
  • hgv
  • bus
  • possibly horse

Question:

  • Should we only display tags that are explicitly set to =yes?
  • Or also those that are implicitly allowed (i.e., not =no)?

I would suggest: Only those with explicit =yes to avoid interpretation problems.

Some data:
We have 34981 route=ferry:

access-Tag Count Percentage of routes
foot 12 648 ~36 %
motor_vehicle 12 596 ~36 %
bicycle 7 908 ~23 %
motorcar 2 378 ~6,8 %
horse 1 662 ~4,7 %
hgv 1 001 ~2,9 %
motorcycle 880 ~2,5 %
bus 53 ~0,15 %

(There is tons of potential for the FerryAccess quests!)

How often is yes explicitly set?

Tag Share of „yes“
foot 12 241 / 12 648 ≈ 97 %
bicycle 6 715 / 7 908 ≈ 85 %
motor_vehicle 4 204 / 12 596 ≈ 33 %
motorcar 1 117 / 2 378 ≈ 47 %
hgv 398 / 1 001 ≈ 40 %
motorcycle 543 / 880 ≈ 62 %
horse 172 / 1 662 ≈ 10 %
bus 29 / 53 ≈ 55 %
  • foot=yes is almost always set when foot is tagged.
  • motor_vehicle is frequently set, but often not as yes (i.e., presumably no or conditional).
  • horse is usually explicitly restricted. (iD preset?)
  • bus is practically irrelevant (only 53 worldwide).

If we only displayed explicit =yes, the UI would imply that most ferries do not allow anything.

Should toll=yes continue to be set?

If multiple modes of transport are selected:
Option A:

toll:foot=yes
toll:bicycle=yes

and NO toll=yes
Option B:
Always add: toll=yes in addition to at least one set toll:*=yes

Behavior with existing toll:* tags

What should happen if:

toll:foot=yes
toll:bicycle=yes

already exist?

  1. Display the quest anyway?
  2. Or only if toll is completely missing?
  3. Or only if toll=yes/no is missing?

elementFilter

The quest should appear at:

route=ferry
and !toll (for toll=no/yes)
and !toll (for fee=no/yes)
and !toll:* (for toll:bicycle=no/yes)
and !fee:*  (for fee:bicycle=no/yes)

BTW: We have ~3.400 toll (incl. sub-keys) and ~3.000 fee (incl. sub keys) on route=ferry.
But sub keys are extremely rare, only 12x toll:bicyle and 10 toll:foot.

UI Decision

  1. ItemsSelectGrid with Icons (in Compose) (like recycling)
  2. AItemsSelectQuestForm with Icons (like guidepostSport)

Technical Solution

I would try to use something like this in the AddFerryTollForm:

override fun createForm() =
    if (hasOnlySingleRelevantAccessTag(tags)) {
        YesNoQuestForm()
    } else {
        AddFerryTollMultiForm()
    }

@mnalis
Copy link
Copy Markdown
Member

mnalis commented Feb 18, 2026

In SCEE, it would be a piece of cake for me to reuse that quest, but as far as I can see, the quest is not transferable to StreetComplete because StreetComplete does not have ImageSelect, correct?

Isn't the Recycling Quest in SC pretty similar? What is the difference exactly?

I would suggest: Only those with explicit =yes to avoid interpretation problems.

Makes sense to me.

And we do have Quests for AddFerryAccessMotorVehicle, AddFerryAccessPedestrian, AddFerryAccessBicycle and AddFerryAccessHgv is in the works, so they would add missing access values if needed (or we can devise additional access quests if they turn out to be popular). For the tiny rest, there is always "Leave note".

Should toll=yes continue to be set?

No, I wouldn't add that, but would only tag transport-mode-specific toll:hgv=yes/no, toll:foot=yes/no etc. that the SC mapper has explicitly selected. The data consumer who wants to know "whether any toll is charged there" can simply look for any toll:*=yes in addition to toll=yes.

On the adder hand, adding toll=yes in addition to more detailed toll:*=yes/no might imply it is some kind of default -- i.e. that anything not specifically enumerated might be assumed to be yes; and SC mapper never attested to such claim, so we should not be adding generic toll=*.

Behavior with existing toll:* tags
What should happen if:

toll:foot=yes
toll:bicycle=yes

If any of toll:*=* already exists, I'd just skip the quest. Presence of existing transport-mode-specific toll tags indicate someone has already surveyed that data -- either SC mapper themselves (so we should stop showing the solved quest!), or someone did it with likely even more precision then SC is capable of (Think toll:conditional=* etc).

route=ferry
and !toll (for toll=no/yes)
and !toll (for fee=no/yes)
and !toll:* (for toll:bicycle=no/yes)
and !fee:*  (for fee:bicycle=no/yes)

Well, we could still ask even when only generic toll=* / fee=* is tagged, as we would be providing more detailed information (I'd remove existing generic toll=* and fee=* when we add more specific toll:*=yes/no to avoid confusion).

So we should skip the quest only when there is any transport-mode-specific toll:*=* or fee:*=* tagged already.

There is that question mentioned somewhere whether we should be asking only on relations or on ways too (sometimes route=ferry is tagged only on ways and there is no relation; but if we decide to do on ways too, we should explicitly exclude ways that are also part of route=ferry relations)

@matkoniecz
Copy link
Copy Markdown
Member

matkoniecz commented Feb 18, 2026

I'd remove existing generic toll=* and fee=* when we add more specific toll:*=yes/no to avoid confusion

I disagree, having general toll= is useful and specifying detailed info as extra tags.

But I would probably not set it with quest either.

@mnalis
Copy link
Copy Markdown
Member

mnalis commented Feb 18, 2026

I disagree, having general toll= is useful and specifying detailed info as extra tags.

Interesting view, to me it would seem to introduce more confusion. But, perhaps then stick with original proposal, i.e. only ask on those ferries which do not have any fee/toll tags (neither generic fee=*/toll=* nor specific fee:*=* / toll:*=*)?

That seems to be something we all agree on, is more simply as it does not have strange corner cases, and it still covers hefty ~82% of the route=ferry elements. Would that seem OK (at least for initial version of this quest) to you too @matkoniecz ?

But I would probably not set it with quest either.

Definitely agree there; we ask about transport-mode-specific toll:*=* tags, and so we should tag only transport-mode-specific toll:*=* tags.

@matkoniecz
Copy link
Copy Markdown
Member

That seems to be something we all agree on, is more simply as it does not have strange corner cases, and it still covers hefty ~82% of the route=ferry elements. Would that seem OK (at least for initial version of this quest) to you too @matkoniecz ?

yes

@mcliquid
Copy link
Copy Markdown
Contributor Author

Isn't the Recycling Quest in SC pretty similar? What is the difference exactly?

SCEE has for example an AImageListQuestForm and an ImageSelectAdapter for the guidepostSports-Quest, which is an XML-based image cell layout, completely without Compose and therefore not directly transferable. The SC-RecyclingMaterial-Quest uses the Compose ItemsSelectGrid which I am not yet very familiar with.


For the rest I mark down:

  • Only transport-specific toll:*=yes/no set, no general toll=no/yes
  • Skip if toll:*=* or fee:*=* exists
  • Prefer route=ferry relations and Ferry-Ways only if no relation exists

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new quest accepted new quest proposal (if marked as blocked, it may require upstream work first)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Quest: Do you need to pay to use this ferry?

5 participants