use of org.opentripplanner.model.plan.StreetLeg in project OpenTripPlanner by opentripplanner.
the class GraphPathToItineraryMapper method generateLeg.
/**
* Generate one leg of an itinerary from a list of {@link State}.
*
* @param states The list of states to base the leg on
* @param previousStep the previous walk step, so that the first relative turn direction is
* calculated correctly
* @return The generated leg
*/
private static StreetLeg generateLeg(Graph graph, List<State> states, WalkStep previousStep) {
List<Edge> edges = states.stream().skip(1).map(State::getBackEdge).collect(Collectors.toList());
State firstState = states.get(0);
State lastState = states.get(states.size() - 1);
double distanceMeters = edges.stream().mapToDouble(Edge::getDistanceMeters).sum();
CoordinateArrayListSequence coordinates = makeCoordinates(edges);
LineString geometry = GeometryUtils.getGeometryFactory().createLineString(coordinates);
List<WalkStep> walkSteps = new StatesToWalkStepsMapper(graph, states, previousStep).generateWalkSteps();
/* For the from/to vertices to be in the correct place for vehicle parking
* the state for actually parking (traversing the VehicleParkEdge) is excluded
* from the list of states.
* This adds the time for parking to the walking leg.
*/
var previousStateIsVehicleParking = firstState.getBackState() != null && firstState.getBackEdge() instanceof VehicleParkingEdge;
Calendar startTime = makeCalendar(previousStateIsVehicleParking ? firstState.getBackState() : firstState);
StreetLeg leg = new StreetLeg(resolveMode(states), startTime, makeCalendar(lastState), makePlace(firstState), makePlace(lastState), distanceMeters, (int) (lastState.getWeight() - firstState.getWeight()), geometry, walkSteps);
leg.setRentedVehicle(firstState.isRentingVehicle());
leg.setWalkingBike(false);
if (leg.getRentedVehicle()) {
String vehicleRentalNetwork = firstState.getVehicleRentalNetwork();
if (vehicleRentalNetwork != null) {
leg.setVehicleRentalNetwork(vehicleRentalNetwork);
}
}
addStreetNotes(graph, leg, states);
setPathwayInfo(leg, states);
return leg;
}
use of org.opentripplanner.model.plan.StreetLeg in project OpenTripPlanner by opentripplanner.
the class GraphPathToItineraryMapper method generateItinerary.
/**
* Generate an itinerary from a {@link GraphPath}. This method first slices the list of states
* at the leg boundaries. These smaller state arrays are then used to generate legs.
*
* @param path The graph path to base the itinerary on
* @return The generated itinerary
*/
public static Itinerary generateItinerary(GraphPath path) {
Graph graph = path.getRoutingContext().graph;
List<Leg> legs = new ArrayList<>();
WalkStep previousStep = null;
for (List<State> legStates : sliceStates(path.states)) {
if (OTPFeature.FlexRouting.isOn() && legStates.get(1).backEdge instanceof FlexTripEdge) {
legs.add(generateFlexLeg(graph, legStates));
previousStep = null;
continue;
}
StreetLeg leg = generateLeg(graph, legStates, previousStep);
legs.add(leg);
List<WalkStep> walkSteps = leg.getWalkSteps();
if (walkSteps.size() > 0) {
previousStep = walkSteps.get(walkSteps.size() - 1);
} else {
previousStep = null;
}
}
Itinerary itinerary = new Itinerary(legs);
calculateElevations(itinerary, path.edges);
State lastState = path.states.getLast();
itinerary.generalizedCost = (int) lastState.weight;
itinerary.arrivedAtDestinationWithRentedVehicle = lastState.isRentingVehicleFromStation();
return itinerary;
}
use of org.opentripplanner.model.plan.StreetLeg in project OpenTripPlanner by opentripplanner.
the class RaptorPathToItineraryMapper method mapNonTransitLeg.
private List<Leg> mapNonTransitLeg(PathLeg<TripSchedule> pathLeg, Transfer transfer, TraverseMode transferMode, Place from, Place to) {
List<Edge> edges = transfer.getEdges();
if (edges == null || edges.isEmpty()) {
return List.of(new StreetLeg(transferMode, createCalendar(pathLeg.fromTime()), createCalendar(pathLeg.toTime()), from, to, (double) transfer.getDistanceMeters(), toOtpDomainCost(pathLeg.generalizedCost()), GeometryUtils.makeLineString(transfer.getCoordinates()), List.of()));
} else {
// may be re-traversed to create the leg(s) from the list of edges.
try (RoutingRequest traverseRequest = Transfer.prepareTransferRoutingRequest(request)) {
traverseRequest.setRoutingContext(graph, (Vertex) null, null);
traverseRequest.arriveBy = false;
StateEditor se = new StateEditor(traverseRequest, edges.get(0).getFromVertex());
se.setTimeSeconds(createCalendar(pathLeg.fromTime()).getTimeInMillis() / 1000);
State s = se.makeState();
ArrayList<State> transferStates = new ArrayList<>();
transferStates.add(s);
for (Edge e : edges) {
s = e.traverse(s);
transferStates.add(s);
}
State[] states = transferStates.toArray(new State[0]);
GraphPath graphPath = new GraphPath(states[states.length - 1]);
Itinerary subItinerary = GraphPathToItineraryMapper.generateItinerary(graphPath);
if (subItinerary.legs.isEmpty()) {
return List.of();
}
return subItinerary.legs;
}
}
}
Aggregations