Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class AgriculturalAccess {
public static final String KEY = "agricultural_access";

private AgriculturalAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
13 changes: 13 additions & 0 deletions ors-engine/src/main/java/com/graphhopper/routing/ev/BusAccess.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class BusAccess {
public static final String KEY = "bus_access";

private BusAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class DeliveryAccess {
public static final String KEY = "delivery_access";

private DeliveryAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class ForestryAccess {
public static final String KEY = "forestry_access";

private ForestryAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class GoodsAccess {
public static final String KEY = "goods_access";

private GoodsAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class HazmatAccess {
public static final String KEY = "hazmat_access";

private HazmatAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
13 changes: 13 additions & 0 deletions ors-engine/src/main/java/com/graphhopper/routing/ev/HgvAccess.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.graphhopper.routing.ev;

public class HgvAccess {
public static final String KEY = "hgv_access";

private HgvAccess() {
// do not instantiate
}

public static BooleanEncodedValue create() {
return new SimpleBooleanEncodedValue(KEY, false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ public void initExtStorages() {
if (storage != null) {
ExtendedStorageName extendedStorageName = ExtendedStorageName.getEnum(key);
switch (extendedStorageName) {
case HEAVY_VEHICLE:
handleHeavyVehicle(storage);
break;
case OSM_ID:
if (encodedValues.getOsmWayId() == null) {
encodedValues.setOsmWayId(true);
Expand All @@ -114,6 +117,32 @@ public void initExtStorages() {
}
}

private void handleHeavyVehicle(ExtendedStorageProperties storage) {
if (storage.getRestrictions() != null && storage.getRestrictions()) {
//TODO: set encoded values for heavy vehicle restrictions
}
if (encodedValues.getAgriculturalAccess() == null) {
encodedValues.setAgriculturalAccess(true);
}
if (encodedValues.getBusAccess() == null) {
encodedValues.setBusAccess(true);
}
if (encodedValues.getDeliveryAccess() == null) {
encodedValues.setDeliveryAccess(true);
}
if (encodedValues.getForestryAccess() == null) {
encodedValues.setForestryAccess(true);
}
if (encodedValues.getGoodsAccess() == null) {
encodedValues.setGoodsAccess(true);
}
if (encodedValues.getHgvAccess() == null) {
encodedValues.setHgvAccess(true);
}
if (encodedValues.getHazmatAccess() == null) {
encodedValues.setHazmatAccess(true);
}
}
private void handleWayCategory() {
if (encodedValues.getHighway() == null) {
encodedValues.setHighway(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,20 @@ public class EncodedValuesProperties {
private Boolean waySurface;
@JsonProperty("way_type")
private Boolean wayType;
@JsonProperty("agricultural_access")
private Boolean agriculturalAccess;
@JsonProperty("bus_access")
private Boolean busAccess;
@JsonProperty("delivery_access")
private Boolean deliveryAccess;
@JsonProperty("forestry_access")
private Boolean forestryAccess;
@JsonProperty("goods_access")
private Boolean goodsAccess;
@JsonProperty("hgv_access")
private Boolean hgvAccess;
@JsonProperty("hazmat_access")
private Boolean hazmatAccess;

public EncodedValuesProperties() {
}
Expand All @@ -37,7 +51,11 @@ public EncodedValuesProperties(String ignored) {

@JsonIgnore
public boolean isEmpty() {
return osmWayId == null && ford == null && highway == null && waySurface == null && wayType == null;
return osmWayId == null &&
ford == null && highway == null &&
waySurface == null && wayType == null &&
agriculturalAccess == null && busAccess == null && deliveryAccess == null && forestryAccess == null && goodsAccess == null && hgvAccess == null &&
hazmatAccess == null;
}

@JsonIgnore
Expand All @@ -58,6 +76,27 @@ public String toString() {
if (Boolean.TRUE.equals(wayType)) {
out.add(WayType.KEY);
}
if (Boolean.TRUE.equals(agriculturalAccess)) {
out.add(AgriculturalAccess.KEY);
}
if (Boolean.TRUE.equals(busAccess)) {
out.add(BusAccess.KEY);
}
if (Boolean.TRUE.equals(deliveryAccess)) {
out.add(DeliveryAccess.KEY);
}
if (Boolean.TRUE.equals(forestryAccess)) {
out.add(ForestryAccess.KEY);
}
if (Boolean.TRUE.equals(goodsAccess)) {
out.add(GoodsAccess.KEY);
}
if (Boolean.TRUE.equals(hgvAccess)) {
out.add(HgvAccess.KEY);
}
if (Boolean.TRUE.equals(hazmatAccess)) {
out.add(HazmatAccess.KEY);
}
return String.join(",", out);
}

Expand All @@ -67,6 +106,13 @@ public void merge(EncodedValuesProperties other) {
osmWayId = ofNullable(this.osmWayId).orElse(other.osmWayId);
waySurface = ofNullable(this.waySurface).orElse(other.waySurface);
wayType = ofNullable(this.wayType).orElse(other.wayType);
agriculturalAccess = ofNullable(this.agriculturalAccess).orElse(other.agriculturalAccess);
busAccess = ofNullable(this.busAccess).orElse(other.busAccess);
deliveryAccess = ofNullable(this.deliveryAccess).orElse(other.deliveryAccess);
forestryAccess = ofNullable(this.forestryAccess).orElse(other.forestryAccess);
goodsAccess = ofNullable(this.goodsAccess).orElse(other.goodsAccess);
hgvAccess = ofNullable(this.hgvAccess).orElse(other.hgvAccess);
hazmatAccess = ofNullable(this.hazmatAccess).orElse(other.hazmatAccess);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
import org.heigit.ors.routing.graphhopper.extensions.flagencoders.FlagEncoderNames;
import org.heigit.ors.routing.graphhopper.extensions.manage.ORSGraphManager;
import org.heigit.ors.routing.graphhopper.extensions.storages.GraphStorageUtils;
import org.heigit.ors.routing.graphhopper.extensions.storages.HeavyVehicleAttributesGraphStorage;
import org.heigit.ors.routing.graphhopper.extensions.storages.TrafficGraphStorage;
import org.heigit.ors.routing.graphhopper.extensions.storages.builders.GraphStorageBuilder;
import org.heigit.ors.routing.graphhopper.extensions.storages.builders.HereTrafficGraphStorageBuilder;
Expand Down Expand Up @@ -447,8 +446,7 @@ protected void initCHPreparationHandler() {
Weighting weighting = createWeighting(profile, new PMap());

if (profile.getVehicle().equals(FlagEncoderNames.HEAVYVEHICLE)) {
HeavyVehicleAttributesGraphStorage hgvStorage = GraphStorageUtils.getGraphExtension(getGraphHopperStorage(), HeavyVehicleAttributesGraphStorage.class);
EdgeFilter hgvEdgeFilter = new HeavyVehicleEdgeFilter(HeavyVehicleAttributes.HGV, null, hgvStorage);
EdgeFilter hgvEdgeFilter = new HeavyVehicleEdgeFilter(HeavyVehicleAttributes.HGV, null, getGraphHopperStorage());
weighting = new HgvAccessWeighting(weighting, hgvEdgeFilter);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ public TagParser create(String name, PMap configuration) {
case OsmWayId.KEY -> new OsmWayIdParser();
case WaySurface.KEY -> new WaySurfaceParser();
case WayType.KEY -> new WayTypeParser();
case AgriculturalAccess.KEY -> new VehicleAccessParser(AgriculturalAccess.create(), HeavyVehicleAttributes.AGRICULTURE);
case BusAccess.KEY -> new VehicleAccessParser(BusAccess.create(), HeavyVehicleAttributes.BUS);
case DeliveryAccess.KEY -> new VehicleAccessParser(DeliveryAccess.create(), HeavyVehicleAttributes.DELIVERY);
case ForestryAccess.KEY -> new VehicleAccessParser(ForestryAccess.create(), HeavyVehicleAttributes.FORESTRY);
case GoodsAccess.KEY -> new VehicleAccessParser(GoodsAccess.create(), HeavyVehicleAttributes.GOODS);
case HgvAccess.KEY -> new VehicleAccessParser(HgvAccess.create(), HeavyVehicleAttributes.HGV);
case HazmatAccess.KEY -> new HazmatAccessParser();
default -> throw e;
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
*/
package org.heigit.ors.routing.graphhopper.extensions.edgefilters;

import com.graphhopper.routing.ev.*;
import com.graphhopper.routing.querygraph.EdgeIteratorStateHelper;
import com.graphhopper.routing.util.EdgeFilter;
import com.graphhopper.storage.GraphHopperStorage;
Expand All @@ -36,8 +37,32 @@ public class HeavyVehicleEdgeFilter implements EdgeFilter {
private final Integer[] indexLocs;
private final int restCount;

private BooleanEncodedValue agriculturalAccessEnc = null;
private BooleanEncodedValue busAccessEnc = null;
private BooleanEncodedValue deliveryAccessEnc = null;
private BooleanEncodedValue forestryAccessEnc = null;
private BooleanEncodedValue goodsAccessEnc = null;
private BooleanEncodedValue hgvAccessEnc = null;
private BooleanEncodedValue hazmatAccessEnc = null;


public HeavyVehicleEdgeFilter(int vehicleType, VehicleParameters vehicleParams, GraphHopperStorage graphStorage) {
this(vehicleType, vehicleParams, GraphStorageUtils.getGraphExtension(graphStorage, HeavyVehicleAttributesGraphStorage.class));
var encodingManager = graphStorage.getEncodingManager();
if (encodingManager.hasEncodedValue(AgriculturalAccess.KEY))
agriculturalAccessEnc = encodingManager.getBooleanEncodedValue(AgriculturalAccess.KEY);
if (encodingManager.hasEncodedValue(BusAccess.KEY))
busAccessEnc = encodingManager.getBooleanEncodedValue(BusAccess.KEY);
if (encodingManager.hasEncodedValue(DeliveryAccess.KEY))
deliveryAccessEnc = encodingManager.getBooleanEncodedValue(DeliveryAccess.KEY);
if (encodingManager.hasEncodedValue(ForestryAccess.KEY))
forestryAccessEnc = encodingManager.getBooleanEncodedValue(ForestryAccess.KEY);
if (encodingManager.hasEncodedValue(GoodsAccess.KEY))
goodsAccessEnc = encodingManager.getBooleanEncodedValue(GoodsAccess.KEY);
if (encodingManager.hasEncodedValue(HgvAccess.KEY))
hgvAccessEnc = encodingManager.getBooleanEncodedValue(HgvAccess.KEY);
if (encodingManager.hasEncodedValue(HazmatAccess.KEY))
hazmatAccessEnc = encodingManager.getBooleanEncodedValue(HazmatAccess.KEY);
}

public HeavyVehicleEdgeFilter(int vehicleType, VehicleParameters vehicleParams, HeavyVehicleAttributesGraphStorage hgvStorage) {
Expand Down Expand Up @@ -80,19 +105,15 @@ public HeavyVehicleEdgeFilter(int vehicleType, VehicleParameters vehicleParams,

@Override
public boolean accept(EdgeIteratorState iter) {
int edgeId = EdgeIteratorStateHelper.getOriginalEdge(iter);

int vt = gsHeavyVehicles.getEdgeVehicleType(edgeId);

// access restriction for to the given vehicle type
if (vt != HeavyVehicleAttributes.UNKNOWN && isVehicleType(vt, vehicleType)) {
return false;
}
// test access restrictions for the given vehicle type
if (!acceptVehicleType(iter))
return false;

if (hasHazmat && isVehicleType(vt, HeavyVehicleAttributes.HAZMAT)) {
if (hasHazmat && !(hazmatAccessEnc == null || iter.get(hazmatAccessEnc)) ) {
return false;
}

int edgeId = EdgeIteratorStateHelper.getOriginalEdge(iter);
if (restCount != 0) {
if (restCount == 1) {
double value = gsHeavyVehicles.getEdgeRestrictionValue(edgeId, indexValues[0]);
Expand All @@ -111,7 +132,15 @@ public boolean accept(EdgeIteratorState iter) {
return true;
}

private boolean isVehicleType(int vt, int vehicleType) {
return (vt & vehicleType) == vehicleType;
private boolean acceptVehicleType(EdgeIteratorState edge) {
return switch (vehicleType) {
case HeavyVehicleAttributes.AGRICULTURE -> agriculturalAccessEnc == null || edge.get(agriculturalAccessEnc);
case HeavyVehicleAttributes.BUS -> busAccessEnc == null || edge.get(busAccessEnc);
case HeavyVehicleAttributes.DELIVERY -> deliveryAccessEnc == null || edge.get(deliveryAccessEnc);
case HeavyVehicleAttributes.FORESTRY -> forestryAccessEnc == null || edge.get(forestryAccessEnc);
case HeavyVehicleAttributes.GOODS -> goodsAccessEnc == null || edge.get(goodsAccessEnc);
case HeavyVehicleAttributes.HGV -> hgvAccessEnc == null || edge.get(hgvAccessEnc);
default -> true;
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.heigit.ors.routing.graphhopper.extensions.util.parsers;

import com.graphhopper.reader.ReaderWay;
import com.graphhopper.routing.ev.*;
import com.graphhopper.routing.util.parsers.TagParser;
import com.graphhopper.storage.IntsRef;

import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

public class HazmatAccessParser implements TagParser {
private final BooleanEncodedValue hazmatAccessEnc;
private final Pattern patternHazmat;

public HazmatAccessParser() {
this(HazmatAccess.create());
}

public HazmatAccessParser(BooleanEncodedValue hazmatAccessEnc) {
this.hazmatAccessEnc = hazmatAccessEnc;
patternHazmat = Pattern.compile("^hazmat(:[B-E])?$");
}

@Override
public void createEncodedValues(EncodedValueLookup encodedValueLookup, List<EncodedValue> list) {
list.add(hazmatAccessEnc);
}

@Override
public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean b, IntsRef relationFlags) {
boolean hasHazmatRestriction = way.getTags().entrySet().stream().anyMatch(this::isHazmatRestriction);

hazmatAccessEnc.setBool(false, edgeFlags, !hasHazmatRestriction);

return edgeFlags;
}

private boolean isHazmatRestriction(Map.Entry<String, Object> entry) {
String key = entry.getKey();
String value = entry.getValue().toString();

return patternHazmat.matcher(key).matches() && "no".equals(value);
}
}
Loading
Loading