Skip to content

Commit c9495bc

Browse files
authored
Support ";" access delimiter for car access. (graphhopper#2655)
* Support ";" access delimiter for car access. One example is motor_vehicle = agricultural;forestry * Add support for ";" access delimiter for MotorcycleTagParser and road_access EV. * Move logic for access delimiter handling for ";" from RoadAccess into OSMRoadAccessParser * Fix for OSMRoadAccessParserTest
1 parent c9d85e6 commit c9495bc

File tree

7 files changed

+53
-15
lines changed

7 files changed

+53
-15
lines changed

core/src/main/java/com/graphhopper/routing/util/CarTagParser.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,14 @@ public WayAccess getAccess(ReaderWay way) {
195195

196196
// multiple restrictions needs special handling compared to foot and bike, see also motorcycle
197197
if (!firstValue.isEmpty()) {
198-
if (restrictedValues.contains(firstValue) && !getConditionalTagInspector().isRestrictedWayConditionallyPermitted(way))
199-
return WayAccess.CAN_SKIP;
200-
if (intendedValues.contains(firstValue))
201-
return WayAccess.WAY;
198+
String[] restrict = firstValue.split(";");
199+
boolean notConditionalyPermitted = !getConditionalTagInspector().isRestrictedWayConditionallyPermitted(way);
200+
for (String value: restrict) {
201+
if (restrictedValues.contains(value) && notConditionalyPermitted)
202+
return WayAccess.CAN_SKIP;
203+
if (intendedValues.contains(value))
204+
return WayAccess.WAY;
205+
}
202206
}
203207

204208
// do not drive street cars into fords

core/src/main/java/com/graphhopper/routing/util/MotorcycleTagParser.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,14 @@ public WayAccess getAccess(ReaderWay way) {
145145
return WayAccess.CAN_SKIP;
146146

147147
if (!firstValue.isEmpty()) {
148-
if (restrictedValues.contains(firstValue) && !getConditionalTagInspector().isRestrictedWayConditionallyPermitted(way))
149-
return WayAccess.CAN_SKIP;
150-
if (intendedValues.contains(firstValue))
151-
return WayAccess.WAY;
148+
String[] restrict = firstValue.split(";");
149+
boolean notConditionalyPermitted = !getConditionalTagInspector().isRestrictedWayConditionallyPermitted(way);
150+
for (String value: restrict) {
151+
if (restrictedValues.contains(value) && notConditionalyPermitted)
152+
return WayAccess.CAN_SKIP;
153+
if (intendedValues.contains(value))
154+
return WayAccess.WAY;
155+
}
152156
}
153157

154158
// do not drive street cars into fords

core/src/main/java/com/graphhopper/routing/util/parsers/OSMRoadAccessParser.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,15 @@ public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay readerWay, IntsRef rel
4343
RoadAccess accessValue = YES;
4444
RoadAccess tmpAccessValue;
4545
for (String restriction : restrictions) {
46-
tmpAccessValue = RoadAccess.find(readerWay.getTag(restriction, "yes"));
47-
if (tmpAccessValue != null && tmpAccessValue.ordinal() > accessValue.ordinal()) {
48-
accessValue = tmpAccessValue;
46+
String tagValue = readerWay.getTag(restriction);
47+
if (tagValue != null) {
48+
String[] complex = tagValue.split(";");
49+
for ( String simple: complex) {
50+
tmpAccessValue = RoadAccess.find(simple);
51+
if (tmpAccessValue != null && tmpAccessValue.ordinal() > accessValue.ordinal()) {
52+
accessValue = tmpAccessValue;
53+
}
54+
}
4955
}
5056
}
5157

core/src/test/java/com/graphhopper/reader/osm/conditional/ConditionalOSMTagInspectorTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ private static Set<String> getSampleRestrictedValues() {
4444
}
4545

4646
private static Set<String> getSamplePermissiveValues() {
47-
Set<String> restrictedValues = new HashSet<>();
48-
restrictedValues.add("yes");
49-
restrictedValues.add("permissive");
50-
return restrictedValues;
47+
Set<String> permissiveValues = new HashSet<>();
48+
permissiveValues.add("yes");
49+
permissiveValues.add("permissive");
50+
return permissiveValues;
5151
}
5252

5353
private static List<String> getSampleConditionalTags() {

core/src/test/java/com/graphhopper/routing/util/CarTagParserTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,19 @@ public void testAccess() {
111111
way.setTag("motor_vehicle", "no");
112112
assertTrue(parser.getAccess(way).canSkip());
113113

114+
way.clearTags();
115+
way.setTag("highway", "track");
116+
way.setTag("motor_vehicle", "agricultural");
117+
assertTrue(parser.getAccess(way).canSkip());
118+
way.setTag("motor_vehicle", "agricultural;forestry");
119+
assertTrue(parser.getAccess(way).canSkip());
120+
way.setTag("motor_vehicle", "forestry;agricultural");
121+
assertTrue(parser.getAccess(way).canSkip());
122+
way.setTag("motor_vehicle", "forestry;agricultural;unknown");
123+
assertTrue(parser.getAccess(way).canSkip());
124+
way.setTag("motor_vehicle", "yes;forestry;agricultural");
125+
assertTrue(parser.getAccess(way).isWay());
126+
114127
way.clearTags();
115128
way.setTag("highway", "service");
116129
way.setTag("access", "no");

core/src/test/java/com/graphhopper/routing/util/MotorcycleTagParserTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ public void testAccess() {
114114
way.setTag("access", "yes");
115115
way.setTag("motor_vehicle", "no");
116116
assertTrue(parser.getAccess(way).canSkip());
117+
way.setTag("motor_vehicle", "agricultural;forestry");
118+
assertTrue(parser.getAccess(way).canSkip());
117119

118120
way.clearTags();
119121
way.setTag("highway", "service");

core/src/test/java/com/graphhopper/routing/util/parsers/OSMRoadAccessParserTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ public RoadAccess getAccess(ReaderWay readerWay, TransportationMode transportati
5555
way.removeTag("country_rule");
5656
parser.handleWayTags(edgeFlags, way, relFlags);
5757
assertEquals(RoadAccess.YES, roadAccessEnc.getEnum(false, edgeFlags));
58+
59+
way.setTag("motor_vehicle", "agricultural;forestry");
60+
parser.handleWayTags(edgeFlags, way, relFlags);
61+
assertEquals(RoadAccess.AGRICULTURAL, roadAccessEnc.getEnum(false, edgeFlags));
62+
63+
way.setTag("motor_vehicle", "forestry;agricultural");
64+
parser.handleWayTags(edgeFlags, way, relFlags);
65+
assertEquals(RoadAccess.AGRICULTURAL, roadAccessEnc.getEnum(false, edgeFlags));
66+
5867
}
5968

6069
}

0 commit comments

Comments
 (0)