package org.opentripplanner.routing.edgetype;
import lombok.Getter;
import org.opentripplanner.common.geometry.GeometryUtils;
import org.opentripplanner.routing.core.RoutingRequest;
import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.core.StateEditor;
import org.opentripplanner.routing.core.TraverseMode;
import org.opentripplanner.routing.graph.Edge;
import org.opentripplanner.routing.vertextype.TransitStop;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.LineString;
/**
* Represents a transfer between stops that does not take the street network into account.
*/
public class SimpleTransfer extends Edge {
private static final long serialVersionUID = 1L;
@Getter
private double distance;
public SimpleTransfer(TransitStop from, TransitStop to, double distance) {
super(from, to);
this.distance = distance;
}
@Override
public State traverse(State s0) {
// use transfer edges only to transfer
// otherwise they are used as shortcuts or break the itinerary generator
// if ( ! s0.isEverBoarded())
// return null;
// if (s0.getBackEdge() instanceof SimpleTransfer)
// return null;
RoutingRequest rr = s0.getOptions();
double walkspeed = rr.getWalkSpeed();
StateEditor se = s0.edit(this);
se.setBackMode(TraverseMode.WALK);
int time = (int) (distance / walkspeed);
se.incrementTimeInSeconds(time);
se.incrementWeight(time * rr.walkReluctance);
se.incrementWalkDistance(distance);
return se.makeState();
}
@Override
public LineString getGeometry() {
TransitStop start = (TransitStop) fromv;
TransitStop end = (TransitStop) tov;
Coordinate c1 = new Coordinate(start.getLon(), start.getLat());
Coordinate c2 = new Coordinate(end.getLon(), end.getLat());
return GeometryUtils.getGeometryFactory().createLineString(new Coordinate[] {c1, c2});
}
@Override
public String getName() {
return "Simple Transfer";
}
@Override
public double weightLowerBound(RoutingRequest rr) {
int time = (int) (distance / rr.getWalkSpeed());
return (time * rr.walkReluctance);
}
}