/** * @param schedule * @return */ public static TransitSchedule removeRoutesWithOnlyOneRouteStop(TransitSchedule schedule) { log.info("Removing transitRoutes with only one stop..."); TransitSchedule tS = TransitScheduleCleaner.makeTransitScheduleModifiable(schedule); Set<Id> routeIds; for (TransitLine line : tS.getTransitLines().values()) { routeIds = new HashSet<Id>(); for (TransitRoute route : line.getRoutes().values()) { // a transitRoute with only one stop makes no sense if (route.getStops().size() < 2) { routeIds.add(route.getId()); } } // remove identified routes for (Id id : routeIds) { line.removeRoute(line.getRoutes().get(id)); } // log only if something has been done if (routeIds.size() > 0) { log.info( "Following TransitRoutes are removed from TransitLine: " + line.getId() + ". " + routeIds.toString()); } } return tS; }
private void cleanSchedule() { for (TransitLine line : this.schedule.getTransitLines().values()) { Set<TransitRoute> toRemove = new HashSet<>(); for (TransitRoute transitRoute : line.getRoutes().values()) { boolean removeRoute = false; NetworkRoute networkRoute = transitRoute.getRoute(); if (networkRoute.getStartLinkId() == null || networkRoute.getEndLinkId() == null) { removeRoute = true; } for (Id<Link> linkId : transitRoute.getRoute().getLinkIds()) { if (linkId == null) { removeRoute = true; } } if (removeRoute) { log.error( "NetworkRoute for " + transitRoute.getId().toString() + " incomplete. Remove route."); toRemove.add(transitRoute); } } if (!toRemove.isEmpty()) { for (TransitRoute transitRoute : toRemove) { line.removeRoute(transitRoute); } } } }
/** * 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."); }
public static TransitSchedule removeRoutesWithoutDepartures(TransitSchedule transitSchedule) { log.info("Removing all routes without any departure"); TransitSchedule tS = TransitScheduleCleaner.makeTransitScheduleModifiable(transitSchedule); printStatistic(tS); StringBuffer sB = new StringBuffer(); int nOfRouteRemoved = 0; for (TransitLine line : tS.getTransitLines().values()) { List<TransitRoute> routesToRemove = new LinkedList<TransitRoute>(); for (TransitRoute route : line.getRoutes().values()) { if (route.getDepartures().size() == 0) { routesToRemove.add(route); } } for (TransitRoute transitRoute : routesToRemove) { line.removeRoute(transitRoute); sB.append(line.getId() + "-" + transitRoute.getId()); sB.append(", "); nOfRouteRemoved++; } } printStatistic(tS); log.info("Removed " + nOfRouteRemoved + " routes from transitSchedule: " + sB.toString()); return tS; }
public WaitTimeStuckCalculator( final Population population, final TransitSchedule transitSchedule, final int timeSlot, final int totalTime) { this.population = population; this.timeSlot = timeSlot; for (TransitLine line : transitSchedule.getTransitLines().values()) for (TransitRoute route : line.getRoutes().values()) { double[] sortedDepartures = new double[route.getDepartures().size()]; int d = 0; for (Departure departure : route.getDepartures().values()) sortedDepartures[d++] = departure.getDepartureTime(); Arrays.sort(sortedDepartures); Map<Id<TransitStopFacility>, WaitTimeData> stopsMap = new HashMap<Id<TransitStopFacility>, WaitTimeData>(100); Map<Id<TransitStopFacility>, double[]> stopsScheduledMap = new HashMap<Id<TransitStopFacility>, double[]>(100); for (TransitRouteStop stop : route.getStops()) { stopsMap.put( stop.getStopFacility().getId(), new WaitTimeDataArray(totalTime / timeSlot + 1)); double[] cacheWaitTimes = new double[totalTime / timeSlot + 1]; for (int i = 0; i < cacheWaitTimes.length; i++) { double endTime = timeSlot * (i + 1); if (endTime > 24 * 3600) endTime -= 24 * 3600; cacheWaitTimes[i] = Time.UNDEFINED_TIME; SORTED_DEPARTURES: for (double departure : sortedDepartures) { double arrivalTime = departure + (stop.getArrivalOffset() != Time.UNDEFINED_TIME ? stop.getArrivalOffset() : stop.getDepartureOffset()); if (arrivalTime >= endTime) { cacheWaitTimes[i] = arrivalTime - endTime; break SORTED_DEPARTURES; } } if (cacheWaitTimes[i] == Time.UNDEFINED_TIME) cacheWaitTimes[i] = sortedDepartures[0] + 24 * 3600 + (stop.getArrivalOffset() != Time.UNDEFINED_TIME ? stop.getArrivalOffset() : stop.getDepartureOffset()) - endTime; } stopsScheduledMap.put(stop.getStopFacility().getId(), cacheWaitTimes); } Tuple<Id<TransitLine>, Id<TransitRoute>> key = new Tuple<Id<TransitLine>, Id<TransitRoute>>(line.getId(), route.getId()); waitTimes.put(key, stopsMap); scheduledWaitTimes.put(key, stopsScheduledMap); } }
public static TransitSchedule removeAllRoutesWithMissingLinksFromSchedule( TransitSchedule transitSchedule, Network network) { log.info("Removing stops and routes with missing links from the schedule"); TransitSchedule tS = TransitScheduleCleaner.makeTransitScheduleModifiable(transitSchedule); printStatistic(tS); int removedRoutes = 0; // Remove routes with missing links for (TransitLine transitLine : tS.getTransitLines().values()) { Set<TransitRoute> transitRouteToBeRemoved = new HashSet<TransitRoute>(); for (TransitRoute transitRoute : transitLine.getRoutes().values()) { // Remove Route, when links are missing in the network if (network.getLinks().get(transitRoute.getRoute().getStartLinkId()) == null) { transitRouteToBeRemoved.add(transitRoute); continue; } for (Id linkId : transitRoute.getRoute().getLinkIds()) { if (network.getLinks().get(linkId) == null) { transitRouteToBeRemoved.add(transitRoute); break; } } if (network.getLinks().get(transitRoute.getRoute().getEndLinkId()) == null) { transitRouteToBeRemoved.add(transitRoute); continue; } // Remove route, if one of its stops, has a missing link for (TransitRouteStop transitRouteStop : transitRoute.getStops()) { if (network.getLinks().get(transitRouteStop.getStopFacility().getLinkId()) == null) { transitRouteToBeRemoved.add(transitRoute); break; } } } for (TransitRoute transitRoute : transitRouteToBeRemoved) { if (transitLine.removeRoute(transitRoute) == true) { removedRoutes++; } } } log.info("Removed " + removedRoutes + " routes due to missing links or stops"); printStatistic(tS); return tS; }
/** * Adding TransportMode.pt flags to all links referred by transit schedule * * @param transitSchedule The transit schedule. * @param network The network to be tagged. * @return */ public static Network tagTransitLinksInNetwork(TransitSchedule transitSchedule, Network network) { log.info("Tagging pt network links"); if (transitSchedule == null) { log.info("No transit schedule given. Returning unmodified network..."); return network; } for (TransitStopFacility stopFacitlity : transitSchedule.getFacilities().values()) { Set<String> allowedModes = new TreeSet<String>(network.getLinks().get(stopFacitlity.getLinkId()).getAllowedModes()); allowedModes.add(TransportMode.pt); network.getLinks().get(stopFacitlity.getLinkId()).setAllowedModes(allowedModes); } for (TransitLine transitLine : transitSchedule.getTransitLines().values()) { for (TransitRoute transitRoute : transitLine.getRoutes().values()) { NetworkRoute route = transitRoute.getRoute(); Set<String> allowedModes; allowedModes = new TreeSet<String>(network.getLinks().get(route.getStartLinkId()).getAllowedModes()); allowedModes.add(TransportMode.pt); network.getLinks().get(route.getStartLinkId()).setAllowedModes(allowedModes); for (Id linkId : route.getLinkIds()) { allowedModes = new TreeSet<String>(network.getLinks().get(linkId).getAllowedModes()); allowedModes.add(TransportMode.pt); network.getLinks().get(linkId).setAllowedModes(allowedModes); } allowedModes = new TreeSet<String>(network.getLinks().get(route.getEndLinkId()).getAllowedModes()); allowedModes.add(TransportMode.pt); network.getLinks().get(route.getEndLinkId()).setAllowedModes(allowedModes); } } int taggedLinks = 0; for (Link link : network.getLinks().values()) { if (link.getAllowedModes().contains(TransportMode.pt)) { taggedLinks++; } } log.info("Finished - " + taggedLinks + " links were tagged"); return network; }
private static boolean isRelatedWithLine(Person person, TransitLine line) { ExperimentalTransitRouteFactory factory = new ExperimentalTransitRouteFactory(); for (Plan plan : person.getPlans()) for (PlanElement planElement : plan.getPlanElements()) if (planElement instanceof Leg && ((Leg) planElement).getRoute() instanceof Route) { Route origRoute = ((Leg) planElement).getRoute(); ExperimentalTransitRoute route = (ExperimentalTransitRoute) factory.createRoute(origRoute.getStartLinkId(), origRoute.getEndLinkId()); route.setStartLinkId(origRoute.getStartLinkId()); route.setEndLinkId(origRoute.getEndLinkId()); route.setRouteDescription(origRoute.getRouteDescription()); for (TransitRoute transitRoute : line.getRoutes().values()) for (TransitRouteStop stop : transitRoute.getStops()) if (stop.getStopFacility().getId().equals(route.getAccessStopId()) || stop.getStopFacility().getId().equals(route.getEgressStopId())) return true; } return false; }
private final void createVehicleLinkSpeedAttributes() { for (TransitLine transitLine : scenario.getTransitSchedule().getTransitLines().values()) { for (TransitRoute transitRoute : transitLine.getRoutes().values()) { Set<Id> vehIds = new HashSet<Id>(); for (Departure departure : transitRoute.getDepartures().values()) { vehIds.add(departure.getVehicleId()); } Iterator<TransitRouteStop> iterator = transitRoute.getStops().iterator(); double departure = iterator.next().getDepartureOffset(); while (iterator.hasNext()) { TransitRouteStop routeStop = iterator.next(); double arrival = routeStop.getArrivalOffset(); Link link = scenario.getNetwork().getLinks().get(routeStop.getStopFacility().getLinkId()); double speed = link.getLength() / (arrival - departure); if (speed >= 200.0) { System.out.println( "line=" + transitLine.getId() + ";route=" + transitRoute.getId() + "stop=" + routeStop.getStopFacility().getId() + ": lLenth=" + link.getLength() + ";arr=" + arrival + ";dep=" + departure + ""); } for (Id vehId : vehIds) { this.vehicleAttributes.putAttribute(vehId.toString(), link.getId().toString(), speed); } departure = routeStop.getDepartureOffset(); } } } }
private void removeNonUsedStopFacilities() { // Collect all used stop facilities: Set<Id<TransitStopFacility>> usedStopFacilities = new HashSet<>(); for (TransitLine line : this.schedule.getTransitLines().values()) { for (TransitRoute route : line.getRoutes().values()) { for (TransitRouteStop stop : route.getStops()) { usedStopFacilities.add(stop.getStopFacility().getId()); } } } // Check all stop facilities if not used: Set<TransitStopFacility> unusedStopFacilites = new HashSet<>(); for (Id<TransitStopFacility> facilityId : this.schedule.getFacilities().keySet()) { if (!usedStopFacilities.contains(facilityId)) { unusedStopFacilites.add(this.schedule.getFacilities().get(facilityId)); } } // Remove all stop facilities not used: for (TransitStopFacility facility : unusedStopFacilites) { this.schedule.removeStopFacility(facility); } }
private void writeVehicles(String vehiclesOutFile) { VehiclesFactory vehFactory = this.veh.getFactory(); VehicleType vehType = vehFactory.createVehicleType(Id.create("defaultTransitVehicleType", VehicleType.class)); VehicleCapacity capacity = new VehicleCapacityImpl(); capacity.setSeats(Integer.valueOf(8)); capacity.setStandingRoom(Integer.valueOf(0)); vehType.setCapacity(capacity); this.veh.addVehicleType(vehType); for (TransitLine line : this.tS.getTransitLines().values()) { for (TransitRoute route : line.getRoutes().values()) { for (Departure departure : route.getDepartures().values()) { Vehicle vehicle = vehFactory.createVehicle(departure.getVehicleId(), vehType); this.veh.addVehicle(vehicle); } } } VehicleWriterV1 writer = new VehicleWriterV1(this.veh); writer.writeFile(vehiclesOutFile); }
/** * Add to any link that is passed by any route a "pt" in the modes, if it hasn't already one... */ private void prepareNetwork() { Map<Id<Link>, ? extends Link> networkLinks = network.getLinks(); Set<Id<Link>> transitLinks = new HashSet<>(); for (TransitLine line : this.schedule.getTransitLines().values()) { for (TransitRoute transitRoute : line.getRoutes().values()) { NetworkRoute networkRoute = transitRoute.getRoute(); transitLinks.add(networkRoute.getStartLinkId()); for (Id<Link> linkId : transitRoute.getRoute().getLinkIds()) { transitLinks.add(linkId); } transitLinks.add(networkRoute.getEndLinkId()); } } for (Id<Link> transitLinkId : transitLinks) { Link transitLink = networkLinks.get(transitLinkId); if (!transitLink.getAllowedModes().contains(TransportMode.pt)) { Set<String> modes = new HashSet<>(); modes.addAll(transitLink.getAllowedModes()); modes.add(TransportMode.pt); transitLink.setAllowedModes(modes); } } }
public static TransitSchedule removeStopsNotUsed(TransitSchedule transitSchedule) { log.info("Removing stops not used"); TransitSchedule tS = TransitScheduleCleaner.makeTransitScheduleModifiable(transitSchedule); printStatistic(tS); Set<Id> stopsInUse = new TreeSet<Id>(); Set<Id> stopsToBeRemoved = new TreeSet<Id>(); for (TransitLine transitLine : tS.getTransitLines().values()) { for (TransitRoute transitRoute : transitLine.getRoutes().values()) { for (TransitRouteStop stop : transitRoute.getStops()) { stopsInUse.add(stop.getStopFacility().getId()); } } } for (TransitStopFacility transitStopFacility : tS.getFacilities().values()) { if (!stopsInUse.contains(transitStopFacility.getId())) { stopsToBeRemoved.add(transitStopFacility.getId()); } } StringBuffer sB = new StringBuffer(); for (Id transitStopFacilityId : stopsToBeRemoved) { tS.getFacilities().remove(transitStopFacilityId); sB.append(transitStopFacilityId.toString() + ", "); } printStatistic(tS); log.info( "Removed " + stopsToBeRemoved.size() + " stops from transitSchedule: " + sB.toString()); return tS; }