use of com.graphhopper.storage.index.Snap in project graphhopper by graphhopper.
the class HeadingResolverTest method createSnap.
private Snap createSnap(EdgeIteratorState closestEdge, double lat, double lon, int wayIndex) {
Snap snap = new Snap(lat, lon);
snap.setClosestEdge(closestEdge);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.setWayIndex(wayIndex);
snap.calcSnappedPoint(new DistanceCalcEuclidean());
return snap;
}
use of com.graphhopper.storage.index.Snap in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method getEdgeIteratorState.
@Test
public void getEdgeIteratorState() {
// /---\
// 0-x-1-2
// 3
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
na.setNode(2, 50.00, 10.20);
EdgeIteratorState edge = addEdge(graph, 0, 1);
addEdge(graph, 1, 2);
graph.freeze();
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
CHStorageBuilder chBuilder = new CHStorageBuilder(chStore);
chBuilder.setIdentityLevels();
chBuilder.addShortcutEdgeBased(0, 2, PrepareEncoder.getScFwdDir(), 20, 0, 1, 0, 1);
Snap snap = new Snap(50.00, 10.05);
snap.setClosestEdge(edge);
snap.setWayIndex(0);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.singletonList(snap));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
assertGetEdgeIteratorState(queryCHGraph, 1, 2, 1);
assertGetEdgeIteratorShortcut(queryCHGraph, 0, 2, 0, 1);
// the orig edge corresponds to the edge id of the edge in the (base) query graph
assertGetEdgeIteratorState(queryCHGraph, 0, 3, 2);
assertGetEdgeIteratorState(queryCHGraph, 3, 0, 2);
assertGetEdgeIteratorState(queryCHGraph, 1, 3, 3);
assertGetEdgeIteratorState(queryCHGraph, 3, 1, 3);
}
use of com.graphhopper.storage.index.Snap in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method withVirtualEdgesAndShortcuts.
@Test
public void withVirtualEdgesAndShortcuts() {
// /---\
// 0-x-1-2
// 3
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
na.setNode(2, 50.00, 10.20);
EdgeIteratorState edge = addEdge(graph, 0, 1);
addEdge(graph, 1, 2);
graph.freeze();
assertEquals(2, graph.getEdges());
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
CHStorageBuilder chBuilder = new CHStorageBuilder(chStore);
chBuilder.setIdentityLevels();
chBuilder.addShortcutEdgeBased(0, 2, PrepareEncoder.getScFwdDir(), 20, 0, 1, 0, 1);
Snap snap = new Snap(50.00, 10.05);
snap.setClosestEdge(edge);
snap.setWayIndex(0);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.singletonList(snap));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
assertEquals(4, queryCHGraph.getNodes());
assertEquals(3 + 4, queryCHGraph.getEdges());
assertNodesConnected(queryCHGraph, 0, 3, true);
assertNodesConnected(queryCHGraph, 3, 1, true);
assertNodesConnected(queryCHGraph, 1, 2, true);
// node 0 is not visible from node 0 via shortcut 0-2
// assertNodesConnected(queryCHGraph, 0, 2, false);
// at real nodes
RoutingCHEdgeIterator outIter = queryCHGraph.createOutEdgeExplorer().setBaseNode(0);
// note that orig edge of virtual edges corresponds to the id of the virtual edge on the base graph
assertNextEdge(outIter, 0, 3, 2);
assertNextShortcut(outIter, 0, 2, 0, 1);
assertEnd(outIter);
RoutingCHEdgeIterator inIter = queryCHGraph.createInEdgeExplorer().setBaseNode(2);
assertNextEdge(inIter, 2, 1, 1);
assertEnd(inIter);
// at virtual nodes
outIter = queryCHGraph.createOutEdgeExplorer().setBaseNode(3);
assertNextEdge(outIter, 3, 0, 2);
assertNextEdge(outIter, 3, 1, 3);
assertEnd(outIter);
inIter = queryCHGraph.createInEdgeExplorer().setBaseNode(3);
assertNextEdge(inIter, 3, 0, 2);
assertNextEdge(inIter, 3, 1, 3);
assertEnd(inIter);
}
use of com.graphhopper.storage.index.Snap in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method getWeight_withAccess.
@Test
public void getWeight_withAccess() {
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
double dist = DistancePlaneProjection.DIST_PLANE.calcDist(na.getLat(0), na.getLon(0), na.getLat(1), na.getLon(1));
EdgeIteratorState edge = graph.edge(0, 1).setDistance(dist);
// we set the access flags, but do use direction dependent speeds to make sure we are testing whether or not the
// access flags are respected and the weight calculation does not simply rely on the speed, see this forum issue
// https://discuss.graphhopper.com/t/speed-and-access-when-setbothdirections-true-false/5695
edge.set(encoder.getAccessEnc(), true, false);
edge.set(encoder.getAverageSpeedEnc(), 60, 60);
graph.freeze();
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
// without query graph
// 0->1
RoutingCHEdgeIterator iter = routingCHGraph.createOutEdgeExplorer().setBaseNode(0);
assertNextEdge(iter, 0, 1, 0);
assertEquals(428.8483, iter.getWeight(false), 1.e-4);
assertEquals(Double.POSITIVE_INFINITY, iter.getWeight(true));
assertEnd(iter);
iter = routingCHGraph.createInEdgeExplorer().setBaseNode(1);
assertNextEdge(iter, 1, 0, 0);
assertEquals(Double.POSITIVE_INFINITY, iter.getWeight(false));
assertEquals(428.8483, iter.getWeight(true), 1.e-4);
assertEnd(iter);
// single edges
assertEquals(428.8483, routingCHGraph.getEdgeIteratorState(0, 1).getWeight(false), 1.e-4);
assertEquals(Double.POSITIVE_INFINITY, routingCHGraph.getEdgeIteratorState(0, 1).getWeight(true));
assertEquals(Double.POSITIVE_INFINITY, routingCHGraph.getEdgeIteratorState(0, 0).getWeight(false));
assertEquals(428.8483, routingCHGraph.getEdgeIteratorState(0, 0).getWeight(true), 1.e-4);
// with query graph
// 0-x->1
// 2
Snap snap = new Snap(50.00, 10.05);
snap.setClosestEdge(edge);
snap.setWayIndex(0);
snap.setSnappedPosition(Snap.Position.EDGE);
snap.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Collections.singletonList(snap));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
iter = queryCHGraph.createOutEdgeExplorer().setBaseNode(0);
assertNextEdge(iter, 0, 2, 1);
assertEquals(214.4241, iter.getWeight(false), 1.e-4);
assertEquals(Double.POSITIVE_INFINITY, iter.getWeight(true));
assertEnd(iter);
iter = queryCHGraph.createInEdgeExplorer().setBaseNode(1);
assertNextEdge(iter, 1, 2, 2);
assertEquals(Double.POSITIVE_INFINITY, iter.getWeight(false));
assertEquals(214.4241, iter.getWeight(true), 1.e-4);
assertEnd(iter);
// at virtual node
iter = queryCHGraph.createInEdgeExplorer().setBaseNode(2);
assertNextEdge(iter, 2, 0, 1);
assertEquals(Double.POSITIVE_INFINITY, iter.getWeight(false));
assertEquals(214.4241, iter.getWeight(true), 1.e-4);
assertNextEdge(iter, 2, 1, 2);
assertEquals(214.4241, iter.getWeight(false), 1.e-4);
assertEquals(Double.POSITIVE_INFINITY, iter.getWeight(true));
assertEnd(iter);
// single edges
assertEquals(214.4241, queryCHGraph.getEdgeIteratorState(1, 2).getWeight(false), 1.e-4);
assertEquals(Double.POSITIVE_INFINITY, queryCHGraph.getEdgeIteratorState(1, 2).getWeight(true));
assertEquals(Double.POSITIVE_INFINITY, queryCHGraph.getEdgeIteratorState(1, 0).getWeight(false));
assertEquals(214.4241, queryCHGraph.getEdgeIteratorState(1, 0).getWeight(true), 1.e-4);
}
use of com.graphhopper.storage.index.Snap in project graphhopper by graphhopper.
the class QueryRoutingCHGraphTest method getTurnCost.
@Test
public void getTurnCost() {
// /-----\
// 0-x-1-x-2
// 3 4
na.setNode(0, 50.00, 10.00);
na.setNode(1, 50.00, 10.10);
na.setNode(2, 50.00, 10.20);
EdgeIteratorState edge1 = addEdge(graph, 0, 1);
EdgeIteratorState edge2 = addEdge(graph, 1, 2);
DecimalEncodedValue turnCostEnc = encodingManager.getDecimalEncodedValue(TurnCost.key(encoder.toString()));
graph.getTurnCostStorage().set(turnCostEnc, 0, 1, 1, 5);
graph.freeze();
CHConfig chConfig = CHConfig.edgeBased("x", weighting);
CHStorage chStore = graph.createCHStorage(chConfig);
RoutingCHGraph routingCHGraph = graph.createCHGraph(chStore, chConfig);
CHStorageBuilder chBuilder = new CHStorageBuilder(chStore);
chBuilder.setIdentityLevels();
chBuilder.addShortcutEdgeBased(0, 2, PrepareEncoder.getScFwdDir(), 20, 0, 1, 0, 1);
// without virtual nodes
assertEquals(5, routingCHGraph.getTurnWeight(0, 1, 1));
// with virtual nodes
Snap snap1 = new Snap(50.00, 10.05);
snap1.setClosestEdge(edge1);
snap1.setWayIndex(0);
snap1.setSnappedPosition(Snap.Position.EDGE);
snap1.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
Snap snap2 = new Snap(50.00, 10.15);
snap2.setClosestEdge(edge2);
snap2.setWayIndex(0);
snap2.setSnappedPosition(Snap.Position.EDGE);
snap2.calcSnappedPoint(DistancePlaneProjection.DIST_PLANE);
QueryGraph queryGraph = QueryGraph.create(graph, Arrays.asList(snap1, snap2));
QueryRoutingCHGraph queryCHGraph = new QueryRoutingCHGraph(routingCHGraph, queryGraph);
assertEquals(5, queryCHGraph.getTurnWeight(0, 1, 1));
// take a look at edges 3->1 and 1->4, their original edge ids are 3 and 4 (not 4 and 5)
assertNodesConnected(queryCHGraph, 3, 1, true);
assertNodesConnected(queryCHGraph, 1, 4, true);
int expectedEdge31 = 3;
int expectedEdge14 = 4;
RoutingCHEdgeIterator iter = queryCHGraph.createOutEdgeExplorer().setBaseNode(3);
assertNextEdge(iter, 3, 0, 2);
assertNextEdge(iter, 3, 1, expectedEdge31);
assertEnd(iter);
iter = queryCHGraph.createOutEdgeExplorer().setBaseNode(1);
assertNextEdge(iter, 1, 3, 3);
assertNextEdge(iter, 1, 4, expectedEdge14);
assertEnd(iter);
// check the turn weight between these edges
assertEquals(5, queryCHGraph.getTurnWeight(expectedEdge31, 1, expectedEdge14));
}
Aggregations