/**
   * Helper method to complete a plan with *wh in a consistent way. Assuming that the first activity
   * is the home activity.
   *
   * @param plan
   * @param workCoord
   * @param jobLocation
   * @author nagel
   */
  public static void completePlanToHwh(
      PlanImpl plan, Coord workCoord, ActivityFacility jobLocation) {

    // complete the first activity (home) by setting end time.
    ActivityImpl act = (ActivityImpl) plan.getFirstActivity();
    act.setEndTime(7. * 3600.); // tnicolai: make configurable: see actType1.setOpeningTime(7*3600)
    // gather coordinate and facility id needed for last activity
    Coord homeCoord = act.getCoord();
    Id homeId = act.getFacilityId();

    // set Leg
    plan.createAndAddLeg(TransportMode.car);

    // set second activity (work)
    act = plan.createAndAddActivity(Constants.ACT_WORK, workCoord);
    act.setFacilityId(jobLocation.getId());
    act.setMaximumDuration(
        8. * 3600.); // tnicolai: make configurable: actType1.setTypicalDuration(8*60*60);

    // set Leg
    plan.createAndAddLeg(TransportMode.car);

    // set last activity (=first activity) and complete home-work-home plan.
    plan.createAndAddActivity(Constants.ACT_HOME, homeCoord);
    act = (ActivityImpl) plan.getLastActivity();
    act.setFacilityId(homeId);
  }
  /**
   * get parking related walking distance of whole day - average per leg
   *
   * @param plan
   * @param facilities
   * @return
   */
  public static double getParkingRelatedWalkingDistanceOfWholeDayAveragePerLeg(
      Plan plan, ActivityFacilities facilities) {
    double travelDistance = 0;
    int numberOfLegs = 0;

    List<PlanElement> pe = plan.getPlanElements();

    for (int i = 0; i < pe.size(); i++) {
      if (pe.get(i) instanceof ActivityImpl) {
        ActivityImpl parkingActivity = (ActivityImpl) pe.get(i);
        if (parkingActivity.getType().equalsIgnoreCase("parking")) {
          Coord coordParking =
              facilities.getFacilities().get(parkingActivity.getFacilityId()).getCoord();
          Leg nextLeg = (Leg) pe.get(i + 1);
          Leg prevLeg = (Leg) pe.get(i - 1);
          if (nextLeg.getMode().equalsIgnoreCase("walk")) {
            ActivityImpl nextAct = (ActivityImpl) pe.get(i + 2);

            if (nextAct.getFacilityId() != null) {
              Coord nextActFacilityCoord =
                  facilities.getFacilities().get(nextAct.getFacilityId()).getCoord();
              travelDistance += GeneralLib.getDistance(coordParking, nextActFacilityCoord);
            } else {
              Coord nextActLinkCoord = nextAct.getCoord();
              travelDistance += GeneralLib.getDistance(coordParking, nextActLinkCoord);
            }
            numberOfLegs++;
          }
          if (prevLeg.getMode().equalsIgnoreCase("walk")) {
            ActivityImpl prevAct = (ActivityImpl) pe.get(i - 2);

            if (prevAct.getFacilityId() != null) {
              Coord prevActFacilityCoord =
                  facilities.getFacilities().get(prevAct.getFacilityId()).getCoord();
              travelDistance += GeneralLib.getDistance(coordParking, prevActFacilityCoord);
            } else {
              Coord prevActLinkCoord = prevAct.getCoord();
              travelDistance += GeneralLib.getDistance(coordParking, prevActLinkCoord);
            }
            numberOfLegs++;
          }
        }
      }
    }

    return travelDistance / numberOfLegs;
  }
  /**
   * Get the ParkingTimeInfo of the parking related to the given activity
   *
   * @param activity
   * @return
   */
  public static ParkingTimeInfo getParkingTimeInfo(
      Plan plan, ActivityImpl activity, ParkingArrivalDepartureLog parkingArrivalDepartureLog) {
    ActivityImpl arrivalParkingAct = getArrivalParkingAct(plan, activity);
    ActivityImpl departureParkingAct = getDepartureParkingAct(plan, activity);

    int parkingArrivalIndex = getParkingArrivalIndex(plan, arrivalParkingAct);

    ParkingTimeInfo parkingTimeInfo =
        parkingArrivalDepartureLog.getParkingArrivalDepartureList().get(parkingArrivalIndex);

    if (arrivalParkingAct.getFacilityId() != parkingTimeInfo.getParkingFacilityId()) {
      throw new Error(
          "facility Ids inconsistent:"
              + arrivalParkingAct.getFacilityId()
              + "!="
              + parkingTimeInfo.getParkingFacilityId());
    }

    return parkingTimeInfo;
  }
Exemple #4
0
  public ActivityFacilities filterFacilitiesWithPopulation(
      final ActivityFacilities origFacilities) {
    ActivityFacilities filteredFacilities = FacilitiesUtils.createActivityFacilities();

    for (Person person : filteredAgents.values()) {
      if (person.getSelectedPlan() != null) {
        for (PlanElement pe : person.getSelectedPlan().getPlanElements()) {
          if (pe instanceof ActivityImpl) {
            ActivityImpl act = (ActivityImpl) pe;
            if (act.getFacilityId() != null
                && !filteredFacilities.getFacilities().containsKey(act.getFacilityId())) {
              filteredFacilities.addActivityFacility(
                  origFacilities.getFacilities().get(act.getFacilityId()));
            }
          }
        }
      }
    }

    return filteredFacilities;
  }
  /**
   * reurns null, if no parking activity found else id of first parking facility
   *
   * @param plan
   * @return
   */
  public static Id<ActivityFacility> getFirstParkingFacilityId(Plan plan) {

    for (int i = 0; i < plan.getPlanElements().size(); i++) {
      if (plan.getPlanElements().get(i) instanceof ActivityImpl) {
        ActivityImpl activity = (ActivityImpl) plan.getPlanElements().get(i);

        if (activity.getType().equalsIgnoreCase("parking")) {
          return activity.getFacilityId();
        }
      }
    }

    return null;
  }
  /**
   * The home/first parking comes last (because it is the last parking arrival of the day).
   *
   * @param plan
   * @return
   */
  public static LinkedList<Id<ActivityFacility>> getAllParkingFacilityIds(Plan plan) {
    LinkedList<Id<ActivityFacility>> parkingFacilityIds = new LinkedList<>();

    // recognize parking arrival patterns (this means, there is car leg
    // after which there is
    // a parking activity).
    for (int i = 0; i < plan.getPlanElements().size(); i++) {
      if (plan.getPlanElements().get(i) instanceof ActivityImpl) {
        ActivityImpl activity = (ActivityImpl) plan.getPlanElements().get(i);

        if (activity.getType().equalsIgnoreCase("parking")) {
          Leg leg = (Leg) plan.getPlanElements().get(i - 1);

          if (leg.getMode().equalsIgnoreCase("car")) {
            parkingFacilityIds.add(activity.getFacilityId());
          }
        }
      }
    }

    return parkingFacilityIds;
  }