@Override public EdgeExplorer createEdgeExplorer() { return baseGraph.createEdgeExplorer(edgeFilter); }
@Override public EdgeExplorer createEdgeExplorer() { return graphHopperStorage.createEdgeExplorer(); }
abstract GraphHopperStorage createGHStorage(String location, boolean is3D);
/** * This method removes the access to edges available from the nodes contained in the components. * But only if a components' size is smaller then the specified min value. * <p> * * @return number of removed edges */ int removeEdges(final PrepEdgeFilter bothFilter, List<IntArrayList> components, int min) { // remove edges determined from nodes but only if less than minimum size FlagEncoder encoder = bothFilter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(bothFilter); int removedEdges = 0; for (IntArrayList component : components) { removedEdges += removeEdges(explorer, encoder, component, min); } return removedEdges; }
/** * Removes nodes if all edges are not accessible. I.e. removes zero degree nodes. */ void markNodesRemovedIfUnreachable() { EdgeExplorer edgeExplorer = ghStorage.createEdgeExplorer(); for (int nodeIndex = 0; nodeIndex < ghStorage.getNodes(); nodeIndex++) { if (detectNodeRemovedForAllEncoders(edgeExplorer, nodeIndex)) ghStorage.markNodeRemoved(nodeIndex); } }
public static boolean isConsistent(GraphHopperStorage storage) { EdgeExplorer edgeExplorer = storage.createEdgeExplorer(); int nNodes = storage.getNodes(); for(int i=0; i<nNodes; i++) { if(!check(storage, edgeExplorer, i)) return false; } return true; }
protected void gatherOuterAndInnerNodeIdsOfStructure(EdgeIteratorState edge, final GHIntHashSet outerNodeIds, final GHIntHashSet innerNodeIds) { edgeElevationInterpolator.gatherOuterAndInnerNodeIds( edgeElevationInterpolator.getStorage().createEdgeExplorer(), edge, new GHBitSetImpl(), outerNodeIds, innerNodeIds); } }
int allRemoved = 0; FlagEncoder encoder = filter.getEncoder(); EdgeExplorer explorer = ghStorage.createEdgeExplorer(filter); for (IntArrayList component : components) { if (maxCount < 0) {
private void interpolateElevationsOfTowerNodes() { final AllEdgesIterator edge = storage.getAllEdges(); final GHBitSet visitedEdgeIds = new GHBitSetImpl(edge.length()); final EdgeExplorer edgeExplorer = storage.createEdgeExplorer(); while (edge.next()) { final int edgeId = edge.getEdge(); if (isInterpolatableEdge(edge)) { if (!visitedEdgeIds.contains(edgeId)) { interpolateEdge(edge, visitedEdgeIds, edgeExplorer); } } visitedEdgeIds.add(edgeId); } }
public TarjansSCCAlgorithm(GraphHopperStorage ghStorage, final EdgeFilter edgeFilter, boolean ignoreSingleEntries) { this.graph = ghStorage; this.nodeStack = new IntArrayDeque(); this.onStack = new GHBitSetImpl(ghStorage.getNodes()); this.nodeIndex = new int[ghStorage.getNodes()]; this.nodeLowLink = new int[ghStorage.getNodes()]; this.edgeFilter = edgeFilter; if (ignoreSingleEntries) { // Very important case to boost performance - see #520. Exclude single entry components as we don't need them! // But they'll be created a lot for multiple vehicles because many nodes e.g. for foot are not accessible at all for car. // We can ignore these single entry components as they are already set 'not accessible' EdgeExplorer explorer = ghStorage.createEdgeExplorer(edgeFilter); int nodes = ghStorage.getNodes(); ignoreSet = new GHBitSetImpl(ghStorage.getNodes()); for (int start = 0; start < nodes; start++) { if (!ghStorage.isNodeRemoved(start)) { EdgeIterator iter = explorer.setBaseNode(start); if (!iter.next()) ignoreSet.add(start); } } } else { ignoreSet = new GHBitSetImpl(); } }
@Test public void testVirtEdges() { initGraph(g); EdgeIterator iter = g.createEdgeExplorer().setBaseNode(0); iter.next(); VirtualEdgeIterator vi = new VirtualEdgeIterator(2); vi.add(iter.detach(false)); assertTrue(vi.next()); }
@Test public void useEECache() { initGraph(g); EdgeExplorer explorer = g.createEdgeExplorer(); EdgeIterator iter = explorer.setBaseNode(1); assertTrue(iter.next()); QueryResult res = createLocationResult(2, 1.5, iter, 1, PILLAR); QueryGraph queryGraph = new QueryGraph(g).setUseEdgeExplorerCache(true); queryGraph.lookup(Arrays.asList(res)); EdgeExplorer edgeExplorer = queryGraph.createEdgeExplorer(); // using cache means same reference assertTrue(edgeExplorer == queryGraph.createEdgeExplorer()); } }
@Test public void testFillVirtualEdges() { initGraph(g); g.getNodeAccess().setNode(3, 0, 1); g.edge(1, 3); final int baseNode = 1; EdgeIterator iter = g.createEdgeExplorer().setBaseNode(baseNode); iter.next(); QueryResult res1 = createLocationResult(2, 1.7, iter, 1, PILLAR); QueryGraph queryGraph = new QueryGraph(g) { @Override void fillVirtualEdges(IntObjectMap<VirtualEdgeIterator> node2Edge, int towerNode, EdgeExplorer mainExpl) { super.fillVirtualEdges(node2Edge, towerNode, mainExpl); // ignore nodes should include baseNode == 1 if (towerNode == 3) assertEquals("[3->4]", node2Edge.get(towerNode).toString()); else if (towerNode == 1) assertEquals("[1->4, 1 1-0]", node2Edge.get(towerNode).toString()); else throw new IllegalStateException("not allowed " + towerNode); } }; queryGraph.lookup(Arrays.asList(res1)); EdgeIteratorState state = GHUtility.getEdge(queryGraph, 0, 1); assertEquals(4, state.fetchWayGeometry(3).size()); // fetch virtual edge and check way geometry state = GHUtility.getEdge(queryGraph, 4, 3); assertEquals(2, state.fetchWayGeometry(3).size()); }
@Test public void testRemoveSubnetworkIfOnlyOneVehicle() { GraphHopperStorage g = createSubnetworkTestStorage2(em); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, em.fetchEdgeEncoders()); instance.setMinNetworkSize(4); instance.doWork(); g.optimize(); assertEquals(6, g.getNodes()); assertEquals(Arrays.<String>asList(), GHUtility.getProblems(g)); EdgeExplorer explorer = g.createEdgeExplorer(); assertEquals(GHUtility.asSet(2, 1, 5), GHUtility.getNeighbors(explorer.setBaseNode(3))); // do not remove because small network is big enough g = createSubnetworkTestStorage2(em); instance = new PrepareRoutingSubnetworks(g, em.fetchEdgeEncoders()); instance.setMinNetworkSize(3); instance.doWork(); g.optimize(); assertEquals(9, g.getNodes()); }
@Test public void testRemoveNode() { FlagEncoder carEncoder = new CarFlagEncoder(); BikeFlagEncoder bikeEncoder = new BikeFlagEncoder(); EncodingManager em2 = new EncodingManager(carEncoder, bikeEncoder); GraphHopperStorage g = createSubnetworkTestStorage2(em2); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, em2.fetchEdgeEncoders()); EdgeExplorer edgeExplorer = g.createEdgeExplorer(); assertFalse(instance.detectNodeRemovedForAllEncoders(edgeExplorer, 4)); assertFalse(instance.detectNodeRemovedForAllEncoders(edgeExplorer, 5)); assertFalse(instance.detectNodeRemovedForAllEncoders(edgeExplorer, 6)); // mark certain edges inaccessible for all encoders for (EdgeIteratorState edge : Arrays.asList(GHUtility.getEdge(g, 5, 6), GHUtility.getEdge(g, 4, 5), GHUtility.getEdge(g, 4, 6))) { for (FlagEncoder encoders : em2.fetchEdgeEncoders()) { edge.setFlags(encoders.setAccess(0, false, false)); } } assertTrue(instance.detectNodeRemovedForAllEncoders(edgeExplorer, 4)); assertTrue(instance.detectNodeRemovedForAllEncoders(edgeExplorer, 5)); assertTrue(instance.detectNodeRemovedForAllEncoders(edgeExplorer, 6)); }
@Test public void testFootMix() { graph = createGHStorage(); graph.edge(0, 1).setDistance(10).setFlags(footEncoder.setProperties(10, true, true)); graph.edge(0, 2).setDistance(10).setFlags(carEncoder.setProperties(10, true, true)); graph.edge(0, 3).setDistance(10).setFlags(footEncoder.setProperties(10, true, true) | carEncoder.setProperties(10, true, true)); EdgeExplorer footOutExplorer = graph.createEdgeExplorer(DefaultEdgeFilter.outEdges(footEncoder)); assertEquals(GHUtility.asSet(3, 1), GHUtility.getNeighbors(footOutExplorer.setBaseNode(0))); assertEquals(GHUtility.asSet(3, 2), GHUtility.getNeighbors(carOutExplorer.setBaseNode(0))); }
@Test public void testRemoveSubnetworkWhenMultipleVehicles() { FlagEncoder carEncoder = new CarFlagEncoder(); BikeFlagEncoder bikeEncoder = new BikeFlagEncoder(); EncodingManager em2 = new EncodingManager(carEncoder, bikeEncoder); GraphHopperStorage g = createSubnetworkTestStorage2(em2); GHUtility.getEdge(g, 3, 4).setFlags(carEncoder.setProperties(10, false, false) | bikeEncoder.setProperties(5, true, true)); PrepareRoutingSubnetworks instance = new PrepareRoutingSubnetworks(g, em2.fetchEdgeEncoders()); instance.setMinNetworkSize(5); instance.doWork(); g.optimize(); // remove nothing because of two vehicles with different subnetworks assertEquals(9, g.getNodes()); EdgeExplorer carExplorer = g.createEdgeExplorer(DefaultEdgeFilter.allEdges(carEncoder)); assertEquals(GHUtility.asSet(7, 2, 1), GHUtility.getNeighbors(carExplorer.setBaseNode(3))); EdgeExplorer bikeExplorer = g.createEdgeExplorer(DefaultEdgeFilter.allEdges(bikeEncoder)); assertEquals(GHUtility.asSet(7, 2, 1, 4), GHUtility.getNeighbors(bikeExplorer.setBaseNode(3))); GHUtility.getEdge(g, 3, 4).setFlags(carEncoder.setProperties(10, false, false) | bikeEncoder.setProperties(5, false, false)); instance = new PrepareRoutingSubnetworks(g, em2.fetchEdgeEncoders()); instance.setMinNetworkSize(5); instance.doWork(); g.optimize(); assertEquals(6, g.getNodes()); }
@Test public void testInternalAPIOriginalTraversalKey() { initGraph(g); EdgeExplorer explorer = g.createEdgeExplorer(); QueryGraph queryGraph = new QueryGraph(g); EdgeIterator iter = explorer.setBaseNode(1); assertTrue(iter.next()); int origEdgeId = iter.getEdge(); QueryResult res = createLocationResult(2, 1.5, iter, 1, PILLAR); queryGraph.lookup(Arrays.asList(res)); assertEquals(new GHPoint(1.5, 1.5), res.getSnappedPoint()); assertEquals(3, res.getClosestNode()); EdgeExplorer qGraphExplorer = queryGraph.createEdgeExplorer(); iter = qGraphExplorer.setBaseNode(3); assertTrue(iter.next()); assertEquals(0, iter.getAdjNode()); assertEquals(GHUtility.createEdgeKey(1, 0, origEdgeId, false), ((VirtualEdgeIteratorState) queryGraph.getEdgeIteratorState(iter.getEdge(), 0)).getOriginalTraversalKey()); assertTrue(iter.next()); assertEquals(1, iter.getAdjNode()); assertEquals(GHUtility.createEdgeKey(0, 1, origEdgeId, false), ((VirtualEdgeIteratorState) queryGraph.getEdgeIteratorState(iter.getEdge(), 1)).getOriginalTraversalKey()); }
EdgeIterator iter = g.createEdgeExplorer().setBaseNode(1); iter.next(); QueryResult res1 = createLocationResult(2, 1.7, iter, 1, PILLAR); iter = g.createEdgeExplorer().setBaseNode(1); iter.next(); res1 = createLocationResult(2, 1.7, iter, 1, PILLAR);
graph.edge(1, 2, 2, true); EdgeIterator iter = graph.createEdgeExplorer().setBaseNode(0); try { EdgeIterator edgeState33 = graph.createEdgeExplorer().setBaseNode(3); edgeState33.next(); assertEquals(3, edgeState33.getBaseNode());