Commit 4173f2cc authored by Julian Zobel's avatar Julian Zobel Committed by Julian Zobel
Browse files

Update of GraphHopper Routing API to allow the blockager of paths and areas.


(cherry picked from commit 40a16a77)
parent 5e563801
...@@ -103,10 +103,22 @@ ...@@ -103,10 +103,22 @@
</repository> </repository>
<!-- uk maven central, since the local central server is slow as hell --> <!-- uk maven central, since the local central server is slow as hell -->
<!--
<repository> <repository>
<id>uk.maven.org</id> <id>uk.maven.org</id>
<url>http://uk.maven.org/maven2</url> <url>http://uk.maven.org/maven2</url>
</repository> </repository>
-->
<repository>
<id>Google Maven Central</id>
<url>https://maven-central.storage.googleapis.com/repos/central/data/</url>
<snapshots>
<updatePolicy>always</updatePolicy>
</snapshots>
<releases>
<updatePolicy>always</updatePolicy>
</releases>
</repository>
...@@ -349,10 +361,11 @@ ...@@ -349,10 +361,11 @@
<artifactId>jung-samples</artifactId> <version>2.0.1</version> </dependency> --> <artifactId>jung-samples</artifactId> <version>2.0.1</version> </dependency> -->
<!-- OSM-Data for movement models --> <!-- OSM-Data for movement models -->
<!--
<dependency> <dependency>
<groupId>com.graphhopper</groupId> <groupId>com.graphhopper</groupId>
<artifactId>graphhopper</artifactId> <artifactId>graphhopper</artifactId>
<version>0.7.0</version> <version>0.8.0</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
...@@ -360,7 +373,19 @@ ...@@ -360,7 +373,19 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
-->
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-core</artifactId>
<version>0.13.0</version>
</dependency>
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-reader-osm</artifactId>
<version>0.13.0</version>
</dependency>
<!-- Json (used for OSM-Movement-Model) --> <!-- Json (used for OSM-Movement-Model) -->
<dependency> <dependency>
<groupId>org.json</groupId> <groupId>org.json</groupId>
......
...@@ -32,15 +32,18 @@ import com.graphhopper.GHRequest; ...@@ -32,15 +32,18 @@ import com.graphhopper.GHRequest;
import com.graphhopper.GHResponse; import com.graphhopper.GHResponse;
import com.graphhopper.GraphHopper; import com.graphhopper.GraphHopper;
import com.graphhopper.PathWrapper; import com.graphhopper.PathWrapper;
import com.graphhopper.reader.osm.GraphHopperOSM;
import com.graphhopper.routing.util.EdgeFilter; import com.graphhopper.routing.util.EdgeFilter;
import com.graphhopper.routing.util.EncodingManager; import com.graphhopper.routing.util.EncodingManager;
import com.graphhopper.routing.util.TraversalMode; import com.graphhopper.routing.util.TraversalMode;
import com.graphhopper.routing.weighting.BlockAreaWeighting;
import com.graphhopper.storage.index.LocationIndex; import com.graphhopper.storage.index.LocationIndex;
import com.graphhopper.storage.index.QueryResult; import com.graphhopper.storage.index.QueryResult;
import com.graphhopper.util.DistanceCalc2D; import com.graphhopper.util.DistanceCalc2D;
import com.graphhopper.util.EdgeIteratorState; import com.graphhopper.util.EdgeIteratorState;
import com.graphhopper.util.Instruction; import com.graphhopper.util.Instruction;
import com.graphhopper.util.InstructionList; import com.graphhopper.util.InstructionList;
import com.graphhopper.util.Parameters.Routing;
import com.graphhopper.util.PointList; import com.graphhopper.util.PointList;
import com.graphhopper.util.shapes.GHPoint; import com.graphhopper.util.shapes.GHPoint;
...@@ -55,6 +58,7 @@ import de.tudarmstadt.maki.simonstrator.api.Binder; ...@@ -55,6 +58,7 @@ import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Monitor; import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level; import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException; import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/** /**
* This movement strategy uses the data from osm and navigates the nodes throught streets to the destination * This movement strategy uses the data from osm and navigates the nodes throught streets to the destination
...@@ -81,6 +85,7 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -81,6 +85,7 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
private String movementType; //car, bike or foot private String movementType; //car, bike or foot
private String defaultMovement; private String defaultMovement;
private String navigationalType; //fastest, private String navigationalType; //fastest,
private String blockedAreas; // default null
private static double latLower; //Values from -90 to 90; always smaller than latUpper private static double latLower; //Values from -90 to 90; always smaller than latUpper
private static double latUpper; //Values from -90 to 90 private static double latUpper; //Values from -90 to 90
private static double lonLeft; //Values from -180 to 180; Always smaller than lonRight private static double lonLeft; //Values from -180 to 180; Always smaller than lonRight
...@@ -93,6 +98,12 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -93,6 +98,12 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
*/ */
private double tolerance = 1; private double tolerance = 1;
@XMLConfigurableConstructor({"blockedAreas"})
public RealWorldStreetsMovement(String blockedAreas) {
this();
this.setBlockedAreas(blockedAreas);
}
public RealWorldStreetsMovement() { public RealWorldStreetsMovement() {
worldDimensions = Binder.getComponentOrNull(Topology.class) worldDimensions = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions(); .getWorldDimensions();
...@@ -100,13 +111,12 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -100,13 +111,12 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
latUpper = GPSCalculation.getLatUpper(); latUpper = GPSCalculation.getLatUpper();
lonLeft = GPSCalculation.getLonLeft(); lonLeft = GPSCalculation.getLonLeft();
lonRight = GPSCalculation.getLonRight(); lonRight = GPSCalculation.getLonRight();
} }
private void init() { private void init() {
hopper = new GraphHopper().forServer(); hopper = new GraphHopperOSM().forServer();
hopper.setOSMFile(osmFileLocation); hopper.setDataReaderFile(osmFileLocation);
// where to store graphhopper files? // where to store graphhopper files?
if (uniqueFolders) { if (uniqueFolders) {
Monitor.log(RealWorldStreetsMovement.class, Level.WARN, Monitor.log(RealWorldStreetsMovement.class, Level.WARN,
...@@ -118,12 +128,27 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -118,12 +128,27 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
hopper.setGraphHopperLocation(graphFolderFiles + "/" hopper.setGraphHopperLocation(graphFolderFiles + "/"
+ osmFileLocation.hashCode() + movementType); + osmFileLocation.hashCode() + movementType);
} }
hopper.setEncodingManager(new EncodingManager(movementType)); hopper.setEncodingManager(EncodingManager.create(movementType));
hopper.importOrLoad();
// if we have blocked areas defined, the CH in Graphhopper needs to be disabled!
// this also requires a new import
if(blockedAreas != null && !blockedAreas.isEmpty()) {
hopper.setCHEnabled(false);
}
// try to load a cached import. If the cached import was with a different CH_ENABLED setting then now specified, this will fail.
// in this case, clean cache and re-import.
try {
hopper.importOrLoad();
} catch (Exception e) {
System.err.println("[RealWorldStreetMovement] GraphHopper graph file must be imported again!");
hopper.clean();
hopper.importOrLoad();
}
index = hopper.getLocationIndex(); index = hopper.getLocationIndex();
init = true; init = true;
} }
@Override @Override
public Either<PositionVector, Boolean> nextPosition( public Either<PositionVector, Boolean> nextPosition(
...@@ -168,7 +193,15 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -168,7 +193,15 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
setWeighting(navigationalType). setWeighting(navigationalType).
setVehicle(movementType). setVehicle(movementType).
setLocale(Locale.GERMANY); setLocale(Locale.GERMANY);
GHResponse rsp = hopper.route(req);
// blocks one or multiple given areas from being used by the routing
// https://github.com/graphhopper/graphhopper/blob/master/docs/web/api-doc.md#flexible
if(blockedAreas != null && !blockedAreas.isEmpty()) {
req.getHints().put(Routing.BLOCK_AREA, blockedAreas);
}
GHResponse rsp = hopper.route(req);
//If the requested point is not in the map data, simple return the destination as next point //If the requested point is not in the map data, simple return the destination as next point
if(rsp.hasErrors()) { if(rsp.hasErrors()) {
Monitor.log(this.getClass(), Monitor.Level.ERROR, "Routing request for Host %s with starting point (" + Monitor.log(this.getClass(), Monitor.Level.ERROR, "Routing request for Host %s with starting point (" +
...@@ -223,8 +256,9 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -223,8 +256,9 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
RouteSegmentImpl segment = null; RouteSegmentImpl segment = null;
PointList points = instr.getPoints(); PointList points = instr.getPoints();
String name = instr.getName(); String name = instr.getName();
if (name.isEmpty()) { if (name.isEmpty()) {
name = Integer.toString(instr.getPoints().toGHPoint(0).hashCode()); name = Integer.toString(instr.getPoints().get(0).hashCode());
//name = Integer.toString(instr.getPoints().toGHPoint(0).hashCode()); @deprecated for old GraphHopper version
} }
for (GHPoint point : points) { for (GHPoint point : points) {
if (segment == null) { if (segment == null) {
...@@ -399,4 +433,10 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -399,4 +433,10 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
public void setCreateUniqueFolders(boolean uniqueFolders) { public void setCreateUniqueFolders(boolean uniqueFolders) {
this.uniqueFolders = uniqueFolders; this.uniqueFolders = uniqueFolders;
} }
public void setBlockedAreas(String blockedAreas) {
if(!blockedAreas.isEmpty()) {
this.blockedAreas = blockedAreas;
}
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment