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

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

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

import static org.opentripplanner.street.model.edge.StreetEdge.BACK_FLAG_INDEX;
import static org.opentripplanner.street.model.edge.StreetEdge.BICYCLE_NOTHRUTRAFFIC;
import static org.opentripplanner.street.model.edge.StreetEdge.CLASS_LINK;
import static org.opentripplanner.street.model.edge.StreetEdge.MOTOR_VEHICLE_NOTHRUTRAFFIC;
import static org.opentripplanner.street.model.edge.StreetEdge.NAME_IS_DERIVED_FLAG_INDEX;
import static org.opentripplanner.street.model.edge.StreetEdge.ROUNDABOUT_FLAG_INDEX;
import static org.opentripplanner.street.model.edge.StreetEdge.SLOPEOVERRIDE_FLAG_INDEX;
import static org.opentripplanner.street.model.edge.StreetEdge.STAIRS_FLAG_INDEX;
import static org.opentripplanner.street.model.edge.StreetEdge.WALK_NOTHRUTRAFFIC;
import static org.opentripplanner.street.model.edge.StreetEdge.WHEELCHAIR_ACCESSIBLE_FLAG_INDEX;

import org.locationtech.jts.geom.LineString;
import org.opentripplanner.framework.i18n.I18NString;
import org.opentripplanner.framework.i18n.NonLocalizedString;
import org.opentripplanner.street.model.StreetTraversalPermission;
import org.opentripplanner.street.model.vertex.StreetVertex;
import org.opentripplanner.street.search.TraverseMode;
import org.opentripplanner.utils.lang.BitSetUtils;

public class StreetEdgeBuilder> {

  // TODO(flamholz): do something smarter with the car speed here.
  public static final float DEFAULT_CAR_SPEED = 11.2f;
  public static final float DEFAULT_WALK_SAFETY_FACTOR = 1.0f;
  private static final float DEFAULT_BICYCLE_SAFETY_FACTOR = 1.0f;

  private StreetVertex from;
  private StreetVertex to;
  private LineString geometry;
  private I18NString name;
  private int millimeterLength;
  private StreetTraversalPermission permission;
  private boolean defaultLength;
  private float carSpeed;
  private float walkSafetyFactor;
  private float bicycleSafetyFactor;
  private short flags;
  private StreetElevationExtension streetElevationExtension;

  public StreetEdgeBuilder() {
    this.defaultLength = true;
    this.walkSafetyFactor = DEFAULT_WALK_SAFETY_FACTOR;
    this.bicycleSafetyFactor = DEFAULT_BICYCLE_SAFETY_FACTOR;
    this.carSpeed = DEFAULT_CAR_SPEED;
    withWheelchairAccessible(true);
  }

  public StreetEdgeBuilder(StreetEdge original) {
    this.from = (StreetVertex) original.getFromVertex();
    this.to = (StreetVertex) original.getToVertex();
    this.geometry = original.getGeometry();
    this.name = original.getName();
    this.millimeterLength = original.getMillimeterLength();
    this.permission = original.getPermission();
    this.defaultLength = false;
    this.carSpeed = original.getCarSpeed();
    this.walkSafetyFactor = original.getWalkSafetyFactor();
    this.bicycleSafetyFactor = original.getBicycleSafetyFactor();
    this.flags = original.getFlags();
  }

  public StreetEdge buildAndConnect() {
    return Edge.connectToGraph(new StreetEdge(this));
  }

  public StreetVertex fromVertex() {
    return from;
  }

  public B withFromVertex(StreetVertex from) {
    this.from = from;
    return instance();
  }

  public StreetVertex toVertex() {
    return to;
  }

  public B withToVertex(StreetVertex to) {
    this.to = to;
    return instance();
  }

  public LineString geometry() {
    return geometry;
  }

  public B withGeometry(LineString geometry) {
    this.geometry = geometry;
    return instance();
  }

  public I18NString name() {
    return name;
  }

  public B withName(I18NString name) {
    this.name = name;
    return instance();
  }

  public B withName(String name) {
    this.name = new NonLocalizedString(name);
    return instance();
  }

  public int millimeterLength() {
    return millimeterLength;
  }

  public B withMeterLength(double length) {
    return withMilliMeterLength((int) (length * 1000));
  }

  public B withMilliMeterLength(int length) {
    this.millimeterLength = length;
    this.defaultLength = false;
    return instance();
  }

  public boolean hasDefaultLength() {
    return defaultLength;
  }

  public StreetTraversalPermission permission() {
    return permission;
  }

  public B withPermission(StreetTraversalPermission permission) {
    this.permission = permission;
    return instance();
  }

  public float carSpeed() {
    return carSpeed;
  }

  public B withCarSpeed(float carSpeed) {
    this.carSpeed = carSpeed;
    return instance();
  }

  public float walkSafetyFactor() {
    return walkSafetyFactor;
  }

  public B withWalkSafetyFactor(float walkSafetyFactor) {
    this.walkSafetyFactor = walkSafetyFactor;
    return instance();
  }

  public float bicycleSafetyFactor() {
    return bicycleSafetyFactor;
  }

  public B withBicycleSafetyFactor(float bicycleSafetyFactor) {
    this.bicycleSafetyFactor = bicycleSafetyFactor;
    return instance();
  }

  public short getFlags() {
    return flags;
  }

  public B withBack(boolean back) {
    flags = BitSetUtils.set(flags, BACK_FLAG_INDEX, back);
    return instance();
  }

  public B withLink(boolean link) {
    flags = BitSetUtils.set(flags, CLASS_LINK, link);
    return instance();
  }

  public B withBogusName(boolean hasBogusName) {
    flags = BitSetUtils.set(flags, NAME_IS_DERIVED_FLAG_INDEX, hasBogusName);
    return instance();
  }

  public B withStairs(boolean stairs) {
    flags = BitSetUtils.set(flags, STAIRS_FLAG_INDEX, stairs);
    return instance();
  }

  public B withWheelchairAccessible(boolean wheelchairAccessible) {
    flags = BitSetUtils.set(flags, WHEELCHAIR_ACCESSIBLE_FLAG_INDEX, wheelchairAccessible);
    return instance();
  }

  public B withSlopeOverride(boolean slopeOverride) {
    flags = BitSetUtils.set(flags, SLOPEOVERRIDE_FLAG_INDEX, slopeOverride);
    return instance();
  }

  public B withRoundabout(boolean roundabout) {
    flags = BitSetUtils.set(flags, ROUNDABOUT_FLAG_INDEX, roundabout);
    return instance();
  }

  public B withMotorVehicleNoThruTraffic(boolean motorVehicleNoThruTraffic) {
    flags = BitSetUtils.set(flags, MOTOR_VEHICLE_NOTHRUTRAFFIC, motorVehicleNoThruTraffic);
    return instance();
  }

  public B withBicycleNoThruTraffic(boolean bicycleNoThruTraffic) {
    flags = BitSetUtils.set(flags, BICYCLE_NOTHRUTRAFFIC, bicycleNoThruTraffic);
    return instance();
  }

  public B withWalkNoThruTraffic(boolean walkNoThruTraffic) {
    flags = BitSetUtils.set(flags, WALK_NOTHRUTRAFFIC, walkNoThruTraffic);
    return instance();
  }

  public B withNoThruTrafficTraverseMode(TraverseMode noThruTrafficTraverseMode) {
    if (noThruTrafficTraverseMode == null) {
      return instance();
    }
    switch (noThruTrafficTraverseMode) {
      case WALK -> withWalkNoThruTraffic(true);
      case BICYCLE, SCOOTER -> withBicycleNoThruTraffic(true);
      case CAR, FLEX -> withMotorVehicleNoThruTraffic(true);
    }
    return instance();
  }

  public boolean slopeOverride() {
    return BitSetUtils.get(flags, SLOPEOVERRIDE_FLAG_INDEX);
  }

  public boolean stairs() {
    return BitSetUtils.get(flags, STAIRS_FLAG_INDEX);
  }

  public B withFlags(short flags) {
    this.flags = flags;
    return instance();
  }

  public B withElevationExtension(StreetElevationExtension streetElevationExtension) {
    this.streetElevationExtension = streetElevationExtension;
    return instance();
  }

  public StreetElevationExtension streetElevationExtension() {
    return streetElevationExtension;
  }

  @SuppressWarnings("unchecked")
  final B instance() {
    return (B) this;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy