Skip to content

Commit d0b07b1

Browse files
committed
refactor: convert the binary flag "hazmat" into a separate encoded value
1 parent 3cdd2b9 commit d0b07b1

File tree

6 files changed

+76
-8
lines changed

6 files changed

+76
-8
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.graphhopper.routing.ev;
2+
3+
public class HazmatAccess {
4+
public static final String KEY = "hazmat_access";
5+
6+
private HazmatAccess() {
7+
// do not instantiate
8+
}
9+
10+
public static BooleanEncodedValue create() {
11+
return new SimpleBooleanEncodedValue(KEY, false);
12+
}
13+
}

ors-engine/src/main/java/org/heigit/ors/config/profile/BuildProperties.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ private void handleHeavyVehicle(ExtendedStorageProperties storage) {
139139
if (encodedValues.getHgvAccess() == null) {
140140
encodedValues.setHgvAccess(true);
141141
}
142+
if (encodedValues.getHazmatAccess() == null) {
143+
encodedValues.setHazmatAccess(true);
144+
}
142145
}
143146
private void handleWayCategory() {
144147
if (encodedValues.getHighway() == null) {

ors-engine/src/main/java/org/heigit/ors/config/profile/EncodedValuesProperties.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public class EncodedValuesProperties {
3939
private Boolean goodsAccess;
4040
@JsonProperty("hgv_access")
4141
private Boolean hgvAccess;
42+
@JsonProperty("hazmat_access")
43+
private Boolean hazmatAccess;
4244

4345
public EncodedValuesProperties() {
4446
}
@@ -52,7 +54,8 @@ public boolean isEmpty() {
5254
return osmWayId == null &&
5355
ford == null && highway == null &&
5456
waySurface == null && wayType == null &&
55-
agriculturalAccess == null && busAccess == null && deliveryAccess == null && forestryAccess == null && goodsAccess == null && hgvAccess == null;
57+
agriculturalAccess == null && busAccess == null && deliveryAccess == null && forestryAccess == null && goodsAccess == null && hgvAccess == null &&
58+
hazmatAccess == null;
5659
}
5760

5861
@JsonIgnore
@@ -91,6 +94,9 @@ public String toString() {
9194
if (Boolean.TRUE.equals(hgvAccess)) {
9295
out.add(HgvAccess.KEY);
9396
}
97+
if (Boolean.TRUE.equals(hazmatAccess)) {
98+
out.add(HazmatAccess.KEY);
99+
}
94100
return String.join(",", out);
95101
}
96102

@@ -106,6 +112,7 @@ public void merge(EncodedValuesProperties other) {
106112
forestryAccess = ofNullable(this.forestryAccess).orElse(other.forestryAccess);
107113
goodsAccess = ofNullable(this.goodsAccess).orElse(other.goodsAccess);
108114
hgvAccess = ofNullable(this.hgvAccess).orElse(other.hgvAccess);
115+
hazmatAccess = ofNullable(this.hazmatAccess).orElse(other.hazmatAccess);
109116
}
110117
}
111118

ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsTagParserFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public TagParser create(String name, PMap configuration) {
2727
case ForestryAccess.KEY -> new VehicleAccessParser(ForestryAccess.create(), HeavyVehicleAttributes.FORESTRY);
2828
case GoodsAccess.KEY -> new VehicleAccessParser(GoodsAccess.create(), HeavyVehicleAttributes.GOODS);
2929
case HgvAccess.KEY -> new VehicleAccessParser(HgvAccess.create(), HeavyVehicleAttributes.HGV);
30+
case HazmatAccess.KEY -> new HazmatAccessParser();
3031
default -> throw e;
3132
};
3233
}

ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/edgefilters/HeavyVehicleEdgeFilter.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class HeavyVehicleEdgeFilter implements EdgeFilter {
4343
private BooleanEncodedValue forestryAccessEnc = null;
4444
private BooleanEncodedValue goodsAccessEnc = null;
4545
private BooleanEncodedValue hgvAccessEnc = null;
46+
private BooleanEncodedValue hazmatAccessEnc = null;
47+
4648

4749
public HeavyVehicleEdgeFilter(int vehicleType, VehicleParameters vehicleParams, GraphHopperStorage graphStorage) {
4850
this(vehicleType, vehicleParams, GraphStorageUtils.getGraphExtension(graphStorage, HeavyVehicleAttributesGraphStorage.class));
@@ -59,6 +61,8 @@ public HeavyVehicleEdgeFilter(int vehicleType, VehicleParameters vehicleParams,
5961
goodsAccessEnc = encodingManager.getBooleanEncodedValue(GoodsAccess.KEY);
6062
if (encodingManager.hasEncodedValue(HgvAccess.KEY))
6163
hgvAccessEnc = encodingManager.getBooleanEncodedValue(HgvAccess.KEY);
64+
if (encodingManager.hasEncodedValue(HazmatAccess.KEY))
65+
hazmatAccessEnc = encodingManager.getBooleanEncodedValue(HazmatAccess.KEY);
6266
}
6367

6468
public HeavyVehicleEdgeFilter(int vehicleType, VehicleParameters vehicleParams, HeavyVehicleAttributesGraphStorage hgvStorage) {
@@ -105,12 +109,11 @@ public boolean accept(EdgeIteratorState iter) {
105109
if (!acceptVehicleType(iter))
106110
return false;
107111

108-
int edgeId = EdgeIteratorStateHelper.getOriginalEdge(iter);
109-
110-
if (hasHazmat && isVehicleType(gsHeavyVehicles.getEdgeVehicleType(edgeId), HeavyVehicleAttributes.HAZMAT)) {
112+
if (hasHazmat && !(hazmatAccessEnc == null || iter.get(hazmatAccessEnc)) ) {
111113
return false;
112114
}
113115

116+
int edgeId = EdgeIteratorStateHelper.getOriginalEdge(iter);
114117
if (restCount != 0) {
115118
if (restCount == 1) {
116119
double value = gsHeavyVehicles.getEdgeRestrictionValue(edgeId, indexValues[0]);
@@ -140,8 +143,4 @@ private boolean acceptVehicleType(EdgeIteratorState edge) {
140143
default -> true;
141144
};
142145
}
143-
144-
private boolean isVehicleType(int vt, int vehicleType) {
145-
return (vt & vehicleType) == vehicleType;
146-
}
147146
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package org.heigit.ors.routing.graphhopper.extensions.util.parsers;
2+
3+
import com.graphhopper.reader.ReaderWay;
4+
import com.graphhopper.routing.ev.*;
5+
import com.graphhopper.routing.util.parsers.TagParser;
6+
import com.graphhopper.storage.IntsRef;
7+
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.regex.Pattern;
11+
12+
public class HazmatAccessParser implements TagParser {
13+
private final BooleanEncodedValue hazmatAccessEnc;
14+
private final Pattern patternHazmat;
15+
16+
public HazmatAccessParser() {
17+
this(HazmatAccess.create());
18+
}
19+
20+
public HazmatAccessParser(BooleanEncodedValue hazmatAccessEnc) {
21+
this.hazmatAccessEnc = hazmatAccessEnc;
22+
patternHazmat = Pattern.compile("^hazmat(:[B-E])?$");
23+
}
24+
25+
@Override
26+
public void createEncodedValues(EncodedValueLookup encodedValueLookup, List<EncodedValue> list) {
27+
list.add(hazmatAccessEnc);
28+
}
29+
30+
@Override
31+
public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean b, IntsRef relationFlags) {
32+
boolean hasHazmatRestriction = way.getTags().entrySet().stream().anyMatch(this::isHazmatRestriction);
33+
34+
hazmatAccessEnc.setBool(false, edgeFlags, !hasHazmatRestriction);
35+
36+
return edgeFlags;
37+
}
38+
39+
private boolean isHazmatRestriction(Map.Entry<String, Object> entry) {
40+
String key = entry.getKey();
41+
String value = entry.getValue().toString();
42+
43+
return patternHazmat.matcher(key).matches() && "no".equals(value);
44+
}
45+
}

0 commit comments

Comments
 (0)