diff --git a/application/src/main/java/org/opentripplanner/osm/tagmapping/GermanyMapper.java b/application/src/main/java/org/opentripplanner/osm/tagmapping/GermanyMapper.java index af56b572bd8..274f2253c19 100644 --- a/application/src/main/java/org/opentripplanner/osm/tagmapping/GermanyMapper.java +++ b/application/src/main/java/org/opentripplanner/osm/tagmapping/GermanyMapper.java @@ -57,10 +57,7 @@ public void populateProperties(WayPropertySet props) { withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.8) ); // Default was 2.5, we want to favor using mixed footways somewhat - props.setProperties( - "footway=sidewalk;highway=footway;bicycle=yes", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.2) - ); + props.setMixinProperties("footway=sidewalk;highway=footway;bicycle=yes", ofBicycleSafety(0.6)); props.setMixinProperties("highway=tertiary", ofBicycleSafety(1.2)); props.setMixinProperties("maxspeed=70", ofBicycleSafety(1.5)); diff --git a/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java b/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java index 92eb02d4b78..dddcb2586f3 100644 --- a/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java +++ b/application/src/main/java/org/opentripplanner/osm/tagmapping/OsmTagMapper.java @@ -5,7 +5,6 @@ import static org.opentripplanner.osm.wayproperty.WayPropertiesBuilder.withModes; import static org.opentripplanner.street.model.StreetTraversalPermission.ALL; import static org.opentripplanner.street.model.StreetTraversalPermission.BICYCLE; -import static org.opentripplanner.street.model.StreetTraversalPermission.BICYCLE_AND_CAR; import static org.opentripplanner.street.model.StreetTraversalPermission.CAR; import static org.opentripplanner.street.model.StreetTraversalPermission.NONE; import static org.opentripplanner.street.model.StreetTraversalPermission.PEDESTRIAN; @@ -13,9 +12,13 @@ import org.opentripplanner.osm.model.OsmEntity; import org.opentripplanner.osm.model.TraverseDirection; +import org.opentripplanner.osm.wayproperty.MixinPropertiesBuilder; import org.opentripplanner.osm.wayproperty.WayProperties; import org.opentripplanner.osm.wayproperty.WayPropertySet; import org.opentripplanner.osm.wayproperty.specifier.BestMatchSpecifier; +import org.opentripplanner.osm.wayproperty.specifier.Condition; +import org.opentripplanner.osm.wayproperty.specifier.Condition.Equals; +import org.opentripplanner.osm.wayproperty.specifier.Condition.Not; import org.opentripplanner.osm.wayproperty.specifier.ExactMatchSpecifier; import org.opentripplanner.osm.wayproperty.specifier.LogicalOrSpecifier; import org.opentripplanner.routing.services.notes.StreetNotesService; @@ -52,8 +55,6 @@ public class OsmTagMapper { public void populateProperties(WayPropertySet props) { WayProperties allWayProperties = withModes(ALL).build(); WayProperties noneWayProperties = withModes(NONE).build(); - WayProperties pedestrianWayProperties = withModes(PEDESTRIAN).build(); - WayProperties pedestrianAndBicycleWayProperties = withModes(PEDESTRIAN_AND_BICYCLE).build(); /* no bicycle tags */ /* NONE */ @@ -64,25 +65,24 @@ public void populateProperties(WayPropertySet props) { props.setProperties("highway=bridleway", withModes(NONE).bicycleSafety(1.3)); /* PEDESTRIAN */ - props.setProperties("highway=corridor", pedestrianWayProperties); - props.setProperties("highway=steps", pedestrianWayProperties); - props.setProperties("highway=crossing", pedestrianWayProperties); - props.setProperties("highway=platform", pedestrianWayProperties); - props.setProperties("public_transport=platform", pedestrianWayProperties); - props.setProperties("railway=platform", pedestrianWayProperties); - props.setProperties("footway=sidewalk;highway=footway", pedestrianWayProperties); + props.setProperties("highway=corridor", withModes(PEDESTRIAN)); + props.setProperties("highway=steps", withModes(PEDESTRIAN)); + props.setProperties("highway=crossing", withModes(PEDESTRIAN)); + props.setProperties("highway=platform", withModes(PEDESTRIAN)); + props.setProperties("public_transport=platform", withModes(PEDESTRIAN)); + props.setProperties("railway=platform", withModes(PEDESTRIAN)); props.setProperties("highway=pedestrian", withModes(PEDESTRIAN).bicycleSafety(0.9)); props.setProperties("highway=footway", withModes(PEDESTRIAN).bicycleSafety(1.1)); - props.setProperties("mtb:scale=1", pedestrianWayProperties); - props.setProperties("mtb:scale=2", pedestrianWayProperties); - props.setProperties("indoor=area", pedestrianWayProperties); - props.setProperties("indoor=corridor", pedestrianWayProperties); + props.setProperties("mtb:scale=1", withModes(PEDESTRIAN).bicycleSafety(1.5)); + props.setProperties("mtb:scale=2", withModes(PEDESTRIAN).bicycleSafety(3.0)); + props.setProperties("indoor=area", withModes(PEDESTRIAN)); + props.setProperties("indoor=corridor", withModes(PEDESTRIAN)); /* BICYCLE */ props.setProperties("highway=cycleway", withModes(BICYCLE).bicycleSafety(0.6)); /* PEDESTRIAN_AND_BICYCLE */ - props.setProperties("mtb:scale=0", pedestrianAndBicycleWayProperties); + props.setProperties("mtb:scale=0", withModes(PEDESTRIAN_AND_BICYCLE)); props.setProperties("highway=path", withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.75)); /* ALL */ @@ -110,478 +110,100 @@ public void populateProperties(WayPropertySet props) { // Do not walk on "moottoriliikennetie"/"Kraftfahrstrasse"/"Limited access road" // https://en.wikipedia.org/wiki/Limited-access_road - props.setProperties( + props.setMixinProperties( new ExactMatchSpecifier("motorroad=yes"), - withModes(CAR).walkSafety(7.47).bicycleSafety(7.47) + new MixinPropertiesBuilder().removePermission(PEDESTRIAN_AND_BICYCLE) ); /* cycleway=lane */ - props.setProperties( - "highway=*;cycleway=lane", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.87) - ); - props.setProperties("highway=service;cycleway=lane", withModes(ALL).bicycleSafety(0.77)); - props.setProperties("highway=residential;cycleway=lane", withModes(ALL).bicycleSafety(0.77)); - props.setProperties( - "highway=residential_link;cycleway=lane", - withModes(ALL).bicycleSafety(0.77) - ); - props.setProperties("highway=tertiary;cycleway=lane", withModes(ALL).bicycleSafety(0.87)); - props.setProperties("highway=tertiary_link;cycleway=lane", withModes(ALL).bicycleSafety(0.87)); - props.setProperties("highway=secondary;cycleway=lane", withModes(ALL).bicycleSafety(0.96)); - props.setProperties("highway=secondary_link;cycleway=lane", withModes(ALL).bicycleSafety(0.96)); - props.setProperties("highway=primary;cycleway=lane", withModes(ALL).bicycleSafety(1.15)); - props.setProperties("highway=primary_link;cycleway=lane", withModes(ALL).bicycleSafety(1.15)); - - /* BICYCLE_AND_CAR */ - props.setProperties( - "highway=trunk;cycleway=lane", - withModes(ALL).walkSafety(7.47).bicycleSafety(1.5) - ); - props.setProperties( - "highway=trunk_link;cycleway=lane", - withModes(ALL).walkSafety(7.47).bicycleSafety(1.15) - ); - props.setProperties( - "highway=motorway;cycleway=lane", - withModes(BICYCLE_AND_CAR).bicycleSafety(2) - ); - props.setProperties( - "highway=motorway_link;cycleway=lane", - withModes(BICYCLE_AND_CAR).bicycleSafety(1.15) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "lane"), + new Not(new Equals("highway", "cycleway")) + ), + ofBicycleSafety(0.87).addPermission(BICYCLE) ); /* cycleway=share_busway */ - props.setProperties( - "highway=*;cycleway=share_busway", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.92) - ); - props.setProperties( - "highway=service;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.85) - ); - props.setProperties( - "highway=residential;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.85) - ); - props.setProperties( - "highway=residential_link;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.85) - ); - props.setProperties( - "highway=tertiary;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.92) - ); - props.setProperties( - "highway=tertiary_link;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.92) - ); - props.setProperties( - "highway=secondary;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.99) - ); - props.setProperties( - "highway=secondary_link;cycleway=share_busway", - withModes(ALL).bicycleSafety(0.99) - ); - props.setProperties( - "highway=primary;cycleway=share_busway", - withModes(ALL).bicycleSafety(1.25) - ); - props.setProperties( - "highway=primary_link;cycleway=share_busway", - withModes(ALL).bicycleSafety(1.25) - ); - props.setProperties( - "highway=trunk;cycleway=share_busway", - withModes(ALL).walkSafety(7.47).bicycleSafety(1.75) - ); - props.setProperties( - "highway=trunk_link;cycleway=share_busway", - withModes(ALL).walkSafety(7.47).bicycleSafety(1.25) - ); - props.setProperties( - "highway=motorway;cycleway=share_busway", - withModes(BICYCLE_AND_CAR).bicycleSafety(2.5) - ); - props.setProperties( - "highway=motorway_link;cycleway=share_busway", - withModes(BICYCLE_AND_CAR).bicycleSafety(1.25) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "share_busway"), + new Not(new Equals("highway", "cycleway")) + ), + ofBicycleSafety(0.92).addPermission(BICYCLE) ); /* cycleway=opposite_lane */ - props.setProperties( - "highway=*;cycleway=opposite_lane", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.87) - ); - props.setProperties( - "highway=service;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(1.1), - withModes(ALL).bicycleSafety(1.1), - withModes(ALL).bicycleSafety(0.77) - ); - props.setProperties( - "highway=residential;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.77) - ); - props.setProperties( - "highway=residential_link;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.77) - ); - props.setProperties( - "highway=tertiary;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(0.87) - ); - props.setProperties( - "highway=tertiary_link;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(0.87) - ); - props.setProperties( - "highway=secondary;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(0.96) - ); - props.setProperties( - "highway=secondary_link;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(0.96) - ); - props.setProperties( - "highway=primary;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(1.15) - ); - props.setProperties( - "highway=primary_link;cycleway=opposite_lane", - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(1.15) - ); - props.setProperties( - "highway=trunk;cycleway=opposite_lane", - withModes(ALL).walkSafety(7.47).bicycleSafety(7.47), - withModes(ALL).walkSafety(7.47).bicycleSafety(7.47), - withModes(ALL).walkSafety(7.47).bicycleSafety(1.15) - ); - props.setProperties( - "highway=trunk_link;cycleway=opposite_lane", - withModes(ALL).walkSafety(7.47).bicycleSafety(2.06), - withModes(ALL).walkSafety(7.47).bicycleSafety(2.06), - withModes(ALL).walkSafety(7.47).bicycleSafety(1.15) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "opposite_lane"), + new Not(new Equals("highway", "cycleway")) + ), + new MixinPropertiesBuilder() + .directional(TraverseDirection.BACKWARD, builder -> + builder.withBicycleSafety(0.87).addPermission(BICYCLE) + ) ); /* cycleway=track */ - props.setProperties( - "highway=*;cycleway=track", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.75) - ); - props.setProperties("highway=service;cycleway=track", withModes(ALL).bicycleSafety(0.65)); - props.setProperties("highway=residential;cycleway=track", withModes(ALL).bicycleSafety(0.65)); - props.setProperties( - "highway=residential_link;cycleway=track", - withModes(ALL).bicycleSafety(0.65) - ); - props.setProperties("highway=tertiary;cycleway=track", withModes(ALL).bicycleSafety(0.75)); - props.setProperties("highway=tertiary_link;cycleway=track", withModes(ALL).bicycleSafety(0.75)); - props.setProperties("highway=secondary;cycleway=track", withModes(ALL).bicycleSafety(0.8)); - props.setProperties("highway=secondary_link;cycleway=track", withModes(ALL).bicycleSafety(0.8)); - props.setProperties("highway=primary;cycleway=track", withModes(ALL).bicycleSafety(0.85)); - props.setProperties("highway=primary_link;cycleway=track", withModes(ALL).bicycleSafety(0.85)); - props.setProperties( - "highway=trunk;cycleway=track", - withModes(ALL).walkSafety(7.47).bicycleSafety(0.95) - ); - props.setProperties( - "highway=trunk_link;cycleway=track", - withModes(ALL).walkSafety(7.47).bicycleSafety(0.85) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "track"), + new Not(new Equals("highway", "cycleway")) + ), + ofBicycleSafety(0.75).addPermission(BICYCLE) ); /* cycleway=opposite_track */ - props.setProperties( - "highway=*;cycleway=opposite_track", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.0), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.0), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.75) - ); - props.setProperties( - "highway=service;cycleway=opposite_track", - withModes(ALL).bicycleSafety(1.1), - withModes(ALL).bicycleSafety(1.1), - withModes(ALL).bicycleSafety(0.65) - ); - props.setProperties( - "highway=residential;cycleway=opposite_track", - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.65) - ); - props.setProperties( - "highway=residential_link;cycleway=opposite_track", - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.98), - withModes(ALL).bicycleSafety(0.65) - ); - props.setProperties( - "highway=tertiary;cycleway=opposite_track", - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(0.75) - ); - props.setProperties( - "highway=tertiary_link;cycleway=opposite_track", - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(1), - withModes(ALL).bicycleSafety(0.75) - ); - props.setProperties( - "highway=secondary;cycleway=opposite_track", - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(0.8) - ); - props.setProperties( - "highway=secondary_link;cycleway=opposite_track", - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(0.8) - ); - props.setProperties( - "highway=primary;cycleway=opposite_track", - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(0.85) - ); - props.setProperties( - "highway=primary_link;cycleway=opposite_track", - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(0.85) - ); - props.setProperties( - "highway=trunk;cycleway=opposite_track", - withModes(ALL).walkSafety(7.47).bicycleSafety(7.47), - withModes(ALL).walkSafety(7.47).bicycleSafety(7.47), - withModes(ALL).walkSafety(7.47).bicycleSafety(0.95) - ); - props.setProperties( - "highway=trunk_link;cycleway=opposite_track", - withModes(ALL).walkSafety(7.47).bicycleSafety(2.06), - withModes(ALL).walkSafety(7.47).bicycleSafety(2.06), - withModes(ALL).walkSafety(7.47).bicycleSafety(0.85) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "opposite_track"), + new Not(new Equals("highway", "cycleway")) + ), + new MixinPropertiesBuilder() + .directional(TraverseDirection.BACKWARD, builder -> + builder.withBicycleSafety(0.75).addPermission(BICYCLE) + ) ); /* cycleway=shared_lane a.k.a. bike boulevards or neighborhood greenways */ - props.setProperties( - "highway=*;cycleway=shared_lane", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.77) - ); - props.setProperties("highway=service;cycleway=shared_lane", withModes(ALL).bicycleSafety(0.73)); - props.setProperties( - "highway=residential;cycleway=shared_lane", - withModes(ALL).bicycleSafety(0.77) - ); - props.setProperties( - "highway=residential_link;cycleway=shared_lane", - withModes(ALL).bicycleSafety(0.77) - ); - props.setProperties( - "highway=tertiary;cycleway=shared_lane", - withModes(ALL).bicycleSafety(0.83) - ); - props.setProperties( - "highway=tertiary_link;cycleway=shared_lane", - withModes(ALL).bicycleSafety(0.83) - ); - props.setProperties( - "highway=secondary;cycleway=shared_lane", - withModes(ALL).bicycleSafety(1.25) - ); - props.setProperties( - "highway=secondary_link;cycleway=shared_lane", - withModes(ALL).bicycleSafety(1.25) - ); - props.setProperties("highway=primary;cycleway=shared_lane", withModes(ALL).bicycleSafety(1.75)); - props.setProperties( - "highway=primary_link;cycleway=shared_lane", - withModes(ALL).bicycleSafety(1.75) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "shared_lane"), + new Not(new Equals("highway", "cycleway")) + ), + ofBicycleSafety(0.77).addPermission(BICYCLE) ); /* cycleway=opposite */ - props.setProperties( - "highway=*;cycleway=opposite", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.4) - ); - props.setProperties("highway=service;cycleway=opposite", withModes(ALL).bicycleSafety(1.1)); - props.setProperties( - "highway=residential;cycleway=opposite", - withModes(ALL).bicycleSafety(0.98) - ); - props.setProperties( - "highway=residential_link;cycleway=opposite", - withModes(ALL).bicycleSafety(0.98) - ); - props.setProperties("highway=tertiary;cycleway=opposite", allWayProperties); - props.setProperties("highway=tertiary_link;cycleway=opposite", allWayProperties); - props.setProperties( - "highway=secondary;cycleway=opposite", - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.71) - ); - props.setProperties( - "highway=secondary_link;cycleway=opposite", - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.5), - withModes(ALL).bicycleSafety(1.71) - ); - props.setProperties( - "highway=primary;cycleway=opposite", - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.99) - ); - props.setProperties( - "highway=primary_link;cycleway=opposite", - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.06), - withModes(ALL).bicycleSafety(2.99) - ); - - /* - * path designed for bicycles (should be treated exactly as a cycleway is), this is a multi-use path (MUP) - */ - props.setProperties( - "highway=path;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.60) - ); - - /* special cases for footway, pedestrian and bicycles */ - props.setProperties( - "highway=footway;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.75) - ); - props.setProperties( - new ExactMatchSpecifier("highway=footway;bicycle=yes;area=yes"), - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.9) - ); - props.setProperties( - "highway=pedestrian;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.75) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("cycleway", "opposite"), + new Not(new Equals("highway", "cycleway")) + ), + new MixinPropertiesBuilder() + .directional(TraverseDirection.BACKWARD, builder -> + builder.withBicycleSafety(1.4).addPermission(BICYCLE) + ) ); /* sidewalk and crosswalk */ - props.setProperties( - "footway=sidewalk;highway=footway;bicycle=yes", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(2.5) - ); - props.setProperties( - "footway=sidewalk;highway=footway;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.1) - ); - props.setProperties( - "highway=footway;footway=crossing", - withModes(PEDESTRIAN).bicycleSafety(2.5) - ); - props.setProperties( - "highway=footway;footway=crossing;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.1) - ); - - /* - * bicycles on tracks (tracks are defined in OSM as: Roads for agricultural use, gravel roads in the forest etc.; usually unpaved/unsealed but - * may occasionally apply to paved tracks as well.) - */ - props.setProperties( - "highway=track;bicycle=yes", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.18) - ); - props.setProperties( - "highway=track;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.99) - ); - props.setProperties( - "highway=track;bicycle=yes;surface=*", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.18) - ); - props.setProperties( - "highway=track;bicycle=designated;surface=*", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.99) - ); - /* this is to avoid double counting since tracks are almost of surface type that is penalized */ - props.setProperties( - "highway=track;surface=*", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(1.3) - ); + props.setMixinProperties("footway=sidewalk", ofBicycleSafety(2.5)); + props.setMixinProperties("footway=crossing", ofBicycleSafety(1.5)); /* bicycle=designated, but no bike infrastructure is present */ - props.setProperties("highway=*;bicycle=designated", withModes(BICYCLE).bicycleSafety(0.97)); - props.setProperties( - "highway=footway;bicycle=designated", - withModes(PEDESTRIAN_AND_BICYCLE).bicycleSafety(0.8) - ); - props.setProperties( - "highway=cycleway;bicycle=designated", - withModes(BICYCLE).bicycleSafety(0.6) - ); - props.setProperties( - "highway=bridleway;bicycle=designated", - withModes(BICYCLE).bicycleSafety(0.8) - ); - props.setProperties("highway=service;bicycle=designated", withModes(ALL).bicycleSafety(0.84)); - props.setProperties( - "highway=residential;bicycle=designated", - withModes(ALL).bicycleSafety(0.95) - ); - props.setProperties( - "highway=unclassified;bicycle=designated", - withModes(ALL).bicycleSafety(0.95) - ); - props.setProperties( - "highway=residential_link;bicycle=designated", - withModes(ALL).bicycleSafety(0.95) - ); - props.setProperties("highway=tertiary;bicycle=designated", withModes(ALL).bicycleSafety(0.97)); - props.setProperties( - "highway=tertiary_link;bicycle=designated", - withModes(ALL).bicycleSafety(0.97) - ); - props.setProperties("highway=secondary;bicycle=designated", withModes(ALL).bicycleSafety(1.46)); - props.setProperties( - "highway=secondary_link;bicycle=designated", - withModes(ALL).bicycleSafety(1.46) - ); - props.setProperties("highway=primary;bicycle=designated", withModes(ALL).bicycleSafety(2)); - props.setProperties("highway=primary_link;bicycle=designated", withModes(ALL).bicycleSafety(2)); - props.setProperties( - "highway=trunk;bicycle=designated", - withModes(ALL).walkSafety(7.47).bicycleSafety(7.25) - ); - props.setProperties( - "highway=trunk_link;bicycle=designated", - withModes(ALL).walkSafety(7.47).bicycleSafety(2) - ); - props.setProperties( - "highway=motorway;bicycle=designated", - withModes(BICYCLE_AND_CAR).bicycleSafety(7.76) - ); - props.setProperties( - "highway=motorway_link;bicycle=designated", - withModes(BICYCLE_AND_CAR).bicycleSafety(2) + props.setMixinProperties( + new ExactMatchSpecifier( + new Equals("bicycle", "designated"), + new Condition.OneOfOrAbsent("cycleway"), + new Not(new Equals("highway", "cycleway")), + new Not(new Equals("lcn", "yes")), + new Not(new Equals("rcn", "yes")), + new Not(new Equals("ncn", "yes")), + new Not(new Equals("bicycle_road", "yes")), + new Not(new Equals("cyclestreet", "yes")) + ), + ofBicycleSafety(0.8) ); // We assume highway/cycleway of a cycle network to be safer (for bicycle network relations, their network is copied to way in postLoad) diff --git a/application/src/main/java/org/opentripplanner/osm/tagmapping/UKMapper.java b/application/src/main/java/org/opentripplanner/osm/tagmapping/UKMapper.java index ae7d76bf28c..546dee9ac7e 100644 --- a/application/src/main/java/org/opentripplanner/osm/tagmapping/UKMapper.java +++ b/application/src/main/java/org/opentripplanner/osm/tagmapping/UKMapper.java @@ -32,62 +32,6 @@ public void populateProperties(WayPropertySet props) { // reduce trunk safety compared to default mapper props.setProperties("highway=trunk", withModes(ALL).walkSafety(2.5).bicycleSafety(2.5)); props.setProperties("highway=trunk_link", withModes(ALL).walkSafety(2.5).bicycleSafety(2.06)); - props.setProperties( - "highway=trunk;cycleway=lane", - withModes(ALL).walkSafety(2.5).bicycleSafety(1.5) - ); - props.setProperties( - "highway=trunk_link;cycleway=lane", - withModes(ALL).walkSafety(2.5).bicycleSafety(1.15) - ); - props.setProperties( - "highway=trunk;cycleway=share_busway", - withModes(ALL).walkSafety(2.5).bicycleSafety(1.75) - ); - props.setProperties( - "highway=trunk_link;cycleway=share_busway", - withModes(ALL).walkSafety(2.5).bicycleSafety(1.25) - ); - props.setProperties( - "highway=trunk;cycleway=opposite_lane", - withModes(ALL).walkSafety(2.5).bicycleSafety(2.5), - withModes(ALL).walkSafety(2.5).bicycleSafety(2.5), - withModes(ALL).walkSafety(2.5).bicycleSafety(1.5) - ); - props.setProperties( - "highway=trunk_link;cycleway=opposite_lane", - withModes(ALL).walkSafety(2.5).bicycleSafety(2.06), - withModes(ALL).walkSafety(2.5).bicycleSafety(2.06), - withModes(ALL).walkSafety(2.5).bicycleSafety(1.15) - ); - props.setProperties( - "highway=trunk;cycleway=track", - withModes(ALL).walkSafety(2.5).bicycleSafety(0.95) - ); - props.setProperties( - "highway=trunk_link;cycleway=track", - withModes(ALL).walkSafety(2.5).bicycleSafety(0.85) - ); - props.setProperties( - "highway=trunk;cycleway=opposite_track", - withModes(ALL).walkSafety(2.5).bicycleSafety(2.5), - withModes(ALL).walkSafety(2.5).bicycleSafety(2.5), - withModes(ALL).walkSafety(2.5).bicycleSafety(0.95) - ); - props.setProperties( - "highway=trunk_link;cycleway=opposite_track", - withModes(ALL).walkSafety(2.5).bicycleSafety(2.5), - withModes(ALL).walkSafety(2.5).bicycleSafety(2.5), - withModes(ALL).walkSafety(2.5).bicycleSafety(0.85) - ); - props.setProperties( - "highway=trunk;bicycle=designated", - withModes(ALL).walkSafety(2.5).bicycleSafety(1.75) - ); - props.setProperties( - "highway=trunk_link;bicycle=designated", - withModes(ALL).walkSafety(2.5).bicycleSafety(1.75) - ); props.setMixinProperties( "expressway=yes", diff --git a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalProperties.java b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalProperties.java index 8b5de5164eb..e6e72230d56 100644 --- a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalProperties.java +++ b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalProperties.java @@ -1,3 +1,10 @@ package org.opentripplanner.osm.wayproperty; -public record MixinDirectionalProperties(double walkSafety, double bicycleSafety) {} +import org.opentripplanner.street.model.StreetTraversalPermission; + +public record MixinDirectionalProperties( + StreetTraversalPermission addedPermission, + StreetTraversalPermission removedPermission, + double walkSafety, + double bicycleSafety +) {} diff --git a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalPropertiesBuilder.java b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalPropertiesBuilder.java index 29d77020a0d..5e27c7113f8 100644 --- a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalPropertiesBuilder.java +++ b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinDirectionalPropertiesBuilder.java @@ -1,5 +1,7 @@ package org.opentripplanner.osm.wayproperty; +import org.opentripplanner.street.model.StreetTraversalPermission; + /** * Builder for {@link MixinDirectionalProperties}. If you don't set the safety features they will have a default * value of 1, which means no change. @@ -8,6 +10,8 @@ public class MixinDirectionalPropertiesBuilder { private double walkSafety = 1; private double bicycleSafety = 1; + private StreetTraversalPermission addedPermission = StreetTraversalPermission.NONE; + private StreetTraversalPermission removedPermission = StreetTraversalPermission.NONE; public static MixinDirectionalPropertiesBuilder ofWalkSafety(double safety) { return new MixinDirectionalPropertiesBuilder().withWalkSafety(safety); @@ -39,7 +43,24 @@ public MixinDirectionalPropertiesBuilder withWalkSafety(double walkSafety) { return this; } + public MixinDirectionalPropertiesBuilder addPermission(StreetTraversalPermission permission) { + removedPermission = removedPermission.remove(permission); + addedPermission = addedPermission.add(permission); + return this; + } + + public MixinDirectionalPropertiesBuilder removePermission(StreetTraversalPermission permission) { + removedPermission = removedPermission.add(permission); + addedPermission = addedPermission.remove(permission); + return this; + } + public MixinDirectionalProperties build() { - return new MixinDirectionalProperties(walkSafety, bicycleSafety); + return new MixinDirectionalProperties( + addedPermission, + removedPermission, + walkSafety, + bicycleSafety + ); } } diff --git a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinProperties.java b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinProperties.java index 1acdc5ab764..951f1437023 100644 --- a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinProperties.java +++ b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinProperties.java @@ -4,8 +4,7 @@ import org.opentripplanner.osm.wayproperty.specifier.OsmSpecifier; /** - * Mixins are like {@link WayProperties} but they only contain walk and bicycle safety features (not - * modes). + * Mixins are like {@link WayProperties} but they are applied on top of the way properties. *
* They don't override other properties but their safety values are multiplied with the existing
* values. As opposed to way properties, more than one mixins can apply to a single way.
diff --git a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinPropertiesBuilder.java b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinPropertiesBuilder.java
index e5a53e3a7fe..c4ec1877b89 100644
--- a/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinPropertiesBuilder.java
+++ b/application/src/main/java/org/opentripplanner/osm/wayproperty/MixinPropertiesBuilder.java
@@ -1,6 +1,9 @@
package org.opentripplanner.osm.wayproperty;
+import java.util.function.Consumer;
+import org.opentripplanner.osm.model.TraverseDirection;
import org.opentripplanner.osm.wayproperty.specifier.OsmSpecifier;
+import org.opentripplanner.street.model.StreetTraversalPermission;
/**
* Builder for {@link MixinProperties}. If you don't set the safety features they will have a default
@@ -50,6 +53,40 @@ public MixinPropertiesBuilder walkSafety(double walkSafety) {
return this;
}
+ /**
+ * Add the same permission to all directions
+ */
+ public MixinPropertiesBuilder addPermission(StreetTraversalPermission permission) {
+ this.defaultBuilder.addPermission(permission);
+ this.forwardBuilder.addPermission(permission);
+ this.backwardBuilder.addPermission(permission);
+ return this;
+ }
+
+ /**
+ * Remove the same permission to all directions
+ */
+ public MixinPropertiesBuilder removePermission(StreetTraversalPermission permission) {
+ this.defaultBuilder.removePermission(permission);
+ this.forwardBuilder.removePermission(permission);
+ this.backwardBuilder.removePermission(permission);
+ return this;
+ }
+
+ public MixinPropertiesBuilder directional(
+ TraverseDirection direction,
+ Consumer
");
+ }
+ result.append("forward: ").append(forward);
+ }
+ if (backward != NONE) {
+ if (!result.isEmpty()) {
+ result.append("
");
+ }
+ result.append("backward: ").append(backward);
+ }
+ return result.toString();
+ }
+ }
+
private static String tableValues(double value, double forward, double backward) {
if (value == 1.0 && forward == 1.0 && backward == 1.0) {
return "";
diff --git a/application/src/test/java/org/opentripplanner/graph_builder/module/linking/LinkingTest.java b/application/src/test/java/org/opentripplanner/graph_builder/module/linking/LinkingTest.java
index 390a72bf870..617de7edd7d 100644
--- a/application/src/test/java/org/opentripplanner/graph_builder/module/linking/LinkingTest.java
+++ b/application/src/test/java/org/opentripplanner/graph_builder/module/linking/LinkingTest.java
@@ -148,7 +148,7 @@ public void testStopsLinkedIdentically() {
assertEquals(v1.getLon(), v2.getLon(), 1e-10);
}
}
- assertEquals(153, unlinkedStopsCounter);
+ assertEquals(155, unlinkedStopsCounter);
}
/** Build a graph in Columbus, OH with no transit */
diff --git a/application/src/test/java/org/opentripplanner/osm/tagmapping/GermanyMapperTest.java b/application/src/test/java/org/opentripplanner/osm/tagmapping/GermanyMapperTest.java
index 6d8854e6ea6..270b14b7afa 100644
--- a/application/src/test/java/org/opentripplanner/osm/tagmapping/GermanyMapperTest.java
+++ b/application/src/test/java/org/opentripplanner/osm/tagmapping/GermanyMapperTest.java
@@ -107,8 +107,8 @@ void testPermissions() {
way.addTag("highway", "track");
way.addTag("tracktype", "grade1");
assertEquals(
- wps.getDataForEntity(way).getPermission(),
- StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE
+ StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE,
+ wps.getDataForEntity(way).getPermission()
);
// https://www.openstreetmap.org/way/5155805
diff --git a/application/src/test/java/org/opentripplanner/osm/tagmapping/OsmTagMapperTest.java b/application/src/test/java/org/opentripplanner/osm/tagmapping/OsmTagMapperTest.java
index ee883237fe8..9ff3777cfa6 100644
--- a/application/src/test/java/org/opentripplanner/osm/tagmapping/OsmTagMapperTest.java
+++ b/application/src/test/java/org/opentripplanner/osm/tagmapping/OsmTagMapperTest.java
@@ -99,7 +99,8 @@ void testAccessPrivate() {
@Test
void testFootway() {
- assertEquals(PEDESTRIAN, wps.getDataForEntity(WayTestData.footway()).getPermission());
+ OsmWay footway = WayTestData.footway();
+ assertEquals(PEDESTRIAN, wps.getDataForEntity(footway).getPermission());
}
@Test
diff --git a/application/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap b/application/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap
index 772fa85f84a..29daaadcac7 100644
--- a/application/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap
+++ b/application/src/test/java/org/opentripplanner/routing/algorithm/mapping/__snapshots__/ElevationSnapshotTest.snap
@@ -10,7 +10,7 @@ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directBike=[
"details" : { },
"fare" : { }
},
- "generalizedCost" : 1705,
+ "generalizedCost" : 1680,
"legs" : [
{
"agencyTimeZoneOffset" : -25200000,
@@ -25,7 +25,7 @@ org.opentripplanner.routing.algorithm.mapping.ElevationSnapshotTest.directBike=[
"name" : "SW Johnson St. & NW 24th Ave. (P1)",
"vertexType" : "NORMAL"
},
- "generalizedCost" : 1704,
+ "generalizedCost" : 1680,
"interlineWithPreviousLeg" : false,
"legElevation" : "0,63.7,1,63.7,11,63.4,21,63.2,31,63.3,41,63.5,51,63.3,61,62.9,71,62.5,81,62.2,91,62.0,101,61.7,111,61.5,121,61.2,131,60.9,141,60.6,151,60.3,160,60.2,240,60.2,1032,60.2,1190,55.5,1430,55.5,1506,40.4,1849,40.4,1919,37.3,1931,37.3,2078,55.5,2503,55.5,2503,NaN,2635,NaN",
"legGeometry" : { },
diff --git a/doc/user/osm/Finland.md b/doc/user/osm/Finland.md
index db17d739dd9..53dccd333d2 100644
--- a/doc/user/osm/Finland.md
+++ b/doc/user/osm/Finland.md
@@ -22,208 +22,91 @@ Lower safety values make an OSM way more desirable and higher values less desira
-| specifier | permission | bike safety | walk safety |
-|---------------------------------------------------------------------------------|--------------------------|-------------------------------------------------------|-------------|
-| `highway=living_street` | `ALL` | 0.9 | |
-| `highway=unclassified` | `ALL` | | |
-| `highway=road` | `ALL` | | |
-| `highway=byway` | `ALL` | 1.3 | |
-| `highway=track` | `ALL` | 1.3 | |
-| `highway=service` | `ALL` | 1.1 | |
-| `highway=residential` | `ALL` | 0.98 | |
-| `highway=residential_link` | `ALL` | 0.98 | |
-| `highway=tertiary` | `ALL` | | |
-| `highway=tertiary_link` | `ALL` | | |
-| `highway=secondary` | `ALL` | 1.5 | |
-| `highway=secondary_link` | `ALL` | 1.5 | |
-| `highway=primary` | `ALL` | 2.06 | |
-| `highway=primary_link` | `ALL` | 2.06 | |
-| `highway=trunk_link` | `ALL` | 2.06 | |
-| `highway=trunk` | `ALL` | 7.47 | |
-| `highway=trunk; tunnel=yes` | `CAR` | 7.47 | |
-| `present(highway); informal=yes` | `NONE` | | |
-| `highway=service; access=private` | `NONE` | | |
-| `highway=trail` | `NONE` | | |
-| `present(highway); seasonal=winter` | `NONE` | | |
-| `present(highway); ice_road=yes` | `NONE` | | |
-| `present(highway); winter_road=yes` | `NONE` | | |
-| `highway=footway` | `PEDESTRIAN` | | |
-| `footway=sidewalk; highway=footway` | `PEDESTRIAN` | | |
-| `highway=pedestrian` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=cycleway` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | 2.0 |
-| `highway=cycleway; segregated=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | 1.1 |
-| `highway=footway; bridge=yes` | `PEDESTRIAN` | | |
-| `highway=footway; tunnel=yes` | `PEDESTRIAN` | | |
-| `highway=cycleway; bridge=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=cycleway; tunnel=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=footway; footway=crossing; crossing=traffic_signals` | `PEDESTRIAN` | | 1.1 |
-| `highway=footway; footway=crossing` | `PEDESTRIAN` | | 1.2 |
-| `highway=cycleway; cycleway=crossing; segregated=yes; crossing=traffic_signals` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | 1.1 |
-| `highway=cycleway; footway=crossing; segregated=yes; crossing=traffic_signals` | `PEDESTRIAN` | 0.8 | 1.1 |
-| `highway=cycleway; cycleway=crossing; segregated=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | 1.2 |
-| `highway=cycleway; footway=crossing; segregated=yes` | `PEDESTRIAN` | 1.2 | 1.2 |
-| `highway=cycleway; cycleway=crossing; crossing=traffic_signals` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | 1.15 |
-| `highway=cycleway; footway=crossing; crossing=traffic_signals` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | 1.15 |
-| `highway=cycleway; cycleway=crossing` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | 1.25 |
-| `highway=cycleway; footway=crossing` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | 1.25 |
-| `highway=cycleway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=service; tunnel=yes; access=destination` | `NONE` | | |
-| `highway=service; access=destination` | `ALL` | 1.1 | |
-| `mtb:scale=3` | `NONE` | | |
-| `mtb:scale=4` | `NONE` | | |
-| `mtb:scale=5` | `NONE` | | |
-| `mtb:scale=6` | `NONE` | | |
-| `highway=bridleway` | `NONE` | 1.3 | |
-| `highway=corridor` | `PEDESTRIAN` | | |
-| `highway=steps` | `PEDESTRIAN` | | |
-| `highway=crossing` | `PEDESTRIAN` | | |
-| `highway=platform` | `PEDESTRIAN` | | |
-| `public_transport=platform` | `PEDESTRIAN` | | |
-| `railway=platform` | `PEDESTRIAN` | | |
-| `footway=sidewalk; highway=footway` | `PEDESTRIAN` | | |
-| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
-| `highway=footway` | `PEDESTRIAN` | 1.1 | |
-| `mtb:scale=1` | `PEDESTRIAN` | | |
-| `mtb:scale=2` | `PEDESTRIAN` | | |
-| `indoor=area` | `PEDESTRIAN` | | |
-| `indoor=corridor` | `PEDESTRIAN` | | |
-| `highway=cycleway` | `BICYCLE` | 0.6 | |
-| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
-| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=living_street` | `ALL` | 0.9 | |
-| `highway=unclassified` | `ALL` | | |
-| `highway=road` | `ALL` | | |
-| `highway=byway` | `ALL` | 1.3 | |
-| `highway=track` | `ALL` | 1.3 | |
-| `highway=service` | `ALL` | 1.1 | |
-| `highway=residential` | `ALL` | 0.98 | |
-| `highway=residential_link` | `ALL` | 0.98 | |
-| `highway=tertiary` | `ALL` | | |
-| `highway=tertiary_link` | `ALL` | | |
-| `highway=secondary` | `ALL` | 1.5 | |
-| `highway=secondary_link` | `ALL` | 1.5 | |
-| `highway=primary` | `ALL` | 2.06 | |
-| `highway=primary_link` | `ALL` | 2.06 | |
-| `highway=trunk` | `ALL` | 7.47 | 7.47 |
-| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
-| `highway=motorway_link` | `CAR` | 2.06 | |
-| `highway=motorway` | `CAR` | 8.0 | |
-| `motorroad=yes` | `CAR` | 7.47 | 7.47 |
-| `present(highway); cycleway=lane` | `PEDESTRIAN_AND_BICYCLE` | 0.87 | |
-| `highway=service; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=tertiary_link; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=secondary; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=secondary_link; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=primary; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=primary_link; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=trunk; cycleway=lane` | `ALL` | 1.5 | 7.47 |
-| `highway=trunk_link; cycleway=lane` | `ALL` | 1.15 | 7.47 |
-| `highway=motorway; cycleway=lane` | `BICYCLE_AND_CAR` | 2.0 | |
-| `highway=motorway_link; cycleway=lane` | `BICYCLE_AND_CAR` | 1.15 | |
-| `present(highway); cycleway=share_busway` | `PEDESTRIAN_AND_BICYCLE` | 0.92 | |
-| `highway=service; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential_link; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=tertiary; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=tertiary_link; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=secondary; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=secondary_link; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=primary; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=primary_link; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=trunk; cycleway=share_busway` | `ALL` | 1.75 | 7.47 |
-| `highway=trunk_link; cycleway=share_busway` | `ALL` | 1.25 | 7.47 |
-| `highway=motorway; cycleway=share_busway` | `BICYCLE_AND_CAR` | 2.5 | |
-| `highway=motorway_link; cycleway=share_busway` | `BICYCLE_AND_CAR` | 1.25 | |
-| `present(highway); cycleway=opposite_lane` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=service; cycleway=opposite_lane` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.77 | |
-| `highway=residential; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=residential_link; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=tertiary; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=tertiary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=secondary; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=secondary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=primary; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=primary_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=trunk; cycleway=opposite_lane` | `ALL` | no direction: 7.47
forward: 7.47
back: 1.15 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | 7.47 |
-| `present(highway); cycleway=track` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=service; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential_link; cycleway=track` | `ALL` | 0.65 | |
-| `highway=tertiary; cycleway=track` | `ALL` | 0.75 | |
-| `highway=tertiary_link; cycleway=track` | `ALL` | 0.75 | |
-| `highway=secondary; cycleway=track` | `ALL` | 0.8 | |
-| `highway=secondary_link; cycleway=track` | `ALL` | 0.8 | |
-| `highway=primary; cycleway=track` | `ALL` | 0.85 | |
-| `highway=primary_link; cycleway=track` | `ALL` | 0.85 | |
-| `highway=trunk; cycleway=track` | `ALL` | 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=track` | `ALL` | 0.85 | 7.47 |
-| `present(highway); cycleway=opposite_track` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=service; cycleway=opposite_track` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.65 | |
-| `highway=residential; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=residential_link; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=tertiary; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=tertiary_link; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=secondary; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=secondary_link; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=primary; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=primary_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=trunk; cycleway=opposite_track` | `ALL` | no direction: 7.47
forward: 7.47
back: 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | 7.47 |
-| `present(highway); cycleway=shared_lane` | `PEDESTRIAN_AND_BICYCLE` | 0.77 | |
-| `highway=service; cycleway=shared_lane` | `ALL` | 0.73 | |
-| `highway=residential; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=tertiary_link; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=secondary; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=secondary_link; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=primary; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `highway=primary_link; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `present(highway); cycleway=opposite` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 1.4 | |
-| `highway=service; cycleway=opposite` | `ALL` | 1.1 | |
-| `highway=residential; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=residential_link; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=tertiary; cycleway=opposite` | `ALL` | | |
-| `highway=tertiary_link; cycleway=opposite` | `ALL` | | |
-| `highway=secondary; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=secondary_link; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=primary; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=primary_link; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=path; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=footway; bicycle=yes; area=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.9 | |
-| `highway=pedestrian; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `footway=sidewalk; highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 2.5 | |
-| `footway=sidewalk; highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=footway; footway=crossing` | `PEDESTRIAN` | 2.5 | |
-| `highway=footway; footway=crossing; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=track; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; bicycle=yes; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.3 | |
-| `present(highway); bicycle=designated` | `BICYCLE` | 0.97 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | |
-| `highway=cycleway; bicycle=designated` | `BICYCLE` | 0.6 | |
-| `highway=bridleway; bicycle=designated` | `BICYCLE` | 0.8 | |
-| `highway=service; bicycle=designated` | `ALL` | 0.84 | |
-| `highway=residential; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=unclassified; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=residential_link; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=tertiary; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=tertiary_link; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=secondary; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=secondary_link; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=primary; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=primary_link; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=trunk; bicycle=designated` | `ALL` | 7.25 | 7.47 |
-| `highway=trunk_link; bicycle=designated` | `ALL` | 2.0 | 7.47 |
-| `highway=motorway; bicycle=designated` | `BICYCLE_AND_CAR` | 7.76 | |
-| `highway=motorway_link; bicycle=designated` | `BICYCLE_AND_CAR` | 2.0 | |
+| specifier | permission | bike safety | walk safety |
+|---------------------------------------------------------------------------------|--------------------------|-------------|-------------|
+| `highway=living_street` | `ALL` | 0.9 | |
+| `highway=unclassified` | `ALL` | | |
+| `highway=road` | `ALL` | | |
+| `highway=byway` | `ALL` | 1.3 | |
+| `highway=track` | `ALL` | 1.3 | |
+| `highway=service` | `ALL` | 1.1 | |
+| `highway=residential` | `ALL` | 0.98 | |
+| `highway=residential_link` | `ALL` | 0.98 | |
+| `highway=tertiary` | `ALL` | | |
+| `highway=tertiary_link` | `ALL` | | |
+| `highway=secondary` | `ALL` | 1.5 | |
+| `highway=secondary_link` | `ALL` | 1.5 | |
+| `highway=primary` | `ALL` | 2.06 | |
+| `highway=primary_link` | `ALL` | 2.06 | |
+| `highway=trunk_link` | `ALL` | 2.06 | |
+| `highway=trunk` | `ALL` | 7.47 | |
+| `highway=trunk; tunnel=yes` | `CAR` | 7.47 | |
+| `present(highway); informal=yes` | `NONE` | | |
+| `highway=service; access=private` | `NONE` | | |
+| `highway=trail` | `NONE` | | |
+| `present(highway); seasonal=winter` | `NONE` | | |
+| `present(highway); ice_road=yes` | `NONE` | | |
+| `present(highway); winter_road=yes` | `NONE` | | |
+| `highway=footway` | `PEDESTRIAN` | | |
+| `footway=sidewalk; highway=footway` | `PEDESTRIAN` | | |
+| `highway=pedestrian` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
+| `highway=cycleway` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | 2.0 |
+| `highway=cycleway; segregated=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | 1.1 |
+| `highway=footway; bridge=yes` | `PEDESTRIAN` | | |
+| `highway=footway; tunnel=yes` | `PEDESTRIAN` | | |
+| `highway=cycleway; bridge=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
+| `highway=cycleway; tunnel=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
+| `highway=footway; footway=crossing; crossing=traffic_signals` | `PEDESTRIAN` | | 1.1 |
+| `highway=footway; footway=crossing` | `PEDESTRIAN` | | 1.2 |
+| `highway=cycleway; cycleway=crossing; segregated=yes; crossing=traffic_signals` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | 1.1 |
+| `highway=cycleway; footway=crossing; segregated=yes; crossing=traffic_signals` | `PEDESTRIAN` | 0.8 | 1.1 |
+| `highway=cycleway; cycleway=crossing; segregated=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | 1.2 |
+| `highway=cycleway; footway=crossing; segregated=yes` | `PEDESTRIAN` | 1.2 | 1.2 |
+| `highway=cycleway; cycleway=crossing; crossing=traffic_signals` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | 1.15 |
+| `highway=cycleway; footway=crossing; crossing=traffic_signals` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | 1.15 |
+| `highway=cycleway; cycleway=crossing` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | 1.25 |
+| `highway=cycleway; footway=crossing` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | 1.25 |
+| `highway=cycleway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
+| `highway=service; tunnel=yes; access=destination` | `NONE` | | |
+| `highway=service; access=destination` | `ALL` | 1.1 | |
+| `mtb:scale=3` | `NONE` | | |
+| `mtb:scale=4` | `NONE` | | |
+| `mtb:scale=5` | `NONE` | | |
+| `mtb:scale=6` | `NONE` | | |
+| `highway=bridleway` | `NONE` | 1.3 | |
+| `highway=corridor` | `PEDESTRIAN` | | |
+| `highway=steps` | `PEDESTRIAN` | | |
+| `highway=crossing` | `PEDESTRIAN` | | |
+| `highway=platform` | `PEDESTRIAN` | | |
+| `public_transport=platform` | `PEDESTRIAN` | | |
+| `railway=platform` | `PEDESTRIAN` | | |
+| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
+| `highway=footway` | `PEDESTRIAN` | 1.1 | |
+| `mtb:scale=1` | `PEDESTRIAN` | 1.5 | |
+| `mtb:scale=2` | `PEDESTRIAN` | 3.0 | |
+| `indoor=area` | `PEDESTRIAN` | | |
+| `indoor=corridor` | `PEDESTRIAN` | | |
+| `highway=cycleway` | `BICYCLE` | 0.6 | |
+| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
+| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
+| `highway=living_street` | `ALL` | 0.9 | |
+| `highway=unclassified` | `ALL` | | |
+| `highway=road` | `ALL` | | |
+| `highway=byway` | `ALL` | 1.3 | |
+| `highway=track` | `ALL` | 1.3 | |
+| `highway=service` | `ALL` | 1.1 | |
+| `highway=residential` | `ALL` | 0.98 | |
+| `highway=residential_link` | `ALL` | 0.98 | |
+| `highway=tertiary` | `ALL` | | |
+| `highway=tertiary_link` | `ALL` | | |
+| `highway=secondary` | `ALL` | 1.5 | |
+| `highway=secondary_link` | `ALL` | 1.5 | |
+| `highway=primary` | `ALL` | 2.06 | |
+| `highway=primary_link` | `ALL` | 2.06 | |
+| `highway=trunk` | `ALL` | 7.47 | 7.47 |
+| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
+| `highway=motorway_link` | `CAR` | 2.06 | |
+| `highway=motorway` | `CAR` | 8.0 | |
@@ -236,33 +119,44 @@ way properties. Multiple mixins can apply to the same way and their effects comp
-| matcher | bicycle safety | walk safety |
-|-----------------------------------------------------------------------------------------------------------------------|----------------|-------------|
-| `bicycle=use_sidepath` | | 5.0 |
-| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | 0.7 | |
-| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | 0.25 |
-| `highway=trunk; sidewalk=lane` | | 0.6 |
-| `surface=unpaved` | 1.18 | |
-| `surface=compacted` | 1.18 | |
-| `surface=wood` | 1.18 | |
-| `surface=cobblestone` | 1.3 | |
-| `surface=sett` | 1.3 | |
-| `surface=unhewn_cobblestone` | 1.5 | |
-| `surface=grass_paver` | 1.3 | |
-| `surface=pebblestone` | 1.3 | |
-| `surface=metal` | 1.3 | |
-| `surface=ground` | 1.5 | |
-| `surface=dirt` | 1.5 | |
-| `surface=earth` | 1.5 | |
-| `surface=grass` | 1.5 | |
-| `surface=mud` | 1.5 | |
-| `surface=woodchip` | 1.5 | |
-| `surface=gravel` | 1.5 | |
-| `surface=artifical_turf` | 1.5 | |
-| `surface=sand` | 100.0 | |
-| `foot=discouraged` | | 3.0 |
-| `bicycle=discouraged` | 3.0 | |
-| `foot=use_sidepath` | | 5.0 |
-| `bicycle=use_sidepath` | 5.0 | |
+| matcher | add permission | remove permission | bicycle safety | walk safety |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|------------------------|-----------------------------------------------------|-------------|
+| `bicycle=use_sidepath` | | | | 5.0 |
+| `motorroad=yes` | | PEDESTRIAN_AND_BICYCLE | | |
+| `cycleway=lane; not(highway=cycleway)` | BICYCLE | | 0.87 | |
+| `cycleway=share_busway; not(highway=cycleway)` | BICYCLE | | 0.92 | |
+| `cycleway=opposite_lane; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.87 | |
+| `cycleway=track; not(highway=cycleway)` | BICYCLE | | 0.75 | |
+| `cycleway=opposite_track; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.75 | |
+| `cycleway=shared_lane; not(highway=cycleway)` | BICYCLE | | 0.77 | |
+| `cycleway=opposite; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 1.4 | |
+| `footway=sidewalk` | | | 2.5 | |
+| `footway=crossing` | | | 1.5 | |
+| `bicycle=designated; cycleway not one of [no, none] or absent; not(highway=cycleway); not(lcn=yes); not(rcn=yes); not(ncn=yes); not(bicycle_road=yes); not(cyclestreet=yes)` | | | 0.8 | |
+| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | | | 0.7 | |
+| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | | | 0.25 |
+| `highway=trunk; sidewalk=lane` | | | | 0.6 |
+| `surface=unpaved` | | | 1.18 | |
+| `surface=compacted` | | | 1.18 | |
+| `surface=wood` | | | 1.18 | |
+| `surface=cobblestone` | | | 1.3 | |
+| `surface=sett` | | | 1.3 | |
+| `surface=unhewn_cobblestone` | | | 1.5 | |
+| `surface=grass_paver` | | | 1.3 | |
+| `surface=pebblestone` | | | 1.3 | |
+| `surface=metal` | | | 1.3 | |
+| `surface=ground` | | | 1.5 | |
+| `surface=dirt` | | | 1.5 | |
+| `surface=earth` | | | 1.5 | |
+| `surface=grass` | | | 1.5 | |
+| `surface=mud` | | | 1.5 | |
+| `surface=woodchip` | | | 1.5 | |
+| `surface=gravel` | | | 1.5 | |
+| `surface=artifical_turf` | | | 1.5 | |
+| `surface=sand` | | | 100.0 | |
+| `foot=discouraged` | | | | 3.0 |
+| `bicycle=discouraged` | | | 3.0 | |
+| `foot=use_sidepath` | | | | 5.0 |
+| `bicycle=use_sidepath` | | | 5.0 | |
diff --git a/doc/user/osm/Germany.md b/doc/user/osm/Germany.md
index 579cc4e5c4e..38d6134ac7d 100644
--- a/doc/user/osm/Germany.md
+++ b/doc/user/osm/Germany.md
@@ -22,172 +22,54 @@ Lower safety values make an OSM way more desirable and higher values less desira
-| specifier | permission | bike safety | walk safety |
-|---------------------------------------------------------|--------------------------|-------------------------------------------------------|-------------|
-| `highway=track` | `PEDESTRIAN_AND_BICYCLE` | | |
-| `highway=track; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | | |
-| `highway=residential; junction=roundabout` | `ALL` | 0.98 | |
-| `present(highway); junction=roundabout` | `BICYCLE_AND_CAR` | | |
-| `highway=pedestrian` | `PEDESTRIAN` | | |
-| `highway=residential; maxspeed=30` | `ALL` | 0.9 | |
-| `highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | |
-| `footway=sidewalk; highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.2 | |
-| `highway=unclassified; cycleway=lane` | `ALL` | 0.87 | |
-| `mtb:scale=3` | `NONE` | | |
-| `mtb:scale=4` | `NONE` | | |
-| `mtb:scale=5` | `NONE` | | |
-| `mtb:scale=6` | `NONE` | | |
-| `highway=bridleway` | `NONE` | 1.3 | |
-| `highway=corridor` | `PEDESTRIAN` | | |
-| `highway=steps` | `PEDESTRIAN` | | |
-| `highway=crossing` | `PEDESTRIAN` | | |
-| `highway=platform` | `PEDESTRIAN` | | |
-| `public_transport=platform` | `PEDESTRIAN` | | |
-| `railway=platform` | `PEDESTRIAN` | | |
-| `footway=sidewalk; highway=footway` | `PEDESTRIAN` | | |
-| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
-| `highway=footway` | `PEDESTRIAN` | 1.1 | |
-| `mtb:scale=1` | `PEDESTRIAN` | | |
-| `mtb:scale=2` | `PEDESTRIAN` | | |
-| `indoor=area` | `PEDESTRIAN` | | |
-| `indoor=corridor` | `PEDESTRIAN` | | |
-| `highway=cycleway` | `BICYCLE` | 0.6 | |
-| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
-| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=living_street` | `ALL` | 0.9 | |
-| `highway=unclassified` | `ALL` | | |
-| `highway=road` | `ALL` | | |
-| `highway=byway` | `ALL` | 1.3 | |
-| `highway=track` | `ALL` | 1.3 | |
-| `highway=service` | `ALL` | 1.1 | |
-| `highway=residential` | `ALL` | 0.98 | |
-| `highway=residential_link` | `ALL` | 0.98 | |
-| `highway=tertiary` | `ALL` | | |
-| `highway=tertiary_link` | `ALL` | | |
-| `highway=secondary` | `ALL` | 1.5 | |
-| `highway=secondary_link` | `ALL` | 1.5 | |
-| `highway=primary` | `ALL` | 2.06 | |
-| `highway=primary_link` | `ALL` | 2.06 | |
-| `highway=trunk` | `ALL` | 7.47 | 7.47 |
-| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
-| `highway=motorway_link` | `CAR` | 2.06 | |
-| `highway=motorway` | `CAR` | 8.0 | |
-| `motorroad=yes` | `CAR` | 7.47 | 7.47 |
-| `present(highway); cycleway=lane` | `PEDESTRIAN_AND_BICYCLE` | 0.87 | |
-| `highway=service; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=tertiary_link; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=secondary; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=secondary_link; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=primary; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=primary_link; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=trunk; cycleway=lane` | `ALL` | 1.5 | 7.47 |
-| `highway=trunk_link; cycleway=lane` | `ALL` | 1.15 | 7.47 |
-| `highway=motorway; cycleway=lane` | `BICYCLE_AND_CAR` | 2.0 | |
-| `highway=motorway_link; cycleway=lane` | `BICYCLE_AND_CAR` | 1.15 | |
-| `present(highway); cycleway=share_busway` | `PEDESTRIAN_AND_BICYCLE` | 0.92 | |
-| `highway=service; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential_link; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=tertiary; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=tertiary_link; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=secondary; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=secondary_link; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=primary; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=primary_link; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=trunk; cycleway=share_busway` | `ALL` | 1.75 | 7.47 |
-| `highway=trunk_link; cycleway=share_busway` | `ALL` | 1.25 | 7.47 |
-| `highway=motorway; cycleway=share_busway` | `BICYCLE_AND_CAR` | 2.5 | |
-| `highway=motorway_link; cycleway=share_busway` | `BICYCLE_AND_CAR` | 1.25 | |
-| `present(highway); cycleway=opposite_lane` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=service; cycleway=opposite_lane` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.77 | |
-| `highway=residential; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=residential_link; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=tertiary; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=tertiary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=secondary; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=secondary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=primary; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=primary_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=trunk; cycleway=opposite_lane` | `ALL` | no direction: 7.47
forward: 7.47
back: 1.15 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | 7.47 |
-| `present(highway); cycleway=track` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=service; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential_link; cycleway=track` | `ALL` | 0.65 | |
-| `highway=tertiary; cycleway=track` | `ALL` | 0.75 | |
-| `highway=tertiary_link; cycleway=track` | `ALL` | 0.75 | |
-| `highway=secondary; cycleway=track` | `ALL` | 0.8 | |
-| `highway=secondary_link; cycleway=track` | `ALL` | 0.8 | |
-| `highway=primary; cycleway=track` | `ALL` | 0.85 | |
-| `highway=primary_link; cycleway=track` | `ALL` | 0.85 | |
-| `highway=trunk; cycleway=track` | `ALL` | 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=track` | `ALL` | 0.85 | 7.47 |
-| `present(highway); cycleway=opposite_track` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=service; cycleway=opposite_track` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.65 | |
-| `highway=residential; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=residential_link; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=tertiary; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=tertiary_link; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=secondary; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=secondary_link; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=primary; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=primary_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=trunk; cycleway=opposite_track` | `ALL` | no direction: 7.47
forward: 7.47
back: 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | 7.47 |
-| `present(highway); cycleway=shared_lane` | `PEDESTRIAN_AND_BICYCLE` | 0.77 | |
-| `highway=service; cycleway=shared_lane` | `ALL` | 0.73 | |
-| `highway=residential; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=tertiary_link; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=secondary; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=secondary_link; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=primary; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `highway=primary_link; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `present(highway); cycleway=opposite` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 1.4 | |
-| `highway=service; cycleway=opposite` | `ALL` | 1.1 | |
-| `highway=residential; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=residential_link; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=tertiary; cycleway=opposite` | `ALL` | | |
-| `highway=tertiary_link; cycleway=opposite` | `ALL` | | |
-| `highway=secondary; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=secondary_link; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=primary; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=primary_link; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=path; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=footway; bicycle=yes; area=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.9 | |
-| `highway=pedestrian; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `footway=sidewalk; highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 2.5 | |
-| `footway=sidewalk; highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=footway; footway=crossing` | `PEDESTRIAN` | 2.5 | |
-| `highway=footway; footway=crossing; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=track; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; bicycle=yes; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.3 | |
-| `present(highway); bicycle=designated` | `BICYCLE` | 0.97 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | |
-| `highway=cycleway; bicycle=designated` | `BICYCLE` | 0.6 | |
-| `highway=bridleway; bicycle=designated` | `BICYCLE` | 0.8 | |
-| `highway=service; bicycle=designated` | `ALL` | 0.84 | |
-| `highway=residential; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=unclassified; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=residential_link; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=tertiary; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=tertiary_link; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=secondary; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=secondary_link; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=primary; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=primary_link; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=trunk; bicycle=designated` | `ALL` | 7.25 | 7.47 |
-| `highway=trunk_link; bicycle=designated` | `ALL` | 2.0 | 7.47 |
-| `highway=motorway; bicycle=designated` | `BICYCLE_AND_CAR` | 7.76 | |
-| `highway=motorway_link; bicycle=designated` | `BICYCLE_AND_CAR` | 2.0 | |
+| specifier | permission | bike safety | walk safety |
+|--------------------------------------------|--------------------------|-------------|-------------|
+| `highway=track` | `PEDESTRIAN_AND_BICYCLE` | | |
+| `highway=track; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | | |
+| `highway=residential; junction=roundabout` | `ALL` | 0.98 | |
+| `present(highway); junction=roundabout` | `BICYCLE_AND_CAR` | | |
+| `highway=pedestrian` | `PEDESTRIAN` | | |
+| `highway=residential; maxspeed=30` | `ALL` | 0.9 | |
+| `highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | |
+| `highway=unclassified; cycleway=lane` | `ALL` | 0.87 | |
+| `mtb:scale=3` | `NONE` | | |
+| `mtb:scale=4` | `NONE` | | |
+| `mtb:scale=5` | `NONE` | | |
+| `mtb:scale=6` | `NONE` | | |
+| `highway=bridleway` | `NONE` | 1.3 | |
+| `highway=corridor` | `PEDESTRIAN` | | |
+| `highway=steps` | `PEDESTRIAN` | | |
+| `highway=crossing` | `PEDESTRIAN` | | |
+| `highway=platform` | `PEDESTRIAN` | | |
+| `public_transport=platform` | `PEDESTRIAN` | | |
+| `railway=platform` | `PEDESTRIAN` | | |
+| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
+| `highway=footway` | `PEDESTRIAN` | 1.1 | |
+| `mtb:scale=1` | `PEDESTRIAN` | 1.5 | |
+| `mtb:scale=2` | `PEDESTRIAN` | 3.0 | |
+| `indoor=area` | `PEDESTRIAN` | | |
+| `indoor=corridor` | `PEDESTRIAN` | | |
+| `highway=cycleway` | `BICYCLE` | 0.6 | |
+| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
+| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
+| `highway=living_street` | `ALL` | 0.9 | |
+| `highway=unclassified` | `ALL` | | |
+| `highway=road` | `ALL` | | |
+| `highway=byway` | `ALL` | 1.3 | |
+| `highway=track` | `ALL` | 1.3 | |
+| `highway=service` | `ALL` | 1.1 | |
+| `highway=residential` | `ALL` | 0.98 | |
+| `highway=residential_link` | `ALL` | 0.98 | |
+| `highway=tertiary` | `ALL` | | |
+| `highway=tertiary_link` | `ALL` | | |
+| `highway=secondary` | `ALL` | 1.5 | |
+| `highway=secondary_link` | `ALL` | 1.5 | |
+| `highway=primary` | `ALL` | 2.06 | |
+| `highway=primary_link` | `ALL` | 2.06 | |
+| `highway=trunk` | `ALL` | 7.47 | 7.47 |
+| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
+| `highway=motorway_link` | `CAR` | 2.06 | |
+| `highway=motorway` | `CAR` | 8.0 | |
@@ -200,43 +82,55 @@ way properties. Multiple mixins can apply to the same way and their effects comp
-| matcher | bicycle safety | walk safety |
-|-----------------------------------------------------------------------------------------------------------------------|----------------|-------------|
-| `highway=tertiary` | 1.2 | |
-| `maxspeed=70` | 1.5 | |
-| `maxspeed=80` | 2.0 | |
-| `maxspeed=90` | 3.0 | |
-| `maxspeed=100` | 5.0 | |
-| `tracktype=grade1` | | |
-| `tracktype=grade2` | 1.1 | |
-| `tracktype=grade3` | 1.15 | |
-| `tracktype=grade4` | 1.3 | |
-| `tracktype=grade5` | 1.5 | |
-| `lit=no` | 1.05 | |
-| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | 0.7 | |
-| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | 0.25 |
-| `highway=trunk; sidewalk=lane` | | 0.6 |
-| `surface=unpaved` | 1.18 | |
-| `surface=compacted` | 1.18 | |
-| `surface=wood` | 1.18 | |
-| `surface=cobblestone` | 1.3 | |
-| `surface=sett` | 1.3 | |
-| `surface=unhewn_cobblestone` | 1.5 | |
-| `surface=grass_paver` | 1.3 | |
-| `surface=pebblestone` | 1.3 | |
-| `surface=metal` | 1.3 | |
-| `surface=ground` | 1.5 | |
-| `surface=dirt` | 1.5 | |
-| `surface=earth` | 1.5 | |
-| `surface=grass` | 1.5 | |
-| `surface=mud` | 1.5 | |
-| `surface=woodchip` | 1.5 | |
-| `surface=gravel` | 1.5 | |
-| `surface=artifical_turf` | 1.5 | |
-| `surface=sand` | 100.0 | |
-| `foot=discouraged` | | 3.0 |
-| `bicycle=discouraged` | 3.0 | |
-| `foot=use_sidepath` | | 5.0 |
-| `bicycle=use_sidepath` | 5.0 | |
+| matcher | add permission | remove permission | bicycle safety | walk safety |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|------------------------|-----------------------------------------------------|-------------|
+| `footway=sidewalk; highway=footway; bicycle=yes` | | | 0.6 | |
+| `highway=tertiary` | | | 1.2 | |
+| `maxspeed=70` | | | 1.5 | |
+| `maxspeed=80` | | | 2.0 | |
+| `maxspeed=90` | | | 3.0 | |
+| `maxspeed=100` | | | 5.0 | |
+| `tracktype=grade1` | | | | |
+| `tracktype=grade2` | | | 1.1 | |
+| `tracktype=grade3` | | | 1.15 | |
+| `tracktype=grade4` | | | 1.3 | |
+| `tracktype=grade5` | | | 1.5 | |
+| `lit=no` | | | 1.05 | |
+| `motorroad=yes` | | PEDESTRIAN_AND_BICYCLE | | |
+| `cycleway=lane; not(highway=cycleway)` | BICYCLE | | 0.87 | |
+| `cycleway=share_busway; not(highway=cycleway)` | BICYCLE | | 0.92 | |
+| `cycleway=opposite_lane; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.87 | |
+| `cycleway=track; not(highway=cycleway)` | BICYCLE | | 0.75 | |
+| `cycleway=opposite_track; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.75 | |
+| `cycleway=shared_lane; not(highway=cycleway)` | BICYCLE | | 0.77 | |
+| `cycleway=opposite; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 1.4 | |
+| `footway=sidewalk` | | | 2.5 | |
+| `footway=crossing` | | | 1.5 | |
+| `bicycle=designated; cycleway not one of [no, none] or absent; not(highway=cycleway); not(lcn=yes); not(rcn=yes); not(ncn=yes); not(bicycle_road=yes); not(cyclestreet=yes)` | | | 0.8 | |
+| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | | | 0.7 | |
+| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | | | 0.25 |
+| `highway=trunk; sidewalk=lane` | | | | 0.6 |
+| `surface=unpaved` | | | 1.18 | |
+| `surface=compacted` | | | 1.18 | |
+| `surface=wood` | | | 1.18 | |
+| `surface=cobblestone` | | | 1.3 | |
+| `surface=sett` | | | 1.3 | |
+| `surface=unhewn_cobblestone` | | | 1.5 | |
+| `surface=grass_paver` | | | 1.3 | |
+| `surface=pebblestone` | | | 1.3 | |
+| `surface=metal` | | | 1.3 | |
+| `surface=ground` | | | 1.5 | |
+| `surface=dirt` | | | 1.5 | |
+| `surface=earth` | | | 1.5 | |
+| `surface=grass` | | | 1.5 | |
+| `surface=mud` | | | 1.5 | |
+| `surface=woodchip` | | | 1.5 | |
+| `surface=gravel` | | | 1.5 | |
+| `surface=artifical_turf` | | | 1.5 | |
+| `surface=sand` | | | 100.0 | |
+| `foot=discouraged` | | | | 3.0 |
+| `bicycle=discouraged` | | | 3.0 | |
+| `foot=use_sidepath` | | | | 5.0 |
+| `bicycle=use_sidepath` | | | 5.0 | |
diff --git a/doc/user/osm/Norway.md b/doc/user/osm/Norway.md
index d637c6b24b8..c700d578fc5 100644
--- a/doc/user/osm/Norway.md
+++ b/doc/user/osm/Norway.md
@@ -81,42 +81,42 @@ way properties. Multiple mixins can apply to the same way and their effects comp
-| matcher | bicycle safety | walk safety |
-|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|-------------|
-| `cycleway=shared_lane; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified, residential]` | 0.85 | |
-| `lcn=yes¦rcn=yes¦ncn=yes` | 0.85 | |
-| `oneway=yes; cycleway not one of [no, none] or absent; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified, residential]` | no direction: 1.0
forward: 1.0
back: 1.15 | |
-| `embedded_rails one of [tram, light_rail, disused]` | 1.2 | |
-| `tunnel=yes; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified]` | 2.0 | 2.0 |
-| `bridge=yes; sidewalk not one of [no, separate] or absent; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified]¦verge=no; sidewalk not one of [no, separate] or absent; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified]` | | 2.0 |
-| `junction=roundabout; sidewalk not one of [no, separate] or absent` | | 2.0 |
-| `surface=grass_paver` | 1.2 | |
-| `surface=sett` | 1.2 | |
-| `surface=cobblestone` | 1.2 | |
-| `surface=unhewn_cobblestone` | 3.0 | |
-| `surface=metal_grid` | 1.2 | |
-| `surface=metal` | 1.2 | |
-| `smoothness=intermediate; surface one of [asfalt, concrete, paving_stones, paved, wood]` | 1.2 | |
-| `smoothness=bad; surface one of [asfalt, concrete, paving_stones, paved, wood]` | 1.4 | 1.6 |
-| `surface=unpaved; !tracktype` | 1.8 | 1.6 |
-| `surface=compacted` | 1.4 | 1.4 |
-| `surface=fine_gravel` | 1.8 | 1.6 |
-| `surface=pebblestone` | 1.8 | 1.6 |
-| `surface=gravel` | 1.8 | 1.6 |
-| `surface=woodchip` | 1.8 | 1.6 |
-| `surface=ground` | 2.3 | 2.4 |
-| `surface=dirt` | 2.3 | 2.4 |
-| `surface=earth` | 2.3 | 2.4 |
-| `surface=grass` | 2.3 | 1.8 |
-| `surface=mud` | 3.0 | 3.0 |
-| `surface=sand` | 3.0 | 1.8 |
-| `!tracktype; surface not one of [unpaved] or absent; highway one of [track, bridleway]` | 1.8 | 1.6 |
-| `tracktype=grade2; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | 1.4 | 1.4 |
-| `tracktype=grade3; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | 1.8 | 1.6 |
-| `tracktype=grade4; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | 2.3 | 1.8 |
-| `tracktype=grade5; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | 2.3 | 2.4 |
-| `surface not one of [no, none] or absent; highway=path` | 2.3 | 2.4 |
-| `sac_scale=mountain_hiking` | | 1.8 |
-| `trail_visibility=intermediate` | | 1.8 |
+| matcher | add permission | remove permission | bicycle safety | walk safety |
+|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------|-------------------|-----------------------------------------------------|-------------|
+| `cycleway=shared_lane; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified, residential]` | | | 0.85 | |
+| `lcn=yes¦rcn=yes¦ncn=yes` | | | 0.85 | |
+| `oneway=yes; cycleway not one of [no, none] or absent; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified, residential]` | | | no direction: 1.0
forward: 1.0
back: 1.15 | |
+| `embedded_rails one of [tram, light_rail, disused]` | | | 1.2 | |
+| `tunnel=yes; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified]` | | | 2.0 | 2.0 |
+| `bridge=yes; sidewalk not one of [no, separate] or absent; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified]¦verge=no; sidewalk not one of [no, separate] or absent; highway one of [trunk, trunk_link, primary, primary_link, secondary, secondary_link, tertiary, tertiary_link, unclassified]` | | | | 2.0 |
+| `junction=roundabout; sidewalk not one of [no, separate] or absent` | | | | 2.0 |
+| `surface=grass_paver` | | | 1.2 | |
+| `surface=sett` | | | 1.2 | |
+| `surface=cobblestone` | | | 1.2 | |
+| `surface=unhewn_cobblestone` | | | 3.0 | |
+| `surface=metal_grid` | | | 1.2 | |
+| `surface=metal` | | | 1.2 | |
+| `smoothness=intermediate; surface one of [asfalt, concrete, paving_stones, paved, wood]` | | | 1.2 | |
+| `smoothness=bad; surface one of [asfalt, concrete, paving_stones, paved, wood]` | | | 1.4 | 1.6 |
+| `surface=unpaved; !tracktype` | | | 1.8 | 1.6 |
+| `surface=compacted` | | | 1.4 | 1.4 |
+| `surface=fine_gravel` | | | 1.8 | 1.6 |
+| `surface=pebblestone` | | | 1.8 | 1.6 |
+| `surface=gravel` | | | 1.8 | 1.6 |
+| `surface=woodchip` | | | 1.8 | 1.6 |
+| `surface=ground` | | | 2.3 | 2.4 |
+| `surface=dirt` | | | 2.3 | 2.4 |
+| `surface=earth` | | | 2.3 | 2.4 |
+| `surface=grass` | | | 2.3 | 1.8 |
+| `surface=mud` | | | 3.0 | 3.0 |
+| `surface=sand` | | | 3.0 | 1.8 |
+| `!tracktype; surface not one of [unpaved] or absent; highway one of [track, bridleway]` | | | 1.8 | 1.6 |
+| `tracktype=grade2; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | | | 1.4 | 1.4 |
+| `tracktype=grade3; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | | | 1.8 | 1.6 |
+| `tracktype=grade4; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | | | 2.3 | 1.8 |
+| `tracktype=grade5; surface not one of [unpaved] or absent; highway one of [track, bridleway, service, unclassified]` | | | 2.3 | 2.4 |
+| `surface not one of [no, none] or absent; highway=path` | | | 2.3 | 2.4 |
+| `sac_scale=mountain_hiking` | | | | 1.8 |
+| `trail_visibility=intermediate` | | | | 1.8 |
diff --git a/doc/user/osm/OsmTag.md b/doc/user/osm/OsmTag.md
index a539b5631fe..1b2912b8ed9 100644
--- a/doc/user/osm/OsmTag.md
+++ b/doc/user/osm/OsmTag.md
@@ -22,163 +22,46 @@ Lower safety values make an OSM way more desirable and higher values less desira
-| specifier | permission | bike safety | walk safety |
-|---------------------------------------------------------|--------------------------|-------------------------------------------------------|-------------|
-| `mtb:scale=3` | `NONE` | | |
-| `mtb:scale=4` | `NONE` | | |
-| `mtb:scale=5` | `NONE` | | |
-| `mtb:scale=6` | `NONE` | | |
-| `highway=bridleway` | `NONE` | 1.3 | |
-| `highway=corridor` | `PEDESTRIAN` | | |
-| `highway=steps` | `PEDESTRIAN` | | |
-| `highway=crossing` | `PEDESTRIAN` | | |
-| `highway=platform` | `PEDESTRIAN` | | |
-| `public_transport=platform` | `PEDESTRIAN` | | |
-| `railway=platform` | `PEDESTRIAN` | | |
-| `footway=sidewalk; highway=footway` | `PEDESTRIAN` | | |
-| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
-| `highway=footway` | `PEDESTRIAN` | 1.1 | |
-| `mtb:scale=1` | `PEDESTRIAN` | | |
-| `mtb:scale=2` | `PEDESTRIAN` | | |
-| `indoor=area` | `PEDESTRIAN` | | |
-| `indoor=corridor` | `PEDESTRIAN` | | |
-| `highway=cycleway` | `BICYCLE` | 0.6 | |
-| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
-| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=living_street` | `ALL` | 0.9 | |
-| `highway=unclassified` | `ALL` | | |
-| `highway=road` | `ALL` | | |
-| `highway=byway` | `ALL` | 1.3 | |
-| `highway=track` | `ALL` | 1.3 | |
-| `highway=service` | `ALL` | 1.1 | |
-| `highway=residential` | `ALL` | 0.98 | |
-| `highway=residential_link` | `ALL` | 0.98 | |
-| `highway=tertiary` | `ALL` | | |
-| `highway=tertiary_link` | `ALL` | | |
-| `highway=secondary` | `ALL` | 1.5 | |
-| `highway=secondary_link` | `ALL` | 1.5 | |
-| `highway=primary` | `ALL` | 2.06 | |
-| `highway=primary_link` | `ALL` | 2.06 | |
-| `highway=trunk` | `ALL` | 7.47 | 7.47 |
-| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
-| `highway=motorway_link` | `CAR` | 2.06 | |
-| `highway=motorway` | `CAR` | 8.0 | |
-| `motorroad=yes` | `CAR` | 7.47 | 7.47 |
-| `present(highway); cycleway=lane` | `PEDESTRIAN_AND_BICYCLE` | 0.87 | |
-| `highway=service; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=tertiary_link; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=secondary; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=secondary_link; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=primary; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=primary_link; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=trunk; cycleway=lane` | `ALL` | 1.5 | 7.47 |
-| `highway=trunk_link; cycleway=lane` | `ALL` | 1.15 | 7.47 |
-| `highway=motorway; cycleway=lane` | `BICYCLE_AND_CAR` | 2.0 | |
-| `highway=motorway_link; cycleway=lane` | `BICYCLE_AND_CAR` | 1.15 | |
-| `present(highway); cycleway=share_busway` | `PEDESTRIAN_AND_BICYCLE` | 0.92 | |
-| `highway=service; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential_link; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=tertiary; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=tertiary_link; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=secondary; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=secondary_link; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=primary; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=primary_link; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=trunk; cycleway=share_busway` | `ALL` | 1.75 | 7.47 |
-| `highway=trunk_link; cycleway=share_busway` | `ALL` | 1.25 | 7.47 |
-| `highway=motorway; cycleway=share_busway` | `BICYCLE_AND_CAR` | 2.5 | |
-| `highway=motorway_link; cycleway=share_busway` | `BICYCLE_AND_CAR` | 1.25 | |
-| `present(highway); cycleway=opposite_lane` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=service; cycleway=opposite_lane` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.77 | |
-| `highway=residential; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=residential_link; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=tertiary; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=tertiary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=secondary; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=secondary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=primary; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=primary_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=trunk; cycleway=opposite_lane` | `ALL` | no direction: 7.47
forward: 7.47
back: 1.15 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | 7.47 |
-| `present(highway); cycleway=track` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=service; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential_link; cycleway=track` | `ALL` | 0.65 | |
-| `highway=tertiary; cycleway=track` | `ALL` | 0.75 | |
-| `highway=tertiary_link; cycleway=track` | `ALL` | 0.75 | |
-| `highway=secondary; cycleway=track` | `ALL` | 0.8 | |
-| `highway=secondary_link; cycleway=track` | `ALL` | 0.8 | |
-| `highway=primary; cycleway=track` | `ALL` | 0.85 | |
-| `highway=primary_link; cycleway=track` | `ALL` | 0.85 | |
-| `highway=trunk; cycleway=track` | `ALL` | 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=track` | `ALL` | 0.85 | 7.47 |
-| `present(highway); cycleway=opposite_track` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=service; cycleway=opposite_track` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.65 | |
-| `highway=residential; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=residential_link; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=tertiary; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=tertiary_link; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=secondary; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=secondary_link; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=primary; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=primary_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=trunk; cycleway=opposite_track` | `ALL` | no direction: 7.47
forward: 7.47
back: 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | 7.47 |
-| `present(highway); cycleway=shared_lane` | `PEDESTRIAN_AND_BICYCLE` | 0.77 | |
-| `highway=service; cycleway=shared_lane` | `ALL` | 0.73 | |
-| `highway=residential; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=tertiary_link; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=secondary; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=secondary_link; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=primary; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `highway=primary_link; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `present(highway); cycleway=opposite` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 1.4 | |
-| `highway=service; cycleway=opposite` | `ALL` | 1.1 | |
-| `highway=residential; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=residential_link; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=tertiary; cycleway=opposite` | `ALL` | | |
-| `highway=tertiary_link; cycleway=opposite` | `ALL` | | |
-| `highway=secondary; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=secondary_link; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=primary; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=primary_link; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=path; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=footway; bicycle=yes; area=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.9 | |
-| `highway=pedestrian; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `footway=sidewalk; highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 2.5 | |
-| `footway=sidewalk; highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=footway; footway=crossing` | `PEDESTRIAN` | 2.5 | |
-| `highway=footway; footway=crossing; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=track; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; bicycle=yes; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.3 | |
-| `present(highway); bicycle=designated` | `BICYCLE` | 0.97 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | |
-| `highway=cycleway; bicycle=designated` | `BICYCLE` | 0.6 | |
-| `highway=bridleway; bicycle=designated` | `BICYCLE` | 0.8 | |
-| `highway=service; bicycle=designated` | `ALL` | 0.84 | |
-| `highway=residential; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=unclassified; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=residential_link; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=tertiary; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=tertiary_link; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=secondary; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=secondary_link; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=primary; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=primary_link; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=trunk; bicycle=designated` | `ALL` | 7.25 | 7.47 |
-| `highway=trunk_link; bicycle=designated` | `ALL` | 2.0 | 7.47 |
-| `highway=motorway; bicycle=designated` | `BICYCLE_AND_CAR` | 7.76 | |
-| `highway=motorway_link; bicycle=designated` | `BICYCLE_AND_CAR` | 2.0 | |
+| specifier | permission | bike safety | walk safety |
+|-----------------------------|--------------------------|-------------|-------------|
+| `mtb:scale=3` | `NONE` | | |
+| `mtb:scale=4` | `NONE` | | |
+| `mtb:scale=5` | `NONE` | | |
+| `mtb:scale=6` | `NONE` | | |
+| `highway=bridleway` | `NONE` | 1.3 | |
+| `highway=corridor` | `PEDESTRIAN` | | |
+| `highway=steps` | `PEDESTRIAN` | | |
+| `highway=crossing` | `PEDESTRIAN` | | |
+| `highway=platform` | `PEDESTRIAN` | | |
+| `public_transport=platform` | `PEDESTRIAN` | | |
+| `railway=platform` | `PEDESTRIAN` | | |
+| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
+| `highway=footway` | `PEDESTRIAN` | 1.1 | |
+| `mtb:scale=1` | `PEDESTRIAN` | 1.5 | |
+| `mtb:scale=2` | `PEDESTRIAN` | 3.0 | |
+| `indoor=area` | `PEDESTRIAN` | | |
+| `indoor=corridor` | `PEDESTRIAN` | | |
+| `highway=cycleway` | `BICYCLE` | 0.6 | |
+| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
+| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
+| `highway=living_street` | `ALL` | 0.9 | |
+| `highway=unclassified` | `ALL` | | |
+| `highway=road` | `ALL` | | |
+| `highway=byway` | `ALL` | 1.3 | |
+| `highway=track` | `ALL` | 1.3 | |
+| `highway=service` | `ALL` | 1.1 | |
+| `highway=residential` | `ALL` | 0.98 | |
+| `highway=residential_link` | `ALL` | 0.98 | |
+| `highway=tertiary` | `ALL` | | |
+| `highway=tertiary_link` | `ALL` | | |
+| `highway=secondary` | `ALL` | 1.5 | |
+| `highway=secondary_link` | `ALL` | 1.5 | |
+| `highway=primary` | `ALL` | 2.06 | |
+| `highway=primary_link` | `ALL` | 2.06 | |
+| `highway=trunk` | `ALL` | 7.47 | 7.47 |
+| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
+| `highway=motorway_link` | `CAR` | 2.06 | |
+| `highway=motorway` | `CAR` | 8.0 | |
@@ -191,32 +74,43 @@ way properties. Multiple mixins can apply to the same way and their effects comp
-| matcher | bicycle safety | walk safety |
-|-----------------------------------------------------------------------------------------------------------------------|----------------|-------------|
-| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | 0.7 | |
-| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | 0.25 |
-| `highway=trunk; sidewalk=lane` | | 0.6 |
-| `surface=unpaved` | 1.18 | |
-| `surface=compacted` | 1.18 | |
-| `surface=wood` | 1.18 | |
-| `surface=cobblestone` | 1.3 | |
-| `surface=sett` | 1.3 | |
-| `surface=unhewn_cobblestone` | 1.5 | |
-| `surface=grass_paver` | 1.3 | |
-| `surface=pebblestone` | 1.3 | |
-| `surface=metal` | 1.3 | |
-| `surface=ground` | 1.5 | |
-| `surface=dirt` | 1.5 | |
-| `surface=earth` | 1.5 | |
-| `surface=grass` | 1.5 | |
-| `surface=mud` | 1.5 | |
-| `surface=woodchip` | 1.5 | |
-| `surface=gravel` | 1.5 | |
-| `surface=artifical_turf` | 1.5 | |
-| `surface=sand` | 100.0 | |
-| `foot=discouraged` | | 3.0 |
-| `bicycle=discouraged` | 3.0 | |
-| `foot=use_sidepath` | | 5.0 |
-| `bicycle=use_sidepath` | 5.0 | |
+| matcher | add permission | remove permission | bicycle safety | walk safety |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|------------------------|-----------------------------------------------------|-------------|
+| `motorroad=yes` | | PEDESTRIAN_AND_BICYCLE | | |
+| `cycleway=lane; not(highway=cycleway)` | BICYCLE | | 0.87 | |
+| `cycleway=share_busway; not(highway=cycleway)` | BICYCLE | | 0.92 | |
+| `cycleway=opposite_lane; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.87 | |
+| `cycleway=track; not(highway=cycleway)` | BICYCLE | | 0.75 | |
+| `cycleway=opposite_track; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.75 | |
+| `cycleway=shared_lane; not(highway=cycleway)` | BICYCLE | | 0.77 | |
+| `cycleway=opposite; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 1.4 | |
+| `footway=sidewalk` | | | 2.5 | |
+| `footway=crossing` | | | 1.5 | |
+| `bicycle=designated; cycleway not one of [no, none] or absent; not(highway=cycleway); not(lcn=yes); not(rcn=yes); not(ncn=yes); not(bicycle_road=yes); not(cyclestreet=yes)` | | | 0.8 | |
+| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | | | 0.7 | |
+| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | | | 0.25 |
+| `highway=trunk; sidewalk=lane` | | | | 0.6 |
+| `surface=unpaved` | | | 1.18 | |
+| `surface=compacted` | | | 1.18 | |
+| `surface=wood` | | | 1.18 | |
+| `surface=cobblestone` | | | 1.3 | |
+| `surface=sett` | | | 1.3 | |
+| `surface=unhewn_cobblestone` | | | 1.5 | |
+| `surface=grass_paver` | | | 1.3 | |
+| `surface=pebblestone` | | | 1.3 | |
+| `surface=metal` | | | 1.3 | |
+| `surface=ground` | | | 1.5 | |
+| `surface=dirt` | | | 1.5 | |
+| `surface=earth` | | | 1.5 | |
+| `surface=grass` | | | 1.5 | |
+| `surface=mud` | | | 1.5 | |
+| `surface=woodchip` | | | 1.5 | |
+| `surface=gravel` | | | 1.5 | |
+| `surface=artifical_turf` | | | 1.5 | |
+| `surface=sand` | | | 100.0 | |
+| `foot=discouraged` | | | | 3.0 |
+| `bicycle=discouraged` | | | 3.0 | |
+| `foot=use_sidepath` | | | | 5.0 |
+| `bicycle=use_sidepath` | | | 5.0 | |
diff --git a/doc/user/osm/UK.md b/doc/user/osm/UK.md
index 87ee6603f2a..7599558f1eb 100644
--- a/doc/user/osm/UK.md
+++ b/doc/user/osm/UK.md
@@ -22,179 +22,50 @@ Lower safety values make an OSM way more desirable and higher values less desira
-| specifier | permission | bike safety | walk safety |
-|---------------------------------------------------------|--------------------------|-------------------------------------------------------|-------------|
-| `highway=cycleway` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=bridleway` | `PEDESTRIAN_AND_BICYCLE` | 1.3 | |
-| `highway=trunk` | `ALL` | 2.5 | 2.5 |
-| `highway=trunk_link` | `ALL` | 2.06 | 2.5 |
-| `highway=trunk; cycleway=lane` | `ALL` | 1.5 | 2.5 |
-| `highway=trunk_link; cycleway=lane` | `ALL` | 1.15 | 2.5 |
-| `highway=trunk; cycleway=share_busway` | `ALL` | 1.75 | 2.5 |
-| `highway=trunk_link; cycleway=share_busway` | `ALL` | 1.25 | 2.5 |
-| `highway=trunk; cycleway=opposite_lane` | `ALL` | no direction: 2.5
forward: 2.5
back: 1.5 | 2.5 |
-| `highway=trunk_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | 2.5 |
-| `highway=trunk; cycleway=track` | `ALL` | 0.95 | 2.5 |
-| `highway=trunk_link; cycleway=track` | `ALL` | 0.85 | 2.5 |
-| `highway=trunk; cycleway=opposite_track` | `ALL` | no direction: 2.5
forward: 2.5
back: 0.95 | 2.5 |
-| `highway=trunk_link; cycleway=opposite_track` | `ALL` | no direction: 2.5
forward: 2.5
back: 0.85 | 2.5 |
-| `highway=trunk; bicycle=designated` | `ALL` | 1.75 | 2.5 |
-| `highway=trunk_link; bicycle=designated` | `ALL` | 1.75 | 2.5 |
-| `mtb:scale=3` | `NONE` | | |
-| `mtb:scale=4` | `NONE` | | |
-| `mtb:scale=5` | `NONE` | | |
-| `mtb:scale=6` | `NONE` | | |
-| `highway=bridleway` | `NONE` | 1.3 | |
-| `highway=corridor` | `PEDESTRIAN` | | |
-| `highway=steps` | `PEDESTRIAN` | | |
-| `highway=crossing` | `PEDESTRIAN` | | |
-| `highway=platform` | `PEDESTRIAN` | | |
-| `public_transport=platform` | `PEDESTRIAN` | | |
-| `railway=platform` | `PEDESTRIAN` | | |
-| `footway=sidewalk; highway=footway` | `PEDESTRIAN` | | |
-| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
-| `highway=footway` | `PEDESTRIAN` | 1.1 | |
-| `mtb:scale=1` | `PEDESTRIAN` | | |
-| `mtb:scale=2` | `PEDESTRIAN` | | |
-| `indoor=area` | `PEDESTRIAN` | | |
-| `indoor=corridor` | `PEDESTRIAN` | | |
-| `highway=cycleway` | `BICYCLE` | 0.6 | |
-| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
-| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=living_street` | `ALL` | 0.9 | |
-| `highway=unclassified` | `ALL` | | |
-| `highway=road` | `ALL` | | |
-| `highway=byway` | `ALL` | 1.3 | |
-| `highway=track` | `ALL` | 1.3 | |
-| `highway=service` | `ALL` | 1.1 | |
-| `highway=residential` | `ALL` | 0.98 | |
-| `highway=residential_link` | `ALL` | 0.98 | |
-| `highway=tertiary` | `ALL` | | |
-| `highway=tertiary_link` | `ALL` | | |
-| `highway=secondary` | `ALL` | 1.5 | |
-| `highway=secondary_link` | `ALL` | 1.5 | |
-| `highway=primary` | `ALL` | 2.06 | |
-| `highway=primary_link` | `ALL` | 2.06 | |
-| `highway=trunk` | `ALL` | 7.47 | 7.47 |
-| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
-| `highway=motorway_link` | `CAR` | 2.06 | |
-| `highway=motorway` | `CAR` | 8.0 | |
-| `motorroad=yes` | `CAR` | 7.47 | 7.47 |
-| `present(highway); cycleway=lane` | `PEDESTRIAN_AND_BICYCLE` | 0.87 | |
-| `highway=service; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=tertiary_link; cycleway=lane` | `ALL` | 0.87 | |
-| `highway=secondary; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=secondary_link; cycleway=lane` | `ALL` | 0.96 | |
-| `highway=primary; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=primary_link; cycleway=lane` | `ALL` | 1.15 | |
-| `highway=trunk; cycleway=lane` | `ALL` | 1.5 | 7.47 |
-| `highway=trunk_link; cycleway=lane` | `ALL` | 1.15 | 7.47 |
-| `highway=motorway; cycleway=lane` | `BICYCLE_AND_CAR` | 2.0 | |
-| `highway=motorway_link; cycleway=lane` | `BICYCLE_AND_CAR` | 1.15 | |
-| `present(highway); cycleway=share_busway` | `PEDESTRIAN_AND_BICYCLE` | 0.92 | |
-| `highway=service; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=residential_link; cycleway=share_busway` | `ALL` | 0.85 | |
-| `highway=tertiary; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=tertiary_link; cycleway=share_busway` | `ALL` | 0.92 | |
-| `highway=secondary; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=secondary_link; cycleway=share_busway` | `ALL` | 0.99 | |
-| `highway=primary; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=primary_link; cycleway=share_busway` | `ALL` | 1.25 | |
-| `highway=trunk; cycleway=share_busway` | `ALL` | 1.75 | 7.47 |
-| `highway=trunk_link; cycleway=share_busway` | `ALL` | 1.25 | 7.47 |
-| `highway=motorway; cycleway=share_busway` | `BICYCLE_AND_CAR` | 2.5 | |
-| `highway=motorway_link; cycleway=share_busway` | `BICYCLE_AND_CAR` | 1.25 | |
-| `present(highway); cycleway=opposite_lane` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=service; cycleway=opposite_lane` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.77 | |
-| `highway=residential; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=residential_link; cycleway=opposite_lane` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.77 | |
-| `highway=tertiary; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=tertiary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.87 | |
-| `highway=secondary; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=secondary_link; cycleway=opposite_lane` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.96 | |
-| `highway=primary; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=primary_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | |
-| `highway=trunk; cycleway=opposite_lane` | `ALL` | no direction: 7.47
forward: 7.47
back: 1.15 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_lane` | `ALL` | no direction: 2.06
forward: 2.06
back: 1.15 | 7.47 |
-| `present(highway); cycleway=track` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=service; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential; cycleway=track` | `ALL` | 0.65 | |
-| `highway=residential_link; cycleway=track` | `ALL` | 0.65 | |
-| `highway=tertiary; cycleway=track` | `ALL` | 0.75 | |
-| `highway=tertiary_link; cycleway=track` | `ALL` | 0.75 | |
-| `highway=secondary; cycleway=track` | `ALL` | 0.8 | |
-| `highway=secondary_link; cycleway=track` | `ALL` | 0.8 | |
-| `highway=primary; cycleway=track` | `ALL` | 0.85 | |
-| `highway=primary_link; cycleway=track` | `ALL` | 0.85 | |
-| `highway=trunk; cycleway=track` | `ALL` | 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=track` | `ALL` | 0.85 | 7.47 |
-| `present(highway); cycleway=opposite_track` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=service; cycleway=opposite_track` | `ALL` | no direction: 1.1
forward: 1.1
back: 0.65 | |
-| `highway=residential; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=residential_link; cycleway=opposite_track` | `ALL` | no direction: 0.98
forward: 0.98
back: 0.65 | |
-| `highway=tertiary; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=tertiary_link; cycleway=opposite_track` | `ALL` | no direction: 1.0
forward: 1.0
back: 0.75 | |
-| `highway=secondary; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=secondary_link; cycleway=opposite_track` | `ALL` | no direction: 1.5
forward: 1.5
back: 0.8 | |
-| `highway=primary; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=primary_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | |
-| `highway=trunk; cycleway=opposite_track` | `ALL` | no direction: 7.47
forward: 7.47
back: 0.95 | 7.47 |
-| `highway=trunk_link; cycleway=opposite_track` | `ALL` | no direction: 2.06
forward: 2.06
back: 0.85 | 7.47 |
-| `present(highway); cycleway=shared_lane` | `PEDESTRIAN_AND_BICYCLE` | 0.77 | |
-| `highway=service; cycleway=shared_lane` | `ALL` | 0.73 | |
-| `highway=residential; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=residential_link; cycleway=shared_lane` | `ALL` | 0.77 | |
-| `highway=tertiary; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=tertiary_link; cycleway=shared_lane` | `ALL` | 0.83 | |
-| `highway=secondary; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=secondary_link; cycleway=shared_lane` | `ALL` | 1.25 | |
-| `highway=primary; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `highway=primary_link; cycleway=shared_lane` | `ALL` | 1.75 | |
-| `present(highway); cycleway=opposite` | `PEDESTRIAN_AND_BICYCLE` | no direction: 1.0
forward: 1.0
back: 1.4 | |
-| `highway=service; cycleway=opposite` | `ALL` | 1.1 | |
-| `highway=residential; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=residential_link; cycleway=opposite` | `ALL` | 0.98 | |
-| `highway=tertiary; cycleway=opposite` | `ALL` | | |
-| `highway=tertiary_link; cycleway=opposite` | `ALL` | | |
-| `highway=secondary; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=secondary_link; cycleway=opposite` | `ALL` | no direction: 1.5
forward: 1.5
back: 1.71 | |
-| `highway=primary; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=primary_link; cycleway=opposite` | `ALL` | no direction: 2.06
forward: 2.06
back: 2.99 | |
-| `highway=path; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `highway=footway; bicycle=yes; area=yes` | `PEDESTRIAN_AND_BICYCLE` | 0.9 | |
-| `highway=pedestrian; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
-| `footway=sidewalk; highway=footway; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 2.5 | |
-| `footway=sidewalk; highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=footway; footway=crossing` | `PEDESTRIAN` | 2.5 | |
-| `highway=footway; footway=crossing; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 1.1 | |
-| `highway=track; bicycle=yes` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; bicycle=yes; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.18 | |
-| `highway=track; bicycle=designated; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 0.99 | |
-| `highway=track; present(surface)` | `PEDESTRIAN_AND_BICYCLE` | 1.3 | |
-| `present(highway); bicycle=designated` | `BICYCLE` | 0.97 | |
-| `highway=footway; bicycle=designated` | `PEDESTRIAN_AND_BICYCLE` | 0.8 | |
-| `highway=cycleway; bicycle=designated` | `BICYCLE` | 0.6 | |
-| `highway=bridleway; bicycle=designated` | `BICYCLE` | 0.8 | |
-| `highway=service; bicycle=designated` | `ALL` | 0.84 | |
-| `highway=residential; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=unclassified; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=residential_link; bicycle=designated` | `ALL` | 0.95 | |
-| `highway=tertiary; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=tertiary_link; bicycle=designated` | `ALL` | 0.97 | |
-| `highway=secondary; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=secondary_link; bicycle=designated` | `ALL` | 1.46 | |
-| `highway=primary; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=primary_link; bicycle=designated` | `ALL` | 2.0 | |
-| `highway=trunk; bicycle=designated` | `ALL` | 7.25 | 7.47 |
-| `highway=trunk_link; bicycle=designated` | `ALL` | 2.0 | 7.47 |
-| `highway=motorway; bicycle=designated` | `BICYCLE_AND_CAR` | 7.76 | |
-| `highway=motorway_link; bicycle=designated` | `BICYCLE_AND_CAR` | 2.0 | |
+| specifier | permission | bike safety | walk safety |
+|-----------------------------|--------------------------|-------------|-------------|
+| `highway=cycleway` | `PEDESTRIAN_AND_BICYCLE` | 0.6 | |
+| `highway=bridleway` | `PEDESTRIAN_AND_BICYCLE` | 1.3 | |
+| `highway=trunk` | `ALL` | 2.5 | 2.5 |
+| `highway=trunk_link` | `ALL` | 2.06 | 2.5 |
+| `mtb:scale=3` | `NONE` | | |
+| `mtb:scale=4` | `NONE` | | |
+| `mtb:scale=5` | `NONE` | | |
+| `mtb:scale=6` | `NONE` | | |
+| `highway=bridleway` | `NONE` | 1.3 | |
+| `highway=corridor` | `PEDESTRIAN` | | |
+| `highway=steps` | `PEDESTRIAN` | | |
+| `highway=crossing` | `PEDESTRIAN` | | |
+| `highway=platform` | `PEDESTRIAN` | | |
+| `public_transport=platform` | `PEDESTRIAN` | | |
+| `railway=platform` | `PEDESTRIAN` | | |
+| `highway=pedestrian` | `PEDESTRIAN` | 0.9 | |
+| `highway=footway` | `PEDESTRIAN` | 1.1 | |
+| `mtb:scale=1` | `PEDESTRIAN` | 1.5 | |
+| `mtb:scale=2` | `PEDESTRIAN` | 3.0 | |
+| `indoor=area` | `PEDESTRIAN` | | |
+| `indoor=corridor` | `PEDESTRIAN` | | |
+| `highway=cycleway` | `BICYCLE` | 0.6 | |
+| `mtb:scale=0` | `PEDESTRIAN_AND_BICYCLE` | | |
+| `highway=path` | `PEDESTRIAN_AND_BICYCLE` | 0.75 | |
+| `highway=living_street` | `ALL` | 0.9 | |
+| `highway=unclassified` | `ALL` | | |
+| `highway=road` | `ALL` | | |
+| `highway=byway` | `ALL` | 1.3 | |
+| `highway=track` | `ALL` | 1.3 | |
+| `highway=service` | `ALL` | 1.1 | |
+| `highway=residential` | `ALL` | 0.98 | |
+| `highway=residential_link` | `ALL` | 0.98 | |
+| `highway=tertiary` | `ALL` | | |
+| `highway=tertiary_link` | `ALL` | | |
+| `highway=secondary` | `ALL` | 1.5 | |
+| `highway=secondary_link` | `ALL` | 1.5 | |
+| `highway=primary` | `ALL` | 2.06 | |
+| `highway=primary_link` | `ALL` | 2.06 | |
+| `highway=trunk` | `ALL` | 7.47 | 7.47 |
+| `highway=trunk_link` | `ALL` | 2.06 | 7.47 |
+| `highway=motorway_link` | `CAR` | 2.06 | |
+| `highway=motorway` | `CAR` | 8.0 | |
@@ -207,33 +78,44 @@ way properties. Multiple mixins can apply to the same way and their effects comp
-| matcher | bicycle safety | walk safety |
-|-----------------------------------------------------------------------------------------------------------------------|----------------|-------------|
-| `expressway=yes` | 5.0 | 5.0 |
-| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | 0.7 | |
-| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | 0.25 |
-| `highway=trunk; sidewalk=lane` | | 0.6 |
-| `surface=unpaved` | 1.18 | |
-| `surface=compacted` | 1.18 | |
-| `surface=wood` | 1.18 | |
-| `surface=cobblestone` | 1.3 | |
-| `surface=sett` | 1.3 | |
-| `surface=unhewn_cobblestone` | 1.5 | |
-| `surface=grass_paver` | 1.3 | |
-| `surface=pebblestone` | 1.3 | |
-| `surface=metal` | 1.3 | |
-| `surface=ground` | 1.5 | |
-| `surface=dirt` | 1.5 | |
-| `surface=earth` | 1.5 | |
-| `surface=grass` | 1.5 | |
-| `surface=mud` | 1.5 | |
-| `surface=woodchip` | 1.5 | |
-| `surface=gravel` | 1.5 | |
-| `surface=artifical_turf` | 1.5 | |
-| `surface=sand` | 100.0 | |
-| `foot=discouraged` | | 3.0 |
-| `bicycle=discouraged` | 3.0 | |
-| `foot=use_sidepath` | | 5.0 |
-| `bicycle=use_sidepath` | 5.0 | |
+| matcher | add permission | remove permission | bicycle safety | walk safety |
+|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|------------------------|-----------------------------------------------------|-------------|
+| `expressway=yes` | | | 5.0 | 5.0 |
+| `motorroad=yes` | | PEDESTRIAN_AND_BICYCLE | | |
+| `cycleway=lane; not(highway=cycleway)` | BICYCLE | | 0.87 | |
+| `cycleway=share_busway; not(highway=cycleway)` | BICYCLE | | 0.92 | |
+| `cycleway=opposite_lane; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.87 | |
+| `cycleway=track; not(highway=cycleway)` | BICYCLE | | 0.75 | |
+| `cycleway=opposite_track; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 0.75 | |
+| `cycleway=shared_lane; not(highway=cycleway)` | BICYCLE | | 0.77 | |
+| `cycleway=opposite; not(highway=cycleway)` | backward: BICYCLE | | no direction: 1.0
forward: 1.0
back: 1.4 | |
+| `footway=sidewalk` | | | 2.5 | |
+| `footway=crossing` | | | 1.5 | |
+| `bicycle=designated; cycleway not one of [no, none] or absent; not(highway=cycleway); not(lcn=yes); not(rcn=yes); not(ncn=yes); not(bicycle_road=yes); not(cyclestreet=yes)` | | | 0.8 | |
+| `lcn=yes¦rcn=yes¦ncn=yes¦bicycle_road=yes¦cyclestreet=yes` | | | 0.7 | |
+| `highway=trunk; sidewalk=yes¦highway=trunk; sidewalk=left¦highway=trunk; sidewalk=right¦highway=trunk; sidewalk=both` | | | | 0.25 |
+| `highway=trunk; sidewalk=lane` | | | | 0.6 |
+| `surface=unpaved` | | | 1.18 | |
+| `surface=compacted` | | | 1.18 | |
+| `surface=wood` | | | 1.18 | |
+| `surface=cobblestone` | | | 1.3 | |
+| `surface=sett` | | | 1.3 | |
+| `surface=unhewn_cobblestone` | | | 1.5 | |
+| `surface=grass_paver` | | | 1.3 | |
+| `surface=pebblestone` | | | 1.3 | |
+| `surface=metal` | | | 1.3 | |
+| `surface=ground` | | | 1.5 | |
+| `surface=dirt` | | | 1.5 | |
+| `surface=earth` | | | 1.5 | |
+| `surface=grass` | | | 1.5 | |
+| `surface=mud` | | | 1.5 | |
+| `surface=woodchip` | | | 1.5 | |
+| `surface=gravel` | | | 1.5 | |
+| `surface=artifical_turf` | | | 1.5 | |
+| `surface=sand` | | | 100.0 | |
+| `foot=discouraged` | | | | 3.0 |
+| `bicycle=discouraged` | | | 3.0 | |
+| `foot=use_sidepath` | | | | 5.0 |
+| `bicycle=use_sidepath` | | | 5.0 | |