BordersExtractor.java
package org.heigit.ors.routing.pathprocessors;
import org.heigit.ors.routing.graphhopper.extensions.storages.BordersGraphStorage;
import java.util.List;
public class BordersExtractor {
public enum Avoid {CONTROLLED, NONE, ALL}
private final BordersGraphStorage storage;
private final int[] avoidCountries;
public BordersExtractor(BordersGraphStorage storage, int[] avoidCountries) {
this.storage = storage;
this.avoidCountries = avoidCountries;
}
public int getValue(int edgeId) {
// Get the type of border
return storage.getEdgeValue(edgeId, BordersGraphStorage.Property.TYPE);
}
public boolean isBorder(int edgeId) {
int type = storage.getEdgeValue(edgeId, BordersGraphStorage.Property.TYPE);
return (type == BordersGraphStorage.OPEN_BORDER || type == BordersGraphStorage.CONTROLLED_BORDER);
}
public boolean isControlledBorder(int edgeId) {
return storage.getEdgeValue(edgeId, BordersGraphStorage.Property.TYPE) == BordersGraphStorage.CONTROLLED_BORDER;
}
public boolean isOpenBorder(int edgeId) {
return storage.getEdgeValue(edgeId, BordersGraphStorage.Property.TYPE) == BordersGraphStorage.OPEN_BORDER;
}
public boolean restrictedCountry(int edgeId) {
int startCountry = storage.getEdgeValue(edgeId, BordersGraphStorage.Property.START);
int endCountry = storage.getEdgeValue(edgeId, BordersGraphStorage.Property.END);
for (int i = 0; i < avoidCountries.length; i++) {
if (startCountry == avoidCountries[i] || endCountry == avoidCountries[i]) {
return true;
}
}
return false;
}
/**
* Check whether the start and end nodes of a list of edges are in the same country.
*
* @param edgeIds Edges that the country should be checked for
* @return true if at least one node is in the same country
*/
public boolean isSameCountry(List<Integer> edgeIds) {
if (edgeIds.isEmpty())
return true;
short country0 = storage.getEdgeValue(edgeIds.get(0), BordersGraphStorage.Property.START);
short country1 = storage.getEdgeValue(edgeIds.get(0), BordersGraphStorage.Property.END);
for (int edgeId : edgeIds) {
short country2 = storage.getEdgeValue(edgeId, BordersGraphStorage.Property.START);
short country3 = storage.getEdgeValue(edgeId, BordersGraphStorage.Property.END);
if (country0 != country2
&& country0 != country3
&& country1 != country2
&& country1 != country3)
return false;
}
return true;
}
}