Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Render more specific access tags i.e. bicycle, motor_vehicle etc #214

Open
joakimfors opened this issue Oct 5, 2013 · 56 comments · May be fixed by #4952
Open

Render more specific access tags i.e. bicycle, motor_vehicle etc #214

joakimfors opened this issue Oct 5, 2013 · 56 comments · May be fixed by #4952

Comments

@joakimfors
Copy link

More specific access tags such as bicycle=, motor_vehicle= etc should be rendered.

@matkoniecz
Copy link
Contributor

I think that it is overrendering and I would implement it in separate layers (like Cyclemap).

@matthijsmelissen
Copy link
Collaborator

In addition, we also should access restrictions for the car and vehicle keys.

@matthijsmelissen
Copy link
Collaborator

@matthijsmelissen matthijsmelissen added this to the 3.x - Needs upgrade to mapnik or openstreetmap-carto.style milestone Jul 20, 2014
@simonpoole
Copy link

I've done some more thinking about this specific can of worms and would suggest that we apply some nomalisation on import to the access tags, likely via LUA transforms. .

This naturally opens another, different can of worms, and, will, to be effective require a reimport, but that is going to be unavoidable anyway.

The alternatives: adding specific columns or using hstore seem to be overkill given that without going in to a multi-color-pattern frenzy there is no way to render the detailed individual access values anyway.

I believe doing normalisation on import is likely to be the the lightest weight way of doing this and doesn't require changes to the actual style.

Roughly this would imply mapping
access, vehicle, motor_vehicle and motorcar to access
some thought needs to be given to both key and value precedence.

@dieterdreist
Copy link

Am 21.03.2015 um 13:47 schrieb simonpoole notifications@github.com:

The alternatives: adding specific columns or using hstore seem to be overkill

I propose using hstore, it might be overkill for this particular problem, but there are lots of other opportunities that such a move would bring us, including support for the alternative public transport scheme, tower types, cuisine types, landuse refinements and basically all more details for objects we already render or can currently not reasonably render because of missing information.

@simonpoole
Copy link

simonpoole commented Mar 21, 2015

Am 21.03.2015 um 18:06 schrieb dieterdreist:

Am 21.03.2015 um 13:47 schrieb simonpoole notifications@github.com:

The alternatives: adding specific columns or using hstore seem to be
overkill

I propose using hstore,

Why do you then give us lots of reasons why we would want to avoid enabling
hstore in any circumstances?

@matkoniecz
Copy link
Contributor

After attempting to show this kind of data in a different map style I reached conclusion that it is not doable in a readable way, without making it primary data presented on the map.

@kocio-pl
Copy link
Collaborator

I also don't believe we have a space for showing such features - even such simple feature as general surface rendering is still not done (see #2640), so i will close this ticket.

@simonpoole
Copy link

@kocio-pl I think we would all be happy if correct access tags would simply be treated the same as wrong ones, see #371 So either don'r render them at all or all the same.

@kocio-pl
Copy link
Collaborator

Could you be more specific what is wrong currently and should be fixed? I'm not aware of access tag problems.

@simonpoole
Copy link

simonpoole commented Oct 22, 2017

See the #371 an oldie but goldie. To be clear that issue is not about giving every possible access combination its own rendering, which is likely hopeless, just about being consistent.

@matthijsmelissen
Copy link
Collaborator

Reopening.

@jeisenbe
Copy link
Collaborator

If I understand @simonpoole correctly, the request is to render motorcar=no, and motor_vehicle=no the same as access=no, and motorcar=destination, motor_vehicle=destination the same as access=destinaton, and so on. Is that right?

"it would seem to be sensible to render at least the most of the time correct motorcar=destination and motor_vehicle=destination the same" - from PR #371

Also see #3304, #1312 (duplicate), #1308 (might render motor_vehicle=agricultural/forestry the same as destination or private)

@simonpoole
Copy link

Is that right?

Yes, and there are two ways to do that, either by using the same rendering, or not rendering at all.

@imagico
Copy link
Collaborator

imagico commented Aug 24, 2019

One possible guiding principle could be to render access restrictions w.r.t. the primary mode of transport of the road class in question.

That would mean render motorway to unclassified plus residential and service based on

access, vehicle, motor_vehicle, motorcar

with priorities according to the usual scheme with the more specific tags overriding the more general ones. Implementation could look like:

CASE
    (CASE 
      WHEN (tags->'motorcar' IN ('yes', 'designated', 'permissive', 'no', 'private', 'destination', 'customers', 'delivery')) THEN tags->'motorcar'
      WHEN (tags->'motor_vehicle' IN ('yes', 'designated', 'permissive', 'no', 'private', 'destination', 'customers', 'delivery')) THEN tags->'motor_vehicle'
      WHEN (tags->'vehicle' IN ('yes', 'designated', 'permissive', 'no', 'private', 'destination', 'customers', 'delivery')) THEN tags->'vehicle'
      ELSE tags->'access'
    END)
  WHEN 'destination' THEN 'destination'::text
  WHEN 'customers' THEN 'destination'::text
  WHEN 'delivery' THEN 'destination'::text
  WHEN 'no' THEN 'no'::text
  WHEN 'private' THEN 'no'::text
  ELSE NULL
END AS access

In this case that could be considered to be sufficiently simple and strait-forward to be intuitively understandable for the mapper.

The more difficult part is the other road types, in particular highway=track. Here the primary mode of transport is less clear and #3304 is a serious issue.

Not rendering access restrictions at all could be problematic because completely closed roads (like for example because of serious damage) would not be indicated as such on the map.

@jeisenbe
Copy link
Collaborator

@simonpoole - do you have the time to submit a PR which fixes this issue? I know you are busy with some other Openstreetmap projects, but the code should not be complicated.

@imagico
Copy link
Collaborator

imagico commented Apr 2, 2024

just use COALESCE to fall through the various tags to a default.

To be clear: A simple COALESCE is not going to work because we need to ignore invalid values:

  • access=yes + motorcar=foo would need to mean yes
  • access=no + motorcar=foo would need to mean no

because foo is an invalid access value and means neither yes nor no.

You could still use COALESCE but would need a construction like we use for the feature columns:

COALESCE(
'aeroway_' || CASE WHEN aeroway IN ('gate', 'apron', 'helipad', 'aerodrome') THEN aeroway END,
'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'apartment', 'artwork', 'camp_site', 'caravan_site', 'chalet', 'gallery', 'guest_house',
'hostel', 'hotel', 'motel', 'museum', 'picnic_site', 'theme_park', 'wilderness_hut',
'zoo') THEN tourism END,
'amenity_' || CASE WHEN amenity IN ('arts_centre', 'atm', 'bank', 'bar', 'bbq', 'bicycle_rental',
'bicycle_repair_station','biergarten', 'boat_rental', 'bureau_de_change', 'bus_station', 'cafe',
'car_rental', 'car_wash', 'casino', 'charging_station', 'childcare', 'cinema', 'clinic', 'college',
'community_centre', 'courthouse', 'dentist', 'doctors', 'drinking_water', 'driving_school',
'fast_food', 'ferry_terminal', 'fire_station', 'food_court', 'fountain', 'fuel', 'grave_yard',
'hospital', 'hunting_stand', 'ice_cream', 'internet_cafe', 'kindergarten', 'library', 'marketplace',
'nightclub', 'nursing_home', 'pharmacy', 'place_of_worship', 'police', 'post_box',
'post_office', 'prison', 'pub', 'public_bath', 'public_bookcase', 'recycling', 'restaurant', 'school',
'shelter', 'shower', 'social_facility', 'taxi', 'telephone', 'theatre', 'toilets', 'townhall',
'university', 'vehicle_inspection', 'veterinary') THEN amenity END,
'amenity_' || CASE WHEN amenity IN ('waste_disposal') AND way_area IS NOT NULL THEN amenity END, -- Waste disposal points are rendered in the low priority layer
'amenity_' || CASE WHEN amenity IN ('vending_machine') AND tags->'vending' IN ('excrement_bags', 'parking_tickets', 'public_transport_tickets') THEN amenity END,
'amenity_' || CASE WHEN amenity IN ('parcel_locker') THEN amenity END,
'diplomatic_'|| CASE WHEN tags->'office' IN ('diplomatic') AND tags->'diplomatic' IN ('embassy', 'consulate') THEN tags->'diplomatic' ELSE NULL END,
'advertising_' || CASE WHEN tags->'advertising' in ('column') THEN tags->'advertising' END,
'emergency_' || CASE WHEN tags->'emergency' IN ('phone') AND way_area IS NULL THEN tags->'emergency' END,
'shop' || CASE WHEN shop IN ('yes', 'no', 'vacant', 'closed', 'disused', 'empty') OR shop IS NULL THEN NULL ELSE '' END,
'leisure_' || CASE WHEN leisure IN ('amusement_arcade', 'beach_resort', 'bird_hide', 'bowling_alley', 'dog_park', 'firepit', 'fishing',
'fitness_centre', 'fitness_station', 'garden', 'golf_course', 'ice_rink', 'marina', 'miniature_golf',
'outdoor_seating', 'park', 'picnic_table', 'pitch', 'playground',
'sauna', 'slipway', 'sports_centre', 'stadium', 'swimming_area', 'swimming_pool', 'track', 'water_park') THEN leisure END,
'power_' || CASE WHEN power IN ('plant', 'generator', 'substation') THEN power END,
'man_made_' || CASE WHEN (man_made IN ('chimney', 'communications_tower', 'crane', 'lighthouse', 'mast', 'obelisk', 'silo', 'storage_tank',
'telescope', 'tower', 'wastewater_plant', 'water_tower', 'water_works', 'windmill', 'works')
AND (tags->'location' NOT IN ('roof', 'rooftop') OR NOT (tags ? 'location'))) THEN man_made END,
'landuse_' || CASE WHEN landuse IN ('reservoir', 'basin', 'recreation_ground', 'village_green', 'quarry', 'vineyard', 'orchard', 'cemetery',
'residential', 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farmland',
'greenhouse_horticulture', 'retail', 'industrial', 'railway', 'commercial', 'brownfield', 'landfill',
'construction', 'salt_pond', 'military', 'plant_nursery') THEN landuse END,
'natural_' || CASE WHEN "natural" IN ('peak', 'volcano', 'saddle', 'cave_entrance') AND way_area IS NULL THEN "natural" END,
'natural_' || CASE WHEN "natural" IN ('wood', 'water', 'mud', 'wetland', 'bay', 'spring', 'scree', 'shingle', 'bare_rock', 'sand', 'heath',
'grassland', 'scrub', 'beach', 'glacier', 'tree', 'strait', 'cape', 'reef')
THEN "natural" END,
'mountain_pass' || CASE WHEN tags->'mountain_pass' IN ('yes') THEN '' END, -- after natural=saddle to give priority to that tag on the same node
'waterway_' || CASE WHEN "waterway" IN ('waterfall') AND way_area IS NULL THEN waterway END,
'place_' || CASE WHEN place IN ('island', 'islet', 'square') THEN place END,
'historic_' || CASE WHEN historic IN ('memorial', 'monument', 'archaeological_site', 'fort', 'castle', 'manor', 'city_gate')
THEN historic END,
'military_'|| CASE WHEN military IN ('danger_area', 'bunker') THEN military END,
'highway_' || CASE WHEN highway IN ('services', 'rest_area', 'bus_stop', 'elevator', 'traffic_signals') THEN highway END,
'highway_'|| CASE WHEN tags @> 'ford=>yes' OR tags @> 'ford=>stepping_stones' AND way_area IS NULL THEN 'ford' END,
'boundary_' || CASE WHEN boundary IN ('aboriginal_lands', 'national_park')
OR (boundary = 'protected_area' AND tags->'protect_class' IN ('1','1a','1b','2','3','4','5','6'))
THEN boundary END,
'leisure_' || CASE WHEN leisure IN ('nature_reserve') THEN leisure END,
'tourism_' || CASE WHEN tourism IN ('information') AND tags->'information' IN ('audioguide', 'board', 'guidepost', 'office', 'map', 'tactile_map', 'terminal') THEN tourism END,
'office' || CASE WHEN tags->'office' IN ('no', 'vacant', 'closed', 'disused', 'empty') OR (tags->'office') IS NULL THEN NULL ELSE '' END,
'barrier_' || CASE WHEN barrier IN ('toll_booth') AND way_area IS NULL THEN barrier END,
'waterway_' || CASE WHEN waterway IN ('dam', 'weir', 'dock') THEN waterway END,
'amenity_' || CASE WHEN amenity IN ('bicycle_parking', 'motorcycle_parking') THEN amenity END,
'amenity_' || CASE WHEN amenity IN ('parking') AND (tags->'parking' NOT IN ('underground') OR (tags->'parking') IS NULL) THEN amenity END,
'amenity_' || CASE WHEN amenity IN ('parking_entrance')
AND tags->'parking' IN ('multi-storey', 'underground')
AND (access IS NULL OR access NOT IN ('private', 'no', 'customers', 'permit', 'delivery'))
AND way_area IS NULL
THEN amenity END,
'tourism_' || CASE WHEN tourism IN ('viewpoint', 'attraction') THEN tourism END,
'place_' || CASE WHEN place IN ('locality') AND way_area IS NULL THEN place END,
'golf_' || CASE WHEN tags->'golf' IN ('pin') THEN tags->'golf' END
) AS feature,

@dch0ph
Copy link
Contributor

dch0ph commented Apr 2, 2024

I would beg to differ, that has never been the issue. Even the current two variants could be condensed in to one that simply indicates that there is a use/access restriction on the way.

Yes, this is what I have been aiming at. We can't possibly illustrate the nuances of access tagging in a general purpose map. It would be very useful to have a overlay / JOSM paint style that showed access tagging in all its glory. The only viable approach that I've seen is @imagico's "display the de facto restrictions for the primary mode of transport".

This is not the consensus interpretation of access tags. If you have a road tagged:

motor_vehicle=no
motorcar=yes
that translates to accessible by motorcar because the more specific tag always overrides the more general tag.

I think we have to distinguish between the full interpretation of the tags (as above) and what we show on the map to indicate that there is some sort of access restriction. I would argue (with Simon) that the most appropriate thing to show in this example
would be an access=no rendering to show that there is some "no-like restriction". This is what lead me to the "maximum severity" approach as an even-handed way to consider multiple tags.

That is not correct. Even for things like natural=wood/landuse=forest there are plenty of regions where mapping does make a consistent distinction.

OK, perhaps this is region-specific thing. My threshold for normalising tagging to simplify rendering is lower as I'm working with data extracts. I've removed the designated > yes merger. This leaves the dissolution of highway=path in Lua, but again, this is only out of antipathy for path and to reduce the volume of XML generated. It would be easy enough to retain highway=path and use the path_type approach of imagico's demonstration.

I should point out that the "promotion" of say highway=path + horse=designated|yes is not how Carto currently works and does need discussion too.

@imagico
Copy link
Collaborator

imagico commented Apr 2, 2024

So far the only concrete suggestion of how to interpret more specific access tags has been to indicate the de facto restriction for the primary mode of transport for the road class in question. If you want to suggest a different interpretation please explain it and the reasoning behind it.

If your suggestion means to interpret access=no + motorcar=yes as no on roads - what would be the reasoning behind that interpretation? Since such roads exist in substantial numbers in many countries (usually also with motorcycle=yes of course) you'd nudge mappers to instead tag foot=no + bicycle=no + moped=no + mofa=no + horse=no + carriage=no + anything else that is not a motorcar/motorcycle if they want to avoid the road being shown as not usable. What would be the justification for that?

I should point out that the "promotion" of say highway=path + horse=designated|yes is not how Carto currently works and does need discussion too.

The current treatment of highway=path (that highway=path alone is shown as footway while highway=path + foot=designated + bicycle=designated is shown as cycleway) is not very consistent and should be improved. But this should be done on either the SQL or MSS level IMO.

@pnorman
Copy link
Collaborator

pnorman commented Apr 2, 2024

To be clear: A simple COALESCE is not going to work because we need to ignore invalid values:

  • access=yes + motorcar=foo would need to mean yes

I am fine with that becoming foo and it being regarded as an unknown value.

@dch0ph
Copy link
Contributor

dch0ph commented Apr 2, 2024

If your suggestion means to interpret access=no + motorcar=yes as no on roads - what would be the reasoning behind that interpretation?

No, I'm not saying this. There is just a subtle change to the logic of combining vehicle, motor_vehicle and motorcar. In your code:

       (CASE
        WHEN ($5 IN ('yes', 'designated', 'permissive', 'no', 'private', 'destination', 'customers', 'delivery')) THEN $5
        WHEN ($4 IN ('yes', 'designated', 'permissive', 'no', 'private', 'destination', 'customers', 'delivery')) THEN $4
        WHEN ($3 IN ('yes', 'designated', 'permissive', 'no', 'private', 'destination', 'customers', 'delivery')) THEN $3
        ELSE $2
      END)

[where $5 is motorcar, $4 is motor_vehicle, $3 is vehicle]

The access restriction marking is determined by motorcar if set to a valid value, motor_vehicle if this isn't set (to a valid value), then vehicle.

In my code, the combination is set by the most restrictive of these 3 tags. The rest of the logic is exactly the same as yours.

So access=no + motorcar = yes would (or should!) translate to int_access=yes.

motor_vehicle=no + motorcar=yes would translate to int_access=no, but would correspond to yes for your code because you prioritise motorcar.

motor_vehicle=yes + motorcar=no would also translate to int_access=no, but would correspond to no in your code.

P.S. For the avoidance of doubt, I'm not saying this is the way to do it - I would be just as happy to see your code being adopted. I just felt more comfortable with an "even handed" approach to combining the vehicle tags.

@imagico
Copy link
Collaborator

imagico commented Apr 2, 2024

I see. If you special case access=* there are less practically common cases where this would lead to problematic results. The question remains: Why would you prefer such logic? Why do you consider it more even handed considering the access tags form a clear hierarchy and tag documentation explicitly mentions the possibility to override with more specific tags?

Opinions and arguments of others would be equally appreciated.

  • access=yes + motorcar=foo would need to mean yes

I am fine with that becoming foo and it being regarded as an unknown value.

But that would mean access=no + motorcar=foo is interpreted as yes because the default access is yes. Is that desirable?

@dch0ph
Copy link
Contributor

dch0ph commented Apr 3, 2024

The question remains: Why would you prefer such logic? Why do you consider it more even handed considering the access tags form a clear hierarchy and tag documentation explicitly mentions the possibility to override with more specific tags?

As, I say, I'm not going to die on hill over the two ways of combining the motorcar, motor_vehicle, vehicle tags:
PRIORITISE SPECIFIC(motorcar > motor_vehicle > vehicle)
vs
MOST RESTRICTIVE(motorcar, motor_vehicle, vehicle)
since they only differ in a few cases, and any vaguely logical rendering is better than none.

Ultimately we are combining three tags to basically YES / NO on showing an access restriction (ignoring destination-type access). So there cannot be a scheme that "interprets" the tags to give an unambiguous result.

The presence of an "no (vehicle) access" on a road is going to be ambiguous. So it is useful to think what we would put in any legend for "no (vehicle) access". The render should be intuitive for the user.

I was unhappy with PRIORITISE SPECIFIC, since it is hard to articulate what the presence of "no (vehicle) access" marking on the final map means [EITHER motorcar is NO, or if motorcase is not set, motor_vehicle is NO, or if neither are set, vehicle is NO, or if none are set then access is NO]

I suggested "MOST RESTRICTIVE" since the legend would read "A no (vehicle) access restriction is present".

PRIORITISE SPECIFIC has the advantage of being straightforwardly expressed in nested SQL of course.

Yes, we definitely want views / some semblance of agreement, not least because how to render access restrictions is not a Carto-specific issue.

[I've removed the Lua transformations from the gist.]

@imagico
Copy link
Collaborator

imagico commented Apr 3, 2024

I suggested "MOST RESTRICTIVE" since the legend would read "A no (vehicle) access restriction is present".

But would that actually be meaningful for the map user?

You could tag

  • access=no + motorcar=yes + motorcycle=yes or
  • vehicle=no + foot=no + horse=no + motorcar=yes + motorcycle=yes

and both would be practically identical for the vast majority of map users and both would be considered valid tagging. But - as i understand your concept - they would be shown differently in the map.

Ultimately we are combining three tags to basically YES / NO on showing an access restriction (ignoring destination-type access). So there cannot be a scheme that "interprets" the tags to give an unambiguous result.

There is if our goal is to show the usability for a specific mode of transport. That is the whole point of the hierarchical access tagging system in OSM with more specific tags overriding the more general ones.

For normal road classes the suggested primary mode of transport is the four wheeled passenger automobile.

@dch0ph
Copy link
Contributor

dch0ph commented Apr 3, 2024

OK. I'm convinced!

For normal road classes the suggested primary mode of transport is the four wheeled passenger automobile.

This is the key aspect. I was coming from the angle of pedestrian-oriented maps and was looking to indicate quieter roads with any vehicle restriction, and was uneasy about prioritising motorcar. If we accept that the "legend" would read "no access for motor cars", then we can indeed leverage the hierarchy of vehicle > motor_vehicle > motorcar. The differences are minor (the case of motorcar=yes, motor_vehicle=no is rather far fetched).

@Gazer75
Copy link

Gazer75 commented Apr 5, 2024

I don't know how things work across the world, but aren't most restrictions aimed at motorized traffic on public roads?
Key is to stop silly tagging like access=no/destination + a whole bunch of overriding tags to make routing work.
As I've said before, like it or not, people unfortunately tag for the renderer a lot.

Most common sign used here is https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/NO_road_sign_306.1.svg/240px-NO_road_sign_306.1.svg.png with a sign below basically saying it applies for through-traffic. Often used on residential roads.

A simple motor_vehicle=destination is enough for this and ideally should also show up on the map.

@simonpoole
Copy link

The main issue is and has been for the last decade, that the conclusion that a perfect solution isn't possible serves as an argument to continue doing the totally broken thing. Instead of either not rendering the restrictions at all, or adopting the not perfect, but still an order of magnitude better alternative.

@imagico
Copy link
Collaborator

imagico commented Apr 6, 2024

I don't know how things work across the world, but aren't most restrictions aimed at motorized traffic on public roads?

That depends on regional/national particularities. In Germany the motor_vehicle=no sign is probably less common than the vehicle=no sign - thought the latter frequently has exceptions (like for bicycles).

Globally

  • vehicle=no has 150k uses
  • vehicle=yes has 47k uses
  • motor_vehicle=no has 1M uses
  • motor_vehicle=yes has 360k uses
  • motorcar=no has 289k uses
  • motorcar=yes has 194k uses

but this is not all that meaningful (a) because of the different ways to tag the same access restrictions and the preferential interpretation of access=* by many data users (including us) leading to specific preferences in tagging and (b) because it is not uncommon to have redundant tagging of access restriction (like both vehicle=no and motor_vehicle=no or explicitly adding bicycle=yes to a highway=residential where implicitly bicycles are already allowed). What would be potentially helpful to know the prevalence of different access restrictions is an analysis of the de facto restrictions resulting from tagging. But also note the implicit restrictions on different road types differ in different parts of the world, making a consistent interpretation world wide more difficult.

A simple motor_vehicle=destination is enough for this and ideally should also show up on the map.

That would be the case for any of the strategies we are discussing here at the moment.

The main issue is and has been for the last decade, that the conclusion that a perfect solution isn't possible serves as an argument to continue doing the totally broken thing.

Emphatically no.

Back in 2014 @matthijsmelissen wrote in #371 (comment):

I think it might indeed be better to have an overall strategy on this topic (semantics, rendering) rather than to make ad-hoc changes.

And this has been our approach to this issue since then. That back then we should have removed the existing access restriction rendering until a viable strategy could be found (which took about five years) is something i'd probably agree on in retrospect. But that this did not happen is owed to (a) the well known phenomenon that feature removals are much more difficult to get support for than feature additions - a general struggle we have had in community map design since the beginning and (b) the fact that we all knew that drafting and implementing such a strategy would not be rocket science (and it also turned out five years later that it indeed is not) so with all the really hard problems in road rendering (like the unpaved roads) we simply did not consider it to take so long until someone would take on this relatively minor intellectual effort.

If you are of the opinion that requesting an overall strategy to be devised is a mistake and improving things through ad hoc changes like the one you suggested in 2014 is the only viable way then i can respect that. But i also have to disagree - largely because we have tried that approach from 2017 to late 2018 here and watched it fail.

The more recent timeline of this issue is:

  • 2019: first suggestion of a concrete strategy for comprehensive rendering of access restrictions, call from @jeisenbe for developing a concrete implementation.
  • 2021: first implementation of that strategy (combined with other features) - AFAIK not only the first within OSM-Carto based styles but also the first comprehensive access restriction rendering within OSM map styles in general.
  • 2024: suggestion of an alternative strategy + implementation sketch by @dch0ph. Discussing the merits of the different strategies and implementation aspects.

So, yes, overall we are slow - but more recent developments are promising so i see a realistic chance of this issue finally getting solved if people concentrate on constructive comments and finalizing consensus building on the overall strategy and practical implementation aspects.

@simonpoole
Copy link

LoL #371

@imagico
Copy link
Collaborator

imagico commented Apr 6, 2024

I explicitly mentioned your pull request from back in 2014 so i am not sure what you are trying to tell us.

@dch0ph
Copy link
Contributor

dch0ph commented Apr 6, 2024

Here is a version 2, taking into account the comments on version 1, and which, I think, is pretty much feature complete. As mentioned previously, it is essentially following @imagico's strategy/insight of a "primary mode" for a given highway type. I've renamed the functions to make this more explicit.

In visual terms, there are no changes to the examples above.

The addition of highway=pedestrian does create an extra "feature":

Here Side is a pedestrian route tagged with psv=yes. Note that, as currently, the implicit motor vehicle restriction with highway=pedestrian is not marked.

image

image

(Again ignore the overall stylistic differences)

There are a number of implementation / design choices that need to be aired:

The 3-fold division for road access marking between no marking (no restrictions), no/private access and "destination only" seems a sound one, but involves choices about how the final access tags are allocated to the 3 categories. Here I have included permit as a valid access tag under the intermediate "access restrictions apply" category, but not customers. Many service roads in car parks with customer access are tagged with access=customers, and I feel it would add a lot of unhelpful clutter to show these as access restricted.

The role of carto_path_primary_mode is to determine whether highway=path should be rendered as a footway or some other highway type. Currently Carto only "promotes" highway=path with bicycle=designated to a cycleway. In terms of the cycle-oriented front page renderers, CycleOSM doesn't seem to ever render highway=path as cycleways, while Andy Allan's Cycle Map seems to consider highway=path with any of yes|designated|permissive as a cycleway. I think if we are to promote path, then it would make sense to consider all 3 bicycle = "yes" tags. It is common to find bicycle=permissive used for bike trails / multi-user paths in forests open to the public for recreation:

image

image

Note how the named bike trail currently appears as a footway with tagging highway=path, bicycle=permissive.

Note that in this example:
image
where a path now appears as cycleway because of a bicycle=yes tag, the bicycle=yes is almost certainly wrong (it is a public footpath, with no cycle access). Wider interpretation of access tags will help to show up these problems, consistent with the role of providing mapper feedback.

@imagico
Copy link
Collaborator

imagico commented Apr 6, 2024

The SQL code looks much clearer to me now. There are some remaining specifics in access tag interpretation that would need to be discussed, but that is adjustment details. I would probably try to use this on the fly during rendering and see if this leads to an acceptable performance. Testing this is not something you need a full planet import for, it can be done with a regional extract just as well. Once we have a viable PR this is relatively easy: Test the PR and for comparison test with a dummy carto_highway_int_access()function and see if there is a substantial speedup.

I would probably not pass the hstore to the SQL functions but the individual access tags - this way the code would become independent of which tags have columns and which are in hstore and would not need to be adjusted if we change the database layout.

You currently have two changes in your draft that go beyond what has been discussed so far as addressing this issue by just modifying the tag interpretation logic. That is:

  • indication of exemptions in access tags (psv=yes/bus=yes on highway=pedestrian) through a new design feature of colored access dashing.
  • changing the interpretation of access tags on highway=path to adjust rendering as footway/cycleway/bridleway. You have not shown the MSS implementation for that yet, but it is clear that your sketch intends to make changes here.

Although i am - as indicated - not opposed to making further changes here i would suggest to limit the initial PR to not include either of these two changes. This would make it easier to review and to achieve consensus. It is of course prudent to see early on how highway=path interpretation can be implemented in the access tag interpretation framework so having it in the sketch is a good idea.

highway=track handling will be something that needs to be looked at. You suggest keeping those out and continuing to just interpret access=* on them. In the AC-Style i treated them like roads (i.e. motorcar as primary mode of transport) - except for also interpreting agricultural, forestry and agricultural;forestry as valid access values. I don't know if this is the best approach. But it is important to keep in mind that many highway=track with access=no/private are de facto probably either vehicle=no/private of motor_vehicle=no/private (or need a foot=yes/designated and possibly bicycle=yes/designated in addition). The whole matter should be looked at with #4321 in mind.

@dch0ph
Copy link
Contributor

dch0ph commented Apr 7, 2024

Although i am - as indicated - not opposed to making further changes here i would suggest to limit the initial PR to not include either of these two changes. This would make it easier to review and to achieve consensus. It is of course prudent to see early on how highway=path interpretation can be implemented in the access tag interpretation framework so having it in the sketch is a good idea.

Yes, it would make sense to break down the review into these chunks, although from the user viewpoint, we probably want to avoid multiple changes/additions of SQL functions. I'm also conscious that we would be adding a new step to the style installation (adding / updating SQL functions), and this might break things like CI testing, not to mention docker builds. Perhaps a PR to new branch?

I would probably not pass the hstore to the SQL functions but the individual access tags - this way the code would become independent of which tags have columns and which are in hstore and would not need to be adjusted if we change the database layout.

I feel the longer term direction is moving minor access tags such as foot, bicycle and horse to hstore, which would make passing hstore the cleaner route (and make changes trivial - reloading functions without even re-running carto). Postgres copes fine with added functions with different argument signatures (although it would be cleaner for any install / update scripts to DROP IF EXISTS old function signatures).

highway=track handling will be something that needs to be looked at. [...] The whole matter should be looked at with #4321 in mind.

I don't see good useful / options for track given the current rendering. I think that the "primary mode" route gets us to the 80:20 rule and leaves the rest in the hard / messy bucket, given that the "primary mode" for most tracks are agricultural vehicles. I address this issue of foot/bicycle access over track in my own mapping by merging track and service (based on surface / tracktype) and adding right of way markings. This is a very UK-specific solution and wouldn't generalise.

Note that I interpreted agricultural / forestry as a "top level" access tag only, e.g. access=forestry, rather than say motor_vehicle=agricultural, and, in principle, they could be used on a variety of road types rather than just track?

@dch0ph
Copy link
Contributor

dch0ph commented Apr 12, 2024

Currently testing a potential PR for the core issue of road access on master OSMCarto. Looking good:

image

I was mistaken in thinking that paths were only "upgraded" to cycleways (comments above edited to correct). Bridleways can also be created in the current style sheet, although it is not so obvious what will happen if horse/bicycle are both set. A function would make this clearer.

@dch0ph dch0ph linked a pull request Apr 13, 2024 that will close this issue
@Gazer75
Copy link

Gazer75 commented Apr 13, 2024

If specific rendering of foot- and/or cycleway is considered you have to be aware of the different way these are tagged depending on country.

Norway only use the highway=path on natural formed trails, while constructed paths not signposted with blue sign get the footway value. So that means either highway=footway/cycleway depending on sign.

These foot- and cyleways can often get a motor_vehicle=destination or yes because they act as access to properties part of the way.

@dch0ph
Copy link
Contributor

dch0ph commented Apr 14, 2024

Thanks for the input.

I don't see any problems here. The initial PR is deliberately narrowly focussed on "correctly using mode-specific access tags" that have previously been ignored. A follow-up, to ensure more consistent use of mode-specific tags, might result in highway=path, bicycle=yes being rendered as a cycleway. This should be helpful in your context, as it would highlight paths that have potentially been mistagged.

These foot- and cyleways can often get a motor_vehicle=destination or yes because they act as access to properties part of the way.

The overall proposal will have no implications, since only the foot and bicycle access tags are considered for footway and cycleway respectively; motor_vehicle is ignored for these highway types.

The tagging is a bit curious to me; I would have expected highway=service, service=driveway, motor_vehicle=destination|private. As a result of the current PR, the service road would then be shown with the vehicle access restriction. Showing that this road was accessible for bicycle or foot traffic would be a possible extension (as imagico has previously demonstrated), but this isn't part of the current PR.

@imagico
Copy link
Collaborator

imagico commented Apr 15, 2024

Some further comments on highway=track:

At the moment acces restrictions on highway=track exist in the following numbers (lower cutoff at 75k):

  • access=private: 595k
  • foot=yes: 497k
  • bicycle=yes 495k
  • motor_vehicle=no 165k
  • horse=yes: 158k
  • access=agricultural 108k
  • access=yes 99k
  • motor_vehicle=agricultural: 97k
  • motor_vehicle=yes: 93k
  • motor_vehicle=forestry: 93k
  • access=no: 89k
  • motorcar=no: 82k

I also looked at combinations:

tag 1 tag 2 count
foot=yes access=private 7k
bicycle=yes access=private 4.1k
horse=yes access=private 1.5k
---- ---- ----
foot=yes access=no 17k
bicycle=yes access=no 12k
horse=yes access=no 6.8k
---- ---- ----
foot=yes motor_vehicle=no 75k
bicycle=yes motor_vehicle=no 63k
horse=yes motor_vehicle=no 29k
---- ---- ----
foot=yes access=agricultural 16k
bicycle=yes access=agricultural 19k
horse=yes access=agricultural 2.3k
---- ---- ----
foot=yes motor_vehicle=agricultural 18k
bicycle=yes motor_vehicle=agricultural 23k
horse=yes motor_vehicle=agricultural 5.6k
---- ---- ----
foot=yes motor_vehicle=forestry 22k
bicycle=yes motor_vehicle=forestry 21k
horse=yes motor_vehicle=forestry 8.8k

In summary it seems quite clear that:

@Gazer75
Copy link

Gazer75 commented Apr 15, 2024

The tagging is a bit curious to me; I would have expected highway=service, service=driveway, motor_vehicle=destination|private. As a result of the current PR, the service road would then be shown with the vehicle access restriction. Showing that this road was accessible for bicycle or foot traffic would be a possible extension (as imagico has previously demonstrated), but this isn't part of the current PR.

Bit off topic, but these roads are signposted as foot and cycleway + a text sign below stating it is legal to drive to properties.
A streetview link as its easiest to use as example: https://maps.app.goo.gl/BgtDFjNoZvCzpnKu9 Same spot in OSM: https://www.openstreetmap.org/#map=19/61.56180/6.43232
The service=driveway is only used for the short drive into someones house in residential areas here.

@dch0ph
Copy link
Contributor

dch0ph commented Apr 15, 2024

Many thanks for this careful analysis of highway=track.

It does seem that mappers are reluctant to use say access=no, foot=yes and prefer motor_vehicle=no, foot=yes. I worry that this tagging is being preferred precisely because it doesn't currently "hide" tracks that have foot access (tracks with access=no are very faint).

They also seem keen on motor_vehicle=forestry even if the Wiki implies that forestry is only a "top-level" access tag, and is not attached to specific transport modes...

Personally I would argue based on usage that the "primary mode" for tracks was "motor_vehicle" (rather than motorcar); I wouldn't want to drive an ordinary car down anything I tagged as track!

I just think track is just very difficult because (at least in the UK), there is no standardised signage, whereas vehicle, motor_vehicle and motorcar all have specific signs for roadways. This makes track a Wild West for tagging.

@Gazer75
Copy link

Gazer75 commented Apr 16, 2024

The highway=track use is a mess if you ask me. It has often been used instead of the surface tag to map gravel roads.

In Norway tracktype 1 and 2 is not really in use and those get the highway=service or unclassified tag with an appropriate surface value. Tracks are mostly grade 4-5 farmland access intended for tractors and other farming equipment and should not be considered for normal car use. Would most likely require a taller 4WD vehicle.

@imagico
Copy link
Collaborator

imagico commented Apr 16, 2024

The whole highway=track use is a mess talk is not really that helpful - unless the conclusion is to stop rendering highway=track completely. For tracktype we have #4322.

The problem here is:

Currently we render:

  • highway=track + access=no/private with a light signature
  • all other highway=track with a dark signature

Possible ways to go from here suggested so far are:

  • continue doing that while solving this issue for other roads

  • treating highway=track as primary mode motorcar (i.e. rendering motorcar/motor_vehicle/access=no/private/agricultural/forestry as no and things like access=private + motorcar=yes as yes)

Further ideas for other options are welcome.

Regarding motorcar vs. motor_vehicle - that distinction is practically not really that meaningful - both in terms of tagging practice and in terms of real world access restriction on tracks. And note that in practical use motorcar=* almost always means double_tracked_motor_vehicle=* (and highway=track is by definition at least in principle suitable for a double tracked vehicle).

Keep in mind that access restrictions are about the legal status, not the technical feasibility of using a road.

@Gazer75
Copy link

Gazer75 commented Apr 18, 2024

The point is that the default for tracks vary depending on country. Primary use in Norway for track is agricultural, not motorcar or motor_vehicle.

@imagico
Copy link
Collaborator

imagico commented Apr 18, 2024

I should probably explain the concept of primary mode of use a bit better.

This is not meant to be the primary mode of de facto use or the primary mode the road is designed for in the real world. What this is meant to reflect is the primary mode of use relevant for the target map user. The vast majority of those are not farmers, agricultural use does not apply to them. For them the relevant question is: Am i allowed to drive here with my car. And for those tracks, where this is not the case (which in many countries is a significant percentage) the interesting question is if you can go there with a bicycle or on foot (which is often the case for tracks where normal car traffic is banned) - hence #4321.

Indicating if tracks are open for agricultural/forestry traffic or not is probably something out of scope for this style.

That the default access restrictions on roads vary from country to country is known. But taking care of such differences in design is clearly out of scope for this issue. So far we do not make any per-country differentiation in rendering, despite there being systematic differences in tagging semantics, in particular for roads. This could be re-considered (in a separate issue) - thought the more pressing field of per-country styling differentiation would be labeling (#2208).

Also note that specifically w.r.t. the implicit default access restrictions on highway=track - Norway is the only country where this is actually documented to be motorcar=no on https://wiki.openstreetmap.org/wiki/OSM_tags_for_routing/Access_restrictions.

@hungerburg
Copy link

Default No for motor vehicles is also specified for Tyrol, a province of Austria. Recent efforts by a small number of people from the local community shows, that indeed, the number of tracks that are generally accessible for motorized traffic is very low. BTW. forestry tracks alone nearly double the road network in Austria. and by law, they must be signed accessible, otherwise they are forbidden.

@pnorman
Copy link
Collaborator

pnorman commented Apr 20, 2024

I can't see us doing rendering differently for different countries and particularly not for smaller regions.

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

Successfully merging a pull request may close this issue.