From a40693ad3e04f48e684dc6c6182e2a288df4518d Mon Sep 17 00:00:00 2001 From: Steven te Brinke Date: Sat, 1 Aug 2020 13:16:05 +0200 Subject: [PATCH 1/8] refactor: set values once for clarity --- .../bike/RoadBikeFlagEncoder.java | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index cb3c102eec..f08021f310 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -80,7 +80,7 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, preferHighwayTags.add(VAL_SECONDARY_LINK); preferHighwayTags.add(VAL_TERTIARY); preferHighwayTags.add(VAL_TERTIARY_LINK); - preferHighwayTags.add(VAL_RESIDENTIAL); + preferHighwayTags.add(VAL_UNCLASSIFIED); setTrackTypeSpeed(VAL_GRADE_1, 20); // paved setTrackTypeSpeed("grade2", 10); // now unpaved ... @@ -122,17 +122,17 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setHighwaySpeed("road", 12); setHighwaySpeed(VAL_TRACK, PUSHING_SECTION_SPEED / 2); // assume unpaved setHighwaySpeed(VAL_SERVICE, 12); - setHighwaySpeed(VAL_UNCLASSIFIED, 16); - setHighwaySpeed(VAL_RESIDENTIAL, 16); + setHighwaySpeed(VAL_UNCLASSIFIED, 20); + setHighwaySpeed(VAL_RESIDENTIAL, 18); setHighwaySpeed("trunk", 20); setHighwaySpeed("trunk_link", 20); - setHighwaySpeed("primary", 20); - setHighwaySpeed("primary_link", 20); - setHighwaySpeed(VAL_SECONDARY, 20); - setHighwaySpeed(VAL_SECONDARY_LINK, 20); - setHighwaySpeed(VAL_TERTIARY, 20); - setHighwaySpeed(VAL_TERTIARY_LINK, 20); + setHighwaySpeed("primary", 22); + setHighwaySpeed("primary_link", 22); + setHighwaySpeed(VAL_SECONDARY, 24); + setHighwaySpeed(VAL_SECONDARY_LINK, 24); + setHighwaySpeed(VAL_TERTIARY, 26); + setHighwaySpeed(VAL_TERTIARY_LINK, 26); addPushingSection("path"); addPushingSection("footway"); @@ -152,20 +152,8 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, // REQUIRED ADDON OR OVERWRITE OF Default GH-RoadBikeProfile // created by MARQ24 //********************************************************************** - preferHighwayTags.remove(VAL_RESIDENTIAL); - preferHighwayTags.add(VAL_UNCLASSIFIED); // adjusted speeds... - setHighwaySpeed("trunk", 20); - setHighwaySpeed("trunk_link", 20); - setHighwaySpeed("primary", 22); - setHighwaySpeed("primary_link", 22); - setHighwaySpeed(VAL_SECONDARY, 24); - setHighwaySpeed(VAL_SECONDARY_LINK, 24); - setHighwaySpeed(VAL_TERTIARY, 26); - setHighwaySpeed(VAL_TERTIARY_LINK, 26); - setHighwaySpeed("road", 20); - setHighwaySpeed(VAL_UNCLASSIFIED, 20); setHighwaySpeed(VAL_RESIDENTIAL, new SpeedValue(18, UpdateType.DOWNGRADE_ONLY)); // make sure that we will avoid 'cycleway' & 'service' ways where ever From cc01d98b26f7c4cb1dcb4e90f4c416996c5bd903 Mon Sep 17 00:00:00 2001 From: Steven te Brinke Date: Sat, 1 Aug 2020 13:56:17 +0200 Subject: [PATCH 2/8] feat: allow surface types to downgrade only --- .../bike/CommonBikeFlagEncoder.java | 4 ++ .../bike/RoadBikeFlagEncoder.java | 53 ++++--------------- 2 files changed, 14 insertions(+), 43 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java index 25da77ddea..21e5bd2112 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java @@ -821,6 +821,10 @@ protected void setSurfaceSpeed(String surface, int speed) { surfaceSpeeds.put(surface, new SpeedValue(speed)); } + protected void setSurfaceSpeed(String surface, int speed, UpdateType type) { + surfaceSpeeds.put(surface, new SpeedValue(speed, type)); + } + protected void setSurfaceSpeed(String surface, SpeedValue speed) { surfaceSpeeds.put(surface, speed); } diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index f08021f310..55c2dbc91f 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -88,16 +88,16 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setTrackTypeSpeed("grade4", PUSHING_SECTION_SPEED); setTrackTypeSpeed("grade5", PUSHING_SECTION_SPEED); - setSurfaceSpeed("paved", 20); - setSurfaceSpeed("asphalt", 20); - setSurfaceSpeed("cobblestone", 10); - setSurfaceSpeed("cobblestone:flattened", 10); - setSurfaceSpeed("sett", 10); - setSurfaceSpeed("concrete", 20); - setSurfaceSpeed("concrete:lanes", 16); - setSurfaceSpeed("concrete:plates", 16); - setSurfaceSpeed("paving_stones", 10); - setSurfaceSpeed("paving_stones:30", 10); + setSurfaceSpeed("paved", 26, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("asphalt", 26, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("cobblestone", 10, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("cobblestone:flattened", 10, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("sett", 10, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("concrete", 26, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("concrete:lanes", 16, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("concrete:plates", 16, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("paving_stones", 10, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("paving_stones:30", 10, UpdateType.DOWNGRADE_ONLY); setSurfaceSpeed("unpaved", PUSHING_SECTION_SPEED / 2); setSurfaceSpeed("compacted", PUSHING_SECTION_SPEED / 2); setSurfaceSpeed("dirt", PUSHING_SECTION_SPEED / 2); @@ -147,44 +147,11 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setAvoidSpeedLimit(81); setSpecificClassBicycle("roadcycling"); - // MARQ24 MOD START - //********************************************************************** - // REQUIRED ADDON OR OVERWRITE OF Default GH-RoadBikeProfile - // created by MARQ24 - //********************************************************************** - - // adjusted speeds... - setHighwaySpeed(VAL_RESIDENTIAL, new SpeedValue(18, UpdateType.DOWNGRADE_ONLY)); - - // make sure that we will avoid 'cycleway' & 'service' ways where ever - // it is possible... - setHighwaySpeed("cycleway", new SpeedValue(8, UpdateType.DOWNGRADE_ONLY)); - setHighwaySpeed(VAL_SERVICE, new SpeedValue(8, UpdateType.DOWNGRADE_ONLY)); - - // overwriting also the SurfaceSpeeds... to the "max" of the residential speed - setSurfaceSpeed("paved", new SpeedValue(18, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("asphalt", new SpeedValue(18, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("concrete", new SpeedValue(18, UpdateType.UPGRADE_ONLY)); - - setSurfaceSpeed("concrete:lanes", new SpeedValue(16, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("concrete:plates", new SpeedValue(16, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("paving_stones", new SpeedValue(10, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("paving_stones:30", new SpeedValue(10, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("cobblestone", new SpeedValue(10, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("cobblestone:flattened", new SpeedValue(10, UpdateType.UPGRADE_ONLY)); - setSurfaceSpeed("sett", new SpeedValue(10, UpdateType.UPGRADE_ONLY)); - - // overwriting also the trackTypeSpeeds... to the "max" of the residential speed - setTrackTypeSpeed(VAL_GRADE_1, new SpeedValue(18, UpdateType.UPGRADE_ONLY)); - setTrackTypeSpeed("grade2", new SpeedValue(10, UpdateType.UPGRADE_ONLY)); - // HSW - asphalt cycleway vs asphalt roundabout // http://localhost:3035/directions?n1=51.965101&n2=8.24595&n3=18&a=51.965555,8.243968,51.964878,8.245057&b=1c&c=0&g1=-1&g2=0&h2=3&k1=en-US&k2=km // Aschloh roundabout vs cycleway (cycle relation) & service shortcut // http://localhost:3035/directions?n1=52.064701&n2=8.386386&n3=19&a=52.065407,8.386171,52.064821,8.386833&b=1c&c=0&g1=-1&g2=0&h2=3&k1=en-US&k2=km - LOGGER.info("NextGen RoadBike FlagEncoder is active..."); - // MARQ24 MOD END } public double getMeanSpeed() { From 17465371b43000037b16744cbdd2dd1ead500143 Mon Sep 17 00:00:00 2001 From: Steven te Brinke Date: Sat, 1 Aug 2020 14:20:51 +0200 Subject: [PATCH 3/8] docs: add road bike speed changes to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc959a620b..66b0af96a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ Releasing is documented in RELEASE.md ### Added ### Changed +- improve road bike average speeds to be faster on cycleways but slower on bad road surface or certain road types such as footways ([#2076](https://github.com/GIScience/openrouteservice/pull/2076)) ### Deprecated From 898fe692b9ee11a16eb1d3cb3da665d6fdefefb6 Mon Sep 17 00:00:00 2001 From: aoles Date: Mon, 7 Jul 2025 12:24:54 +0200 Subject: [PATCH 4/8] fix: ways tagged with `highway = road` use the same value as unclassified ways According to OSM wiki both `highway = unclassified` and `highway = road` are synonyms and can be used interchangeably as "The word 'unclassified' is a historical artefact of the UK road system and does not mean that the classification is unknown; you can use highway=road for that." --- .../extensions/flagencoders/bike/RoadBikeFlagEncoder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index 55c2dbc91f..b181e0ed8a 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -45,6 +45,7 @@ public class RoadBikeFlagEncoder extends CommonBikeFlagEncoder { public static final String VAL_SERVICE = "service"; public static final String VAL_UNCLASSIFIED = "unclassified"; public static final String VAL_HIGHWAY = "highway"; + public static final String VAL_ROAD = "road"; public RoadBikeFlagEncoder() { // MARQ24 MOD START @@ -75,7 +76,7 @@ public RoadBikeFlagEncoder(String propertiesStr) { public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, boolean considerElevation) { super(speedBits, speedFactor, maxTurnCosts, considerElevation); // MARQ24 MOD END - preferHighwayTags.add("road"); + preferHighwayTags.add(VAL_ROAD); preferHighwayTags.add(VAL_SECONDARY); preferHighwayTags.add(VAL_SECONDARY_LINK); preferHighwayTags.add(VAL_TERTIARY); @@ -119,7 +120,7 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setHighwaySpeed("path", 8); setHighwaySpeed("footway", 6); setHighwaySpeed("pedestrian", 6); - setHighwaySpeed("road", 12); + setHighwaySpeed(VAL_ROAD, 20); setHighwaySpeed(VAL_TRACK, PUSHING_SECTION_SPEED / 2); // assume unpaved setHighwaySpeed(VAL_SERVICE, 12); setHighwaySpeed(VAL_UNCLASSIFIED, 20); From 054a2078fb14e059e4c0498c57e023374bb9b007 Mon Sep 17 00:00:00 2001 From: aoles Date: Mon, 7 Jul 2025 17:57:25 +0200 Subject: [PATCH 5/8] fix: avoid ways shared with pedestrians in order to restore original road bike behaviour The first example with "asphalt cycleway vs asphalt roundabout" did not work as expected. --- .../extensions/flagencoders/bike/RoadBikeFlagEncoder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index b181e0ed8a..6289e1b448 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -116,7 +116,7 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setSurfaceSpeed("sand", PUSHING_SECTION_SPEED / 2); setSurfaceSpeed("wood", PUSHING_SECTION_SPEED / 2); - setHighwaySpeed("cycleway", 18); + setHighwaySpeed(KEY_CYCLEWAY, 18); setHighwaySpeed("path", 8); setHighwaySpeed("footway", 6); setHighwaySpeed("pedestrian", 6); @@ -173,6 +173,8 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap weight } else if (trackType == null || trackType.startsWith("grade")) { weightToPrioMap.put(110d, AVOID_AT_ALL_COSTS.getValue()); } + } else if (way.hasTag("foot", intendedValues)) { + weightToPrioMap.put(110d, AVOID_IF_POSSIBLE.getValue()); } } From 69e9f99c564d118923fb40899229e99fea3782fa Mon Sep 17 00:00:00 2001 From: aoles Date: Thu, 17 Jul 2025 00:52:45 +0200 Subject: [PATCH 6/8] feat: increase speed on living streets such that it matches the speed used by vehicle profiles The original "walking speed" of 6 km/h was unrealistically low for a road bike. --- .../extensions/flagencoders/bike/RoadBikeFlagEncoder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index 6289e1b448..d0d779adb6 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -117,6 +117,7 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setSurfaceSpeed("wood", PUSHING_SECTION_SPEED / 2); setHighwaySpeed(KEY_CYCLEWAY, 18); + setHighwaySpeed("living_street", 10); setHighwaySpeed("path", 8); setHighwaySpeed("footway", 6); setHighwaySpeed("pedestrian", 6); From 85aceebcbdd837e43238d2b5c8b6a4eb0c1fb7e1 Mon Sep 17 00:00:00 2001 From: Sascha Fendrich Date: Fri, 1 Aug 2025 13:45:28 +0200 Subject: [PATCH 7/8] refactor: replace reflection by polymorphism --- .../bike/CommonBikeFlagEncoder.java | 92 +++++++++---------- .../bike/RoadBikeFlagEncoder.java | 20 ++++ 2 files changed, 62 insertions(+), 50 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java index 21e5bd2112..a69014468f 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/CommonBikeFlagEncoder.java @@ -100,12 +100,7 @@ public abstract class CommonBikeFlagEncoder extends BikeCommonFlagEncoder { private static final boolean DEBUG_OUTPUT = false; FileWriter logWriter; - // MARQ24 MOD START - // MARQ24 ADDON in the case of the RoadBike Encoder we want to skip some - // conditions... - private final boolean isRoadBikeEncoder = this instanceof RoadBikeFlagEncoder; // TODO: design: parent class should not need to know of child protected static final Logger LOGGER = Logger.getLogger(CommonBikeFlagEncoder.class.getName()); - // MARQ24 MOD END // MARQ24 MOD START protected CommonBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts) { @@ -415,7 +410,7 @@ public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, EncodingManager.A if (!access.isFerry()) { wayTypeSpeed = applyMaxSpeed(way, wayTypeSpeed); handleSpeed(edgeFlags, way, wayTypeSpeed); - handleBikeRelated(edgeFlags, way, priorityFromRelation > UNCHANGED.getValue()); + handleBikeRelated(edgeFlags, way, isPartOfCycleRelation(priorityFromRelation)); if (access.isConditional() && conditionalAccessEncoder != null) conditionalAccessEncoder.setBool(false, edgeFlags, true); boolean isRoundabout = way.hasTag(KEY_JUNCTION, "roundabout") || way.hasTag(KEY_JUNCTION, "circular"); @@ -440,6 +435,10 @@ public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, EncodingManager.A return edgeFlags; } + protected boolean isPartOfCycleRelation(int priorityFromRelation) { + return priorityFromRelation > UNCHANGED.getValue(); + } + int getSpeed(ReaderWay way) { int speed = Integer.MIN_VALUE; String highwayTag = way.getTag(KEY_HIGHWAY); @@ -639,28 +638,7 @@ private PriorityCode convertClassValueToPriority(String tagvalue) { void collect(ReaderWay way, double wayTypeSpeed, TreeMap weightToPrioMap) { String service = way.getTag(KEY_SERVICE); String highway = way.getTag(KEY_HIGHWAY); - // MARQ24 MOD START - if (!isRoadBikeEncoder) { - // MARQ24 MOD END - // MARQ24 MOD START - if (way.hasTag(KEY_BICYCLE, KEY_DESIGNATED) || way.hasTag(KEY_BICYCLE, KEY_OFFICIAL) || way.hasTag(KEY_BICYCLE_ROAD, "yes")) { - // MARQ24 MOD END - if ("path".equals(highway)) { - weightToPrioMap.put(100d, VERY_NICE.getValue()); - } else { - weightToPrioMap.put(100d, PREFER.getValue()); - } - } - if (KEY_CYCLEWAY.equals(highway)) { - if (way.hasTag("foot", intendedValues) && !way.hasTag(KEY_SEGREGATED, "yes")) { - weightToPrioMap.put(100d, PREFER.getValue()); - } else { - weightToPrioMap.put(100d, VERY_NICE.getValue()); - } - } - // MARQ24 MOD START - } - // MARQ24 MOD END + handleDesignatedCyclingPriority(way, weightToPrioMap, highway); double maxSpeed = getMaxSpeed(way); if (preferHighwayTags.contains(highway) || this.isValidSpeed(maxSpeed) && maxSpeed <= 30) { @@ -679,27 +657,7 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap weight if (pushingSectionsHighways.contains(highway) || "parking_aisle".equals(service)) { - int pushingSectionPrio = AVOID_IF_POSSIBLE.getValue(); - // MARQ24 MOD START - if (!isRoadBikeEncoder) { - // MARQ24 MOD END - if (way.hasTag(KEY_BICYCLE, "use_sidepath") || way.hasTag(KEY_BICYCLE, "yes") || way.hasTag(KEY_BICYCLE, "permissive")) { - pushingSectionPrio = PREFER.getValue(); - } - if (way.hasTag(KEY_BICYCLE, KEY_DESIGNATED) || way.hasTag(KEY_BICYCLE, KEY_OFFICIAL)) { - pushingSectionPrio = VERY_NICE.getValue(); - } - // MARQ24 MOD START - } - // MARQ24 MOD END - - if (way.hasTag("foot", "yes")) { - pushingSectionPrio = Math.max(pushingSectionPrio - 1, WORST.getValue()); - if (!isRoadBikeEncoder && way.hasTag(KEY_SEGREGATED, "yes")) { - pushingSectionPrio = Math.min(pushingSectionPrio + 1, BEST.getValue()); - } - } - weightToPrioMap.put(100d, pushingSectionPrio); + handlePushingSectionPriority(way, weightToPrioMap); } if (way.hasTag(KEY_RAILWAY, "tram")) { @@ -724,6 +682,40 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap weight } } + protected void handlePushingSectionPriority(ReaderWay way, TreeMap weightToPrioMap) { + int pushingSectionPrio = AVOID_IF_POSSIBLE.getValue(); + if (way.hasTag(KEY_BICYCLE, "use_sidepath") || way.hasTag(KEY_BICYCLE, "yes") || way.hasTag(KEY_BICYCLE, "permissive")) { + pushingSectionPrio = PREFER.getValue(); + } + if (way.hasTag(KEY_BICYCLE, KEY_DESIGNATED) || way.hasTag(KEY_BICYCLE, KEY_OFFICIAL)) { + pushingSectionPrio = VERY_NICE.getValue(); + } + if (way.hasTag("foot", "yes")) { + pushingSectionPrio = Math.max(pushingSectionPrio - 1, WORST.getValue()); + if (way.hasTag(KEY_SEGREGATED, "yes")) { + pushingSectionPrio = Math.min(pushingSectionPrio + 1, BEST.getValue()); + } + } + weightToPrioMap.put(100d, pushingSectionPrio); + } + + protected void handleDesignatedCyclingPriority(ReaderWay way, TreeMap weightToPrioMap, String highway) { + if (way.hasTag(KEY_BICYCLE, KEY_DESIGNATED) || way.hasTag(KEY_BICYCLE, KEY_OFFICIAL) || way.hasTag(KEY_BICYCLE_ROAD, "yes")) { + if ("path".equals(highway)) { + weightToPrioMap.put(100d, VERY_NICE.getValue()); + } else { + weightToPrioMap.put(100d, PREFER.getValue()); + } + } + if (KEY_CYCLEWAY.equals(highway)) { + if (way.hasTag("foot", intendedValues) && !way.hasTag(KEY_SEGREGATED, "yes")) { + weightToPrioMap.put(100d, PREFER.getValue()); + } else { + weightToPrioMap.put(100d, VERY_NICE.getValue()); + } + } + } + /** * Handle surface and wayType encoding */ @@ -751,7 +743,7 @@ void handleBikeRelated(IntsRef edgeFlags, ReaderWay way, boolean partOfCycleRela wayType = WayType.PUSHING_SECTION; } else { // boost "none identified" partOfCycleRelation - if (!isRoadBikeEncoder && partOfCycleRelation) { + if (partOfCycleRelation) { wayType = WayType.CYCLEWAY; } diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index d0d779adb6..a07b39ee21 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -204,4 +204,24 @@ public String toString() { protected double getDownhillMaxSpeed() { return 60; } + + @Override + protected void handlePushingSectionPriority(ReaderWay way, TreeMap weightToPrioMap) { + int pushingSectionPrio = AVOID_IF_POSSIBLE.getValue(); + if (way.hasTag("foot", "yes")) { + pushingSectionPrio = Math.max(pushingSectionPrio - 1, WORST.getValue()); + } + weightToPrioMap.put(100d, pushingSectionPrio); + } + + @Override + protected void handleDesignatedCyclingPriority(ReaderWay way, TreeMap weightToPrioMap, String highway) { + // do nothing + } + + @Override + protected boolean isPartOfCycleRelation(int priorityFromRelation) { + return false; + } + } From f4fa4d4914c20cc6e9d64548415ec961ec5a7c66 Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 1 Aug 2025 16:53:51 +0200 Subject: [PATCH 8/8] fix: tweak road bike flag encoder in order to restore its desired behavior --- .../bike/RoadBikeFlagEncoder.java | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java index a07b39ee21..f664bffd78 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/bike/RoadBikeFlagEncoder.java @@ -23,7 +23,6 @@ import java.util.TreeMap; -import static com.graphhopper.routing.ev.RouteNetwork.LOCAL; import static org.heigit.ors.routing.graphhopper.extensions.util.PriorityCode.*; /** @@ -35,6 +34,7 @@ */ public class RoadBikeFlagEncoder extends CommonBikeFlagEncoder { private static final int MEAN_SPEED = 25; + protected static final int PAVED_WAY_SPEED = 20; public static final String VAL_SECONDARY = "secondary"; public static final String VAL_SECONDARY_LINK = "secondary_link"; public static final String VAL_TERTIARY = "tertiary"; @@ -83,22 +83,23 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, preferHighwayTags.add(VAL_TERTIARY_LINK); preferHighwayTags.add(VAL_UNCLASSIFIED); - setTrackTypeSpeed(VAL_GRADE_1, 20); // paved + setTrackTypeSpeed(VAL_GRADE_1, PAVED_WAY_SPEED); // paved setTrackTypeSpeed("grade2", 10); // now unpaved ... setTrackTypeSpeed("grade3", PUSHING_SECTION_SPEED); setTrackTypeSpeed("grade4", PUSHING_SECTION_SPEED); setTrackTypeSpeed("grade5", PUSHING_SECTION_SPEED); - setSurfaceSpeed("paved", 26, UpdateType.DOWNGRADE_ONLY); - setSurfaceSpeed("asphalt", 26, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("paved", PAVED_WAY_SPEED, UpdateType.UPGRADE_ONLY); + setSurfaceSpeed("asphalt", PAVED_WAY_SPEED, UpdateType.UPGRADE_ONLY); + setSurfaceSpeed("concrete", PAVED_WAY_SPEED, UpdateType.UPGRADE_ONLY); + setSurfaceSpeed("cobblestone", 10, UpdateType.DOWNGRADE_ONLY); setSurfaceSpeed("cobblestone:flattened", 10, UpdateType.DOWNGRADE_ONLY); setSurfaceSpeed("sett", 10, UpdateType.DOWNGRADE_ONLY); - setSurfaceSpeed("concrete", 26, UpdateType.DOWNGRADE_ONLY); setSurfaceSpeed("concrete:lanes", 16, UpdateType.DOWNGRADE_ONLY); setSurfaceSpeed("concrete:plates", 16, UpdateType.DOWNGRADE_ONLY); - setSurfaceSpeed("paving_stones", 10, UpdateType.DOWNGRADE_ONLY); - setSurfaceSpeed("paving_stones:30", 10, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("paving_stones", 12, UpdateType.DOWNGRADE_ONLY); + setSurfaceSpeed("paving_stones:30", 12, UpdateType.DOWNGRADE_ONLY); setSurfaceSpeed("unpaved", PUSHING_SECTION_SPEED / 2); setSurfaceSpeed("compacted", PUSHING_SECTION_SPEED / 2); setSurfaceSpeed("dirt", PUSHING_SECTION_SPEED / 2); @@ -116,16 +117,16 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, setSurfaceSpeed("sand", PUSHING_SECTION_SPEED / 2); setSurfaceSpeed("wood", PUSHING_SECTION_SPEED / 2); - setHighwaySpeed(KEY_CYCLEWAY, 18); + setHighwaySpeed(KEY_CYCLEWAY, new SpeedValue(18, UpdateType.DOWNGRADE_ONLY)); setHighwaySpeed("living_street", 10); setHighwaySpeed("path", 8); setHighwaySpeed("footway", 6); setHighwaySpeed("pedestrian", 6); - setHighwaySpeed(VAL_ROAD, 20); + setHighwaySpeed(VAL_ROAD, PAVED_WAY_SPEED); setHighwaySpeed(VAL_TRACK, PUSHING_SECTION_SPEED / 2); // assume unpaved setHighwaySpeed(VAL_SERVICE, 12); - setHighwaySpeed(VAL_UNCLASSIFIED, 20); - setHighwaySpeed(VAL_RESIDENTIAL, 18); + setHighwaySpeed(VAL_UNCLASSIFIED, PAVED_WAY_SPEED); + setHighwaySpeed(VAL_RESIDENTIAL, new SpeedValue(18, UpdateType.DOWNGRADE_ONLY)); setHighwaySpeed("trunk", 20); setHighwaySpeed("trunk_link", 20); @@ -142,18 +143,10 @@ public RoadBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, addPushingSection("steps"); addPushingSection(KEY_BRIDLEWAY); - routeMap.put(LOCAL, UNCHANGED.getValue()); - blockByDefaultBarriers.add("kissing_gate"); setAvoidSpeedLimit(81); setSpecificClassBicycle("roadcycling"); - - // HSW - asphalt cycleway vs asphalt roundabout - // http://localhost:3035/directions?n1=51.965101&n2=8.24595&n3=18&a=51.965555,8.243968,51.964878,8.245057&b=1c&c=0&g1=-1&g2=0&h2=3&k1=en-US&k2=km - - // Aschloh roundabout vs cycleway (cycle relation) & service shortcut - // http://localhost:3035/directions?n1=52.064701&n2=8.386386&n3=19&a=52.065407,8.386171,52.064821,8.386833&b=1c&c=0&g1=-1&g2=0&h2=3&k1=en-US&k2=km } public double getMeanSpeed() {