org.opentripplanner.ext.flex.template.FlexAccessTemplate 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
package org.opentripplanner.ext.flex.template;
import java.time.ZonedDateTime;
import java.util.Collection;
import java.util.List;
import org.opentripplanner.ext.flex.FlexParameters;
import org.opentripplanner.ext.flex.FlexServiceDate;
import org.opentripplanner.ext.flex.edgetype.FlexTripEdge;
import org.opentripplanner.ext.flex.flexpathcalculator.FlexPathCalculator;
import org.opentripplanner.ext.flex.trip.FlexTrip;
import org.opentripplanner.model.PathTransfer;
import org.opentripplanner.model.plan.Itinerary;
import org.opentripplanner.routing.algorithm.mapping.GraphPathToItineraryMapper;
import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.graph.Edge;
import org.opentripplanner.routing.graph.Vertex;
import org.opentripplanner.routing.graphfinder.NearbyStop;
import org.opentripplanner.routing.spt.GraphPath;
import org.opentripplanner.transit.model.site.RegularStop;
import org.opentripplanner.transit.model.site.StopLocation;
import org.opentripplanner.transit.service.TransitService;
public class FlexAccessTemplate extends FlexAccessEgressTemplate {
public FlexAccessTemplate(
NearbyStop accessEgress,
FlexTrip trip,
int fromStopTime,
int toStopTime,
StopLocation transferStop,
FlexServiceDate date,
FlexPathCalculator calculator,
FlexParameters flexParams
) {
super(accessEgress, trip, fromStopTime, toStopTime, transferStop, date, calculator, flexParams);
}
public Itinerary createDirectGraphPath(
NearbyStop egress,
boolean arriveBy,
int departureTime,
ZonedDateTime startOfTime,
GraphPathToItineraryMapper graphPathToItineraryMapper
) {
List egressEdges = egress.edges;
Vertex flexToVertex = egress.state.getVertex();
if (!isRouteable(flexToVertex)) {
return null;
}
FlexTripEdge flexEdge = getFlexEdge(flexToVertex, egress.stop);
State state = flexEdge.traverse(accessEgress.state);
for (Edge e : egressEdges) {
state = e.traverse(state);
}
int[] flexTimes = getFlexTimes(flexEdge, state);
int preFlexTime = flexTimes[0];
int flexTime = flexTimes[1];
int postFlexTime = flexTimes[2];
int timeShift;
if (arriveBy) {
int lastStopArrivalTime = departureTime - postFlexTime - secondsFromStartOfTime;
int latestArrivalTime = trip.latestArrivalTime(
lastStopArrivalTime,
fromStopIndex,
toStopIndex,
flexTime
);
if (latestArrivalTime == -1) {
return null;
}
// Shift from departing at departureTime to arriving at departureTime
timeShift = secondsFromStartOfTime + latestArrivalTime - flexTime - preFlexTime;
} else {
int firstStopDepartureTime = departureTime + preFlexTime - secondsFromStartOfTime;
int earliestDepartureTime = trip.earliestDepartureTime(
firstStopDepartureTime,
fromStopIndex,
toStopIndex,
flexTime
);
if (earliestDepartureTime == -1) {
return null;
}
timeShift = secondsFromStartOfTime + earliestDepartureTime - preFlexTime;
}
ZonedDateTime startTime = startOfTime.plusSeconds(timeShift);
return graphPathToItineraryMapper
.generateItinerary(new GraphPath(state))
.withTimeShiftToStartAt(startTime);
}
protected List getTransferEdges(PathTransfer transfer) {
return transfer.getEdges();
}
protected RegularStop getFinalStop(PathTransfer transfer) {
return transfer.to instanceof RegularStop ? (RegularStop) transfer.to : null;
}
protected Collection getTransfersFromTransferStop(TransitService transitService) {
return transitService.getTransfersByStop(transferStop);
}
protected Vertex getFlexVertex(Edge edge) {
return edge.getFromVertex();
}
protected int[] getFlexTimes(FlexTripEdge flexEdge, State state) {
int preFlexTime = (int) accessEgress.state.getElapsedTimeSeconds();
int edgeTimeInSeconds = flexEdge.getTimeInSeconds();
int postFlexTime = (int) state.getElapsedTimeSeconds() - preFlexTime - edgeTimeInSeconds;
return new int[] { preFlexTime, edgeTimeInSeconds, postFlexTime };
}
protected FlexTripEdge getFlexEdge(Vertex flexToVertex, StopLocation transferStop) {
return new FlexTripEdge(
accessEgress.state.getVertex(),
flexToVertex,
accessEgress.stop,
transferStop,
trip,
this,
calculator
);
}
protected boolean isRouteable(Vertex flexVertex) {
if (accessEgress.state.getVertex() == flexVertex) {
return false;
} else return (
calculator.calculateFlexPath(
accessEgress.state.getVertex(),
flexVertex,
fromStopIndex,
toStopIndex
) !=
null
);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy