/** * By applying a routing algorithm (e.g. shortest path or OSM-extraction) route from station to * station for each pt-line. * * <p>Writes the resulting schedule into this.schedule. */ protected void createPTRoutes() { log.info("Creating pt routes..."); Counter counter = new Counter("route # "); this.router = new PTLRFastAStarLandmarksSimpleRouting(this.network); for (TransitLine line : this.schedule.getTransitLines().values()) { for (TransitRoute route : line.getRoutes().values()) { counter.incCounter(); assignRoute(route); } } counter.printCounter(); log.info(" Add artificial links and nodes..."); for (ArtificiallyConnectedStopFacility newFacility : artificiallyConnectedStopFacilities.values()) { this.network.addNode(newFacility.myNode); } for (ArtificiallyConnectedStopFacility newFacility : artificiallyConnectedStopFacilities.values()) { this.network.addLink(newFacility.myLink); for (Link newLink : newFacility.getLinks()) { this.network.addLink(newLink); } } for (Link newLink : artificiallyAddedLinks.values()) { this.network.addLink(newLink); } log.info(" Add artificial links and nodes... done."); log.info("Creating pt routes... done."); }
private void assignRoute(TransitRoute route) { List<Id<Link>> links = new ArrayList<>(); int i = 0; while (i < (route.getStops().size())) { TransitRouteStop presentStop = route.getStops().get(i); TransitRouteStop nextStop = (i < route.getStops().size() - 1) ? route.getStops().get(i + 1) : null; if (nextStop != null) { // Case 1: For both stops a link assigned, then just route between the two. if (linkedStopFacilities.contains(presentStop.getStopFacility().getId()) && linkedStopFacilities.contains(nextStop.getStopFacility().getId())) { links.add(presentStop.getStopFacility().getLinkId()); Node startNode = this.network.getLinks().get(presentStop.getStopFacility().getLinkId()).getToNode(); LeastCostPathCalculator.Path path = getShortestPath(startNode, nextStop); if (path != null) { for (Link link : path.links) { links.add(link.getId()); } } else { Node fromNode = network.getLinks().get(presentStop.getStopFacility().getLinkId()).getToNode(); Node toNode = network.getLinks().get(nextStop.getStopFacility().getLinkId()).getFromNode(); Link artificialLink = (artificiallyAddedLinks.containsKey(new Tuple<>(fromNode, toNode))) ? artificiallyAddedLinks.get(new Tuple<>(fromNode, toNode)) : getNewLink(fromNode, toNode); links.add(artificialLink.getId()); artificiallyAddedLinks.put(new Tuple<>(fromNode, toNode), artificialLink); } // Case 2: PresentStop has no link, but NextStop has link then create link to closest // network node and route between that node and link of follow-stop. } else if (!linkedStopFacilities.contains(presentStop.getStopFacility().getId()) && linkedStopFacilities.contains(nextStop.getStopFacility().getId())) { ArtificiallyConnectedStopFacility thisStopFacility = getArtificiallyConnectedStopFacility(presentStop.getStopFacility()); Node toNode = network.getLinks().get(nextStop.getStopFacility().getLinkId()).getFromNode(); links.add(thisStopFacility.myLink.getId()); links.add(thisStopFacility.getLinkToNode(toNode).getId()); // Case 3: PresentStop has link, but NextStop has no link then create link to closest // network node for follow stop and then route between the two. } else if (linkedStopFacilities.contains(presentStop.getStopFacility().getId()) && !linkedStopFacilities.contains(nextStop.getStopFacility().getId())) { ArtificiallyConnectedStopFacility nextStopFacility = getArtificiallyConnectedStopFacility(nextStop.getStopFacility()); Node fromNode = network.getLinks().get(presentStop.getStopFacility().getLinkId()).getToNode(); links.add(presentStop.getStopFacility().getLinkId()); links.add(nextStopFacility.getLinkFromNode(fromNode).getId()); // Case 4: Neither PresentStop nor NextStop has link then standard link creation as with // Marcel's network creator. } else { ArtificiallyConnectedStopFacility thisStopFacility = getArtificiallyConnectedStopFacility(presentStop.getStopFacility()); ArtificiallyConnectedStopFacility nextStopFacility = getArtificiallyConnectedStopFacility(nextStop.getStopFacility()); links.add(thisStopFacility.myLink.getId()); links.add(nextStopFacility.getLinkFromNode(thisStopFacility.myNode).getId()); } // If nextStop was null, this means we have reached the end of the route and just add the // final link. } else { if (linkedStopFacilities.contains(presentStop.getStopFacility().getId())) { links.add(presentStop.getStopFacility().getLinkId()); } else { ArtificiallyConnectedStopFacility thisStopFacility = getArtificiallyConnectedStopFacility(presentStop.getStopFacility()); links.add(thisStopFacility.myLink.getId()); } } i++; } if (links.size() > 0) { route.setRoute(RouteUtils.createNetworkRoute(links, this.network)); } else { log.warn("No route found for transit route " + route.toString() + ". No route assigned."); } }