diff --git a/core/src/main/java/com/graphhopper/routing/util/BikeCommonTagParser.java b/core/src/main/java/com/graphhopper/routing/util/BikeCommonTagParser.java index 06212ff5482..73abc35df35 100644 --- a/core/src/main/java/com/graphhopper/routing/util/BikeCommonTagParser.java +++ b/core/src/main/java/com/graphhopper/routing/util/BikeCommonTagParser.java @@ -504,11 +504,13 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap weight } protected void handleAccess(IntsRef edgeFlags, ReaderWay way) { - // handle oneways - // oneway=-1 requires special handling + // handle oneways. The value -1 means it is a oneway but for reverse direction of stored geometry. + // The tagging oneway:bicycle=no or cycleway:right:oneway=no or cycleway:left:oneway=no lifts the generic oneway restriction of the way for bike boolean isOneway = way.hasTag("oneway", oneways) && !way.hasTag("oneway", "-1") && !way.hasTag("bicycle:backward", intendedValues) || way.hasTag("oneway", "-1") && !way.hasTag("bicycle:forward", intendedValues) || way.hasTag("oneway:bicycle", oneways) + || way.hasTag("cycleway:left:oneway", oneways) + || way.hasTag("cycleway:right:oneway", oneways) || way.hasTag("vehicle:backward", restrictedValues) && !way.hasTag("bicycle:forward", intendedValues) || way.hasTag("vehicle:forward", restrictedValues) && !way.hasTag("bicycle:backward", intendedValues) || way.hasTag("bicycle:forward", restrictedValues) @@ -519,10 +521,12 @@ protected void handleAccess(IntsRef edgeFlags, ReaderWay way) { && !way.hasTag("cycleway", oppositeLanes) && !way.hasTag("cycleway:left", oppositeLanes) && !way.hasTag("cycleway:right", oppositeLanes) - && !way.hasTag("cycleway:left:oneway", "-1") - && !way.hasTag("cycleway:right:oneway", "-1")) { + && !way.hasTag("cycleway:left:oneway", "no") + && !way.hasTag("cycleway:right:oneway", "no")) { boolean isBackward = way.hasTag("oneway", "-1") || way.hasTag("oneway:bicycle", "-1") + || way.hasTag("cycleway:left:oneway", "-1") + || way.hasTag("cycleway:right:oneway", "-1") || way.hasTag("vehicle:forward", restrictedValues) || way.hasTag("bicycle:forward", restrictedValues); accessEnc.setBool(isBackward, edgeFlags, true); diff --git a/core/src/test/java/com/graphhopper/routing/util/BikeTagParserTest.java b/core/src/test/java/com/graphhopper/routing/util/BikeTagParserTest.java index bb17e4168d9..2cdd3ebe353 100644 --- a/core/src/test/java/com/graphhopper/routing/util/BikeTagParserTest.java +++ b/core/src/test/java/com/graphhopper/routing/util/BikeTagParserTest.java @@ -390,6 +390,37 @@ public void testOneway() { assertTrue(parser.getAccessEnc().getBool(false, flags)); assertFalse(parser.getAccessEnc().getBool(true, flags)); way.clearTags(); + way.setTag("highway", "tertiary"); + way.setTag("oneway", "yes"); + way.setTag("oneway:bicycle", "no"); + flags = parser.handleWayTags(encodingManager.createEdgeFlags(), way); + assertTrue(parser.getAccessEnc().getBool(false, flags)); + assertTrue(parser.getAccessEnc().getBool(true, flags)); + way.clearTags(); + + way.setTag("highway", "tertiary"); + way.setTag("oneway", "yes"); + way.setTag("oneway:bicycle", "-1"); + flags = parser.handleWayTags(encodingManager.createEdgeFlags(), way); + assertFalse(parser.getAccessEnc().getBool(false, flags)); + assertTrue(parser.getAccessEnc().getBool(true, flags)); + way.clearTags(); + + way.setTag("highway", "tertiary"); + way.setTag("oneway", "yes"); + way.setTag("cycleway:right:oneway", "no"); + flags = parser.handleWayTags(encodingManager.createEdgeFlags(), way); + assertTrue(parser.getAccessEnc().getBool(false, flags)); + assertTrue(parser.getAccessEnc().getBool(true, flags)); + way.clearTags(); + + way.setTag("highway", "tertiary"); + way.setTag("oneway", "yes"); + way.setTag("cycleway:right:oneway", "-1"); + flags = parser.handleWayTags(encodingManager.createEdgeFlags(), way); + assertFalse(parser.getAccessEnc().getBool(false, flags)); + assertTrue(parser.getAccessEnc().getBool(true, flags)); + way.clearTags(); way.setTag("highway", "tertiary"); flags = parser.handleWayTags(encodingManager.createEdgeFlags(), way);