All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.street.model.edge.StreetVehicleParkingLink Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.street.model.edge;

import org.locationtech.jts.geom.LineString;
import org.opentripplanner.framework.geometry.GeometryUtils;
import org.opentripplanner.framework.i18n.I18NString;
import org.opentripplanner.routing.api.request.preference.VehicleParkingPreferences;
import org.opentripplanner.service.vehicleparking.model.VehicleParking;
import org.opentripplanner.street.model.vertex.StreetVertex;
import org.opentripplanner.street.model.vertex.VehicleParkingEntranceVertex;
import org.opentripplanner.street.search.TraverseMode;
import org.opentripplanner.street.search.state.State;
import org.opentripplanner.street.search.state.StateEditor;

/**
 * This represents the connection between a street vertex and a vehicle parking vertex.
 */
public class StreetVehicleParkingLink extends Edge {

  private final VehicleParkingEntranceVertex vehicleParkingEntranceVertex;

  private StreetVehicleParkingLink(StreetVertex fromv, VehicleParkingEntranceVertex tov) {
    super(fromv, tov);
    vehicleParkingEntranceVertex = tov;
  }

  private StreetVehicleParkingLink(VehicleParkingEntranceVertex fromv, StreetVertex tov) {
    super(fromv, tov);
    vehicleParkingEntranceVertex = fromv;
  }

  public static StreetVehicleParkingLink createStreetVehicleParkingLink(
    StreetVertex fromv,
    VehicleParkingEntranceVertex tov
  ) {
    return connectToGraph(new StreetVehicleParkingLink(fromv, tov));
  }

  public static StreetVehicleParkingLink createStreetVehicleParkingLink(
    VehicleParkingEntranceVertex fromv,
    StreetVertex tov
  ) {
    return connectToGraph(new StreetVehicleParkingLink(fromv, tov));
  }

  @Override
  public State[] traverse(State s0) {
    // Disallow traversing two StreetBikeParkLinks in a row.
    // Prevents router using bike rental stations as shortcuts to get around
    // turn restrictions.
    if (s0.getBackEdge() instanceof StreetVehicleParkingLink) {
      return State.empty();
    }

    var entrance = vehicleParkingEntranceVertex.getParkingEntrance();
    if (s0.currentMode() == TraverseMode.CAR) {
      if (!entrance.isCarAccessible()) {
        return State.empty();
      }
    } else if (!entrance.isWalkAccessible()) {
      return State.empty();
    }

    var vehicleParking = vehicleParkingEntranceVertex.getVehicleParking();
    final VehicleParkingPreferences parkingPreferences = s0
      .getRequest()
      .preferences()
      .parking(s0.currentMode());
    if (traversalBanned(parkingPreferences, vehicleParking)) {
      return State.empty();
    }

    StateEditor s1 = s0.edit(this);

    s1.incrementWeight(1);
    s1.setBackMode(null);
    return s1.makeStateArray();
  }

  private boolean traversalBanned(
    VehicleParkingPreferences parkingPreferences,
    VehicleParking vehicleParking
  ) {
    return !parkingPreferences.filter().matches(vehicleParking);
  }

  @Override
  public I18NString getName() {
    return vehicleParkingEntranceVertex.getName();
  }

  @Override
  public LineString getGeometry() {
    return GeometryUtils.makeLineString(fromv.getCoordinate(), tov.getCoordinate());
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy