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

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

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

import java.io.Serializable;
import org.locationtech.jts.geom.impl.PackedCoordinateSequence;
import org.opentripplanner.framework.geometry.CompactElevationProfile;
import org.opentripplanner.utils.tostring.ToStringBuilder;

public class StreetElevationExtension implements Serializable {

  /**
   * Distance of the edge projected on a 2d plane.
   */
  private final double distanceMeters;

  private final byte[] compactedElevationProfile;

  private final PackedCoordinateSequence packedElevationProfile;

  private final double effectiveBicycleSafetyDistance;

  private final double effectiveBikeDistance;

  private final double effectiveBikeDistanceForWorkCost;

  private final double effectiveWalkDistance;

  private final double effectiveWalkSafetyDistance;

  private final double distanceWithElevation;

  private final float maxSlope;

  private final boolean flattened;

  StreetElevationExtension(
    double distanceMeters,
    boolean computed,
    PackedCoordinateSequence packedElevationProfile,
    float effectiveBicycleSafetyFactor,
    double effectiveBikeDistanceFactor,
    double effectiveBikeWorkFactor,
    double effectiveWalkDistanceFactor,
    double effectiveWalkSafetyFactor,
    double lengthMultiplier,
    float maxSlope,
    boolean flattened
  ) {
    this.distanceMeters = distanceMeters;
    this.effectiveBicycleSafetyDistance = effectiveBicycleSafetyFactor * distanceMeters;
    this.effectiveBikeDistance = effectiveBikeDistanceFactor * distanceMeters;
    this.effectiveBikeDistanceForWorkCost = effectiveBikeWorkFactor * distanceMeters;
    this.effectiveWalkDistance = effectiveWalkDistanceFactor * distanceMeters;
    this.effectiveWalkSafetyDistance = effectiveWalkSafetyFactor * distanceMeters;
    this.distanceWithElevation = lengthMultiplier * distanceMeters;
    this.maxSlope = maxSlope;
    this.flattened = flattened;

    if (computed) {
      this.compactedElevationProfile = null;
      this.packedElevationProfile = packedElevationProfile;
    } else {
      this.compactedElevationProfile =
        CompactElevationProfile.compactElevationProfileWithRegularSamples(packedElevationProfile);
      this.packedElevationProfile = null;
    }
  }

  public PackedCoordinateSequence getElevationProfile() {
    if (compactedElevationProfile != null) {
      return CompactElevationProfile.uncompactElevationProfileWithRegularSamples(
        compactedElevationProfile,
        distanceMeters
      );
    } else {
      return packedElevationProfile;
    }
  }

  /**
   * The distance multiplied by the {@link StreetEdge#getBicycleSafetyFactor()} }, but also considering the
   * increased length caused by the slope.
   */
  public double getEffectiveBicycleSafetyDistance() {
    return effectiveBicycleSafetyDistance;
  }

  /**
   * The distance multiplied by a factor considering how much faster/slower it is to bile the edge,
   * compared to if it was flat.
   */
  public double getEffectiveBikeDistance() {
    return effectiveBikeDistance;
  }

  /**
   * The distance multiplied by a factor considering how much more/less convenient it is to bike
   * the edge, compared to if it was flat. This is calculated form the energy usage of the cyclist.
   */
  public double getEffectiveBikeDistanceForWorkCost() {
    return effectiveBikeDistanceForWorkCost;
  }

  /**
   * The distance multiplied by a factor considering how much faster/slower it is to walk the edge,
   * compared to if it was flat.
   */
  public double getEffectiveWalkDistance() {
    return effectiveWalkDistance;
  }

  /**
   * The distance multiplied by the {@link StreetEdge#getWalkSafetyFactor()}, but also considering the
   * increased length caused by the slope.
   */
  public double getEffectiveWalkSafetyDistance() {
    return effectiveWalkSafetyDistance;
  }

  /**
   * Physical distance which takes the elevation into account. The distanceMeters is a 2d distance.
   */
  public double getDistanceWithElevation() {
    return distanceWithElevation;
  }

  public float getMaxSlope() {
    return this.maxSlope;
  }

  public boolean isFlattened() {
    return this.flattened;
  }

  public String toString() {
    return ToStringBuilder.of(StreetElevationExtension.class)
      .addBoolIfTrue("flattened", flattened)
      .addNum("distanceMeters", distanceMeters)
      .addNum("effectiveBicycleSafetyFactor", effectiveBicycleSafetyDistance)
      .addNum("effectiveBikeDistance", effectiveBikeDistance)
      .addNum("effectiveBikeDistanceForWorkCost", effectiveBikeDistanceForWorkCost)
      .addNum("effectiveWalkDistance", effectiveWalkDistance)
      .addNum("maxSlope", maxSlope)
      .toString();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy