public GraphExplorer(Graph graph, Weighting accessEgressWeighting, PtFlagEncoder flagEncoder, GtfsStorage gtfsStorage, RealtimeFeed realtimeFeed, boolean reverse, List<VirtualEdgeIteratorState> extraEdges, boolean walkOnly, double walkSpeedKmh) { this.graph = graph; this.accessEgressWeighting = accessEgressWeighting; DefaultEdgeFilter accessEgressIn = DefaultEdgeFilter.inEdges(accessEgressWeighting.getFlagEncoder()); DefaultEdgeFilter accessEgressOut = DefaultEdgeFilter.outEdges(accessEgressWeighting.getFlagEncoder()); DefaultEdgeFilter ptIn = DefaultEdgeFilter.inEdges(flagEncoder); DefaultEdgeFilter ptOut = DefaultEdgeFilter.outEdges(flagEncoder); EdgeFilter in = edgeState -> accessEgressIn.accept(edgeState) || ptIn.accept(edgeState); EdgeFilter out = edgeState -> accessEgressOut.accept(edgeState) || ptOut.accept(edgeState); this.edgeExplorer = graph.createEdgeExplorer(reverse ? in : out); this.flagEncoder = flagEncoder; this.gtfsStorage = gtfsStorage; this.realtimeFeed = realtimeFeed; this.reverse = reverse; this.extraEdges.addAll(extraEdges); for (VirtualEdgeIteratorState extraEdge : extraEdges) { if (extraEdge == null) { throw new RuntimeException(); } extraEdgesBySource.put(extraEdge.getBaseNode(), extraEdge); extraEdgesByDestination.put(extraEdge.getAdjNode(), new VirtualEdgeIteratorState(extraEdge.getOriginalTraversalKey(), extraEdge.getEdge(), extraEdge.getAdjNode(), extraEdge.getBaseNode(), extraEdge.getDistance(), extraEdge.getFlags(), extraEdge.getName(), extraEdge.fetchWayGeometry(3))); } this.walkOnly = walkOnly; this.walkSpeedKmH = walkSpeedKmh; }