
org.opentripplanner.street.search.strategy.EuclideanRemainingWeightHeuristic Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of otp Show documentation
Show all versions of otp Show documentation
The OpenTripPlanner multimodal journey planning system
The newest version!
package org.opentripplanner.street.search.strategy;
import java.util.Set;
import org.opentripplanner.astar.spi.RemainingWeightHeuristic;
import org.opentripplanner.framework.geometry.SphericalDistanceLibrary;
import org.opentripplanner.routing.api.request.StreetMode;
import org.opentripplanner.routing.api.request.preference.RoutingPreferences;
import org.opentripplanner.street.model.StreetConstants;
import org.opentripplanner.street.model.edge.Edge;
import org.opentripplanner.street.model.edge.FreeEdge;
import org.opentripplanner.street.model.vertex.Vertex;
import org.opentripplanner.street.search.state.State;
import org.opentripplanner.street.search.state.VehicleRentalState;
/**
* A Euclidean remaining weight strategy.
*/
public class EuclideanRemainingWeightHeuristic implements RemainingWeightHeuristic {
private static final Float DEFAULT_MAX_CAR_SPEED = StreetConstants.DEFAULT_MAX_CAR_SPEED;
private double lat;
private double lon;
private double maxStreetSpeed;
private double walkingSpeed;
private boolean arriveBy;
private float maxCarSpeed;
public EuclideanRemainingWeightHeuristic() {
this(DEFAULT_MAX_CAR_SPEED);
}
public EuclideanRemainingWeightHeuristic(Float maxCarSpeed) {
this.maxCarSpeed = maxCarSpeed != null ? maxCarSpeed : DEFAULT_MAX_CAR_SPEED;
}
// TODO This currently only uses the first toVertex. If there are multiple toVertices, it will
// not work correctly.
public void initialize(
StreetMode streetMode,
Set toVertices,
boolean arriveBy,
RoutingPreferences preferences
) {
Vertex target = toVertices.iterator().next();
maxStreetSpeed = getStreetSpeedUpperBound(preferences, streetMode);
walkingSpeed = preferences.walk().speed();
this.arriveBy = arriveBy;
if (target.getDegreeIn() == 1) {
Edge edge = target.getIncoming().iterator().next();
if (edge instanceof FreeEdge) {
target = edge.getFromVertex();
}
}
lat = target.getLat();
lon = target.getLon();
}
/** @return The highest speed for all possible road-modes. */
private double getStreetSpeedUpperBound(RoutingPreferences preferences, StreetMode streetMode) {
// Assume carSpeed > bikeSpeed > walkSpeed
if (streetMode.includesDriving()) {
return maxCarSpeed;
}
if (streetMode.includesBiking()) {
return preferences.bike().speed();
}
if (streetMode.includesScooter()) {
return preferences.scooter().speed();
}
return preferences.walk().speed();
}
/**
* On a non-transit trip, the remaining weight is simply distance / street speed.
*/
@Override
public double estimateRemainingWeight(State s) {
Vertex sv = s.getVertex();
double euclideanDistance = SphericalDistanceLibrary.fastDistance(
sv.getLat(),
sv.getLon(),
lat,
lon
);
// After parking or finishing the rental of a vehicle, you can't ever move faster than walking speed.
boolean useWalkSpeed;
if (arriveBy) {
useWalkSpeed = s.getVehicleRentalState() == VehicleRentalState.BEFORE_RENTING;
} else {
useWalkSpeed =
s.isVehicleParked() || s.getVehicleRentalState() == VehicleRentalState.HAVE_RENTED;
}
final double streetSpeed = useWalkSpeed ? walkingSpeed : maxStreetSpeed;
return euclideanDistance / streetSpeed;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy