diff --git a/CHANGELOG.md b/CHANGELOG.md index 71497b4e36..4faaa1a9e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ RELEASING: ### Deprecated ### Removed ### Fixed +- access to roads where transporting hazardous materials is forbidden ([#1853](https://github.com/GIScience/openrouteservice/pull/1853)) ### Security ## [8.1.3] - 2024-09-13 diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/edgefilters/HeavyVehicleEdgeFilter.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/edgefilters/HeavyVehicleEdgeFilter.java index e78ee46ab3..b6cf2a9dc6 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/edgefilters/HeavyVehicleEdgeFilter.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/edgefilters/HeavyVehicleEdgeFilter.java @@ -130,9 +130,9 @@ public void setDestinationEdge(EdgeIteratorState edge, Graph graph, FlagEncoder if (!destinationEdges.contains(EdgeIteratorStateHelper.getOriginalEdge(edge))) { int vt = gsHeavyVehicles.getEdgeVehicleType(EdgeIteratorStateHelper.getOriginalEdge(edge), buffer); - boolean dstFlag = buffer[1] != 0; // ((buffer[1] >> (vehicleType >> 1)) & 1) == 1 + boolean dstFlag = buffer[1] != 0; - if (((vt & vehicleType) == vehicleType) && (dstFlag)) + if (isVehicleType(vt, vehicleType) && (dstFlag)) destinationEdges.add(EdgeIteratorStateHelper.getOriginalEdge(edge)); } @@ -148,22 +148,22 @@ public boolean accept(EdgeIteratorState iter) { int edgeId = EdgeIteratorStateHelper.getOriginalEdge(iter); int vt = gsHeavyVehicles.getEdgeVehicleType(edgeId, buffer); - boolean dstFlag = buffer[1] != 0; // ((buffer[1] >> (vehicleType >> 1)) & 1) == 1 + boolean dstFlag = buffer[1] != 0; // if edge has some restrictions if (vt != HeavyVehicleAttributes.UNKNOWN) { if (mode == MODE_CLOSEST_EDGE) { // current vehicle type is not forbidden - boolean edgeRestricted = ((vt & vehicleType) == vehicleType); + boolean edgeRestricted = isVehicleType(vt, vehicleType); if ((edgeRestricted || dstFlag) && buffer[1] != vehicleType) return false; } else if (mode == MODE_DESTINATION_EDGES) { // Here we are looking for all edges that have destination - return dstFlag && ((vt & vehicleType) == vehicleType); + return dstFlag && isVehicleType(vt, vehicleType); } else { // Check an edge with destination attribute if (dstFlag) { - if ((vt & vehicleType) == vehicleType) { + if (isVehicleType(vt, vehicleType)) { if (destinationEdges != null) { if (!destinationEdges.contains(edgeId)) return false; @@ -171,7 +171,7 @@ public boolean accept(EdgeIteratorState iter) { return false; } else return false; - } else if ((vt & vehicleType) == vehicleType) + } else if (isVehicleType(vt, vehicleType)) return false; } } else { @@ -180,7 +180,7 @@ public boolean accept(EdgeIteratorState iter) { } } - if (hasHazmat && (vt & HeavyVehicleAttributes.HAZMAT) != 0) { + if (hasHazmat && isVehicleType(vt, HeavyVehicleAttributes.HAZMAT)) { return false; } @@ -201,4 +201,8 @@ public boolean accept(EdgeIteratorState iter) { } return true; } + + private boolean isVehicleType(int vt, int vehicleType) { + return (vt & vehicleType) == vehicleType; + } } diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java index 95e8b9f1ae..7007f3c0c7 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java @@ -135,11 +135,11 @@ public boolean getEdgeRestrictionValues(int edgeId, double[] retValues) { public int getEdgeVehicleType(int edgeId, byte[] buffer) { long edgeBase = (long) edgeId * edgeEntryBytes; - orsEdges.getBytes(edgeBase + efVehicleType, buffer, 2); + orsEdges.getBytes(edgeBase + efVehicleType, buffer, 1); int result = buffer[0]; if (result < 0) - result = (byte) (result & 0xff); + result = result & 0xFF; return result; }