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);
       }
     }
   }
 }
 private Set<Link> getLinksWithinSearchRadius(Coord centralCoords) {
   Set<Link> linksWithinRadius = new HashSet<>();
   for (Link link : this.network.getLinks().values()) {
     if (NetworkUtils.getEuclidianDistance(centralCoords, link.getToNode().getCoord())
         < SEARCH_RADIUS) {
       linksWithinRadius.add(link);
     }
   }
   return linksWithinRadius;
 }
  /**
   * Link the pt-stations in the schedule to the closest network links. Thereby modifies
   * this.schedule.
   */
  protected void linkStationsToNetwork() {
    log.info("Linking pt stations to network...");

    Counter counter = new Counter("route # ");
    Set<TransitStopFacility> newFacilities = new HashSet<>();
    for (TransitStopFacility facility : this.schedule.getFacilities().values()) {

      final Id<Link> closestLink = findClosestLink(facility);
      if (closestLink != null) {
        //	link stop-facilities to the respective links.
        List<Id<TransitStopFacility>> localLinkedFacilities = new ArrayList<>();
        facility.setLinkId(closestLink);
        localLinkedFacilities.add(facility.getId());

        //	if street-link has opposite direction or if we searched for all links in area, then split
        // stop-position before linking.
        final List<Id<Link>> oppositeDirectionLinks = getOppositeDirection(closestLink);
        if (oppositeDirectionLinks != null && !oppositeDirectionLinks.isEmpty()) {
          TransitStopFacility[] newStopFacilities =
              multiplyStop(facility, oppositeDirectionLinks.size());
          for (int i = 0; i < oppositeDirectionLinks.size(); i++) {
            newStopFacilities[i + 1].setLinkId(oppositeDirectionLinks.get(i));
            localLinkedFacilities.add(newStopFacilities[i + 1].getId());
            newFacilities.add(newStopFacilities[i + 1]);
          }
        }

        linkedStopFacilitiesTree.put(facility.getId(), localLinkedFacilities);
      }

      counter.incCounter();
    }
    for (TransitStopFacility facility : newFacilities) {
      this.schedule.addStopFacility(facility);
    }
    counter.printCounter();

    log.info("Linking pt stations to network... done.");

    for (List<Id<TransitStopFacility>> facilityList : linkedStopFacilitiesTree.values()) {
      for (Id<TransitStopFacility> facilityId : facilityList) {
        linkedStopFacilities.add(facilityId);
      }
    }
  }
 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);
   }
 }
 /**
  * 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);
     }
   }
 }
 private void setConnectedStopFacilitiesToIsBlocking() {
   Set<TransitStopFacility> facilitiesToExchange = new HashSet<>();
   for (TransitStopFacility oldFacility : this.schedule.getFacilities().values()) {
     if (this.network
         .getLinks()
         .get(oldFacility.getLinkId())
         .getAllowedModes()
         .contains(TransportMode.car)) {
       TransitStopFacility newFacility =
           this.scheduleFactory.createTransitStopFacility(
               oldFacility.getId(), oldFacility.getCoord(), true);
       newFacility.setName(oldFacility.getName());
       newFacility.setLinkId(oldFacility.getLinkId());
       newFacility.setStopPostAreaId(oldFacility.getStopPostAreaId());
       facilitiesToExchange.add(newFacility);
     }
   }
   for (TransitStopFacility facility : facilitiesToExchange) {
     TransitStopFacility facilityToRemove = this.schedule.getFacilities().get(facility.getId());
     this.schedule.removeStopFacility(facilityToRemove);
     this.schedule.addStopFacility(facility);
   }
 }