Search in sources :

Example 1 with StreetLeg

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;
}
Also used : Calendar(java.util.Calendar) I18NString(org.opentripplanner.util.I18NString) LineString(org.locationtech.jts.geom.LineString) WalkStep(org.opentripplanner.model.plan.WalkStep) VehicleParkingEdge(org.opentripplanner.routing.edgetype.VehicleParkingEdge) CoordinateArrayListSequence(org.opentripplanner.api.resource.CoordinateArrayListSequence) LineString(org.locationtech.jts.geom.LineString) State(org.opentripplanner.routing.core.State) StreetLeg(org.opentripplanner.model.plan.StreetLeg) StreetEdge(org.opentripplanner.routing.edgetype.StreetEdge) VehicleRentalEdge(org.opentripplanner.routing.edgetype.VehicleRentalEdge) PathwayEdge(org.opentripplanner.routing.edgetype.PathwayEdge) VehicleParkingEdge(org.opentripplanner.routing.edgetype.VehicleParkingEdge) FlexTripEdge(org.opentripplanner.ext.flex.edgetype.FlexTripEdge) Edge(org.opentripplanner.routing.graph.Edge)

Example 2 with StreetLeg

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;
}
Also used : Graph(org.opentripplanner.routing.graph.Graph) State(org.opentripplanner.routing.core.State) FlexTripEdge(org.opentripplanner.ext.flex.edgetype.FlexTripEdge) StreetLeg(org.opentripplanner.model.plan.StreetLeg) ArrayList(java.util.ArrayList) Itinerary(org.opentripplanner.model.plan.Itinerary) WalkStep(org.opentripplanner.model.plan.WalkStep) FlexibleTransitLeg(org.opentripplanner.ext.flex.FlexibleTransitLeg) Leg(org.opentripplanner.model.plan.Leg) StreetLeg(org.opentripplanner.model.plan.StreetLeg)

Example 3 with StreetLeg

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;
        }
    }
}
Also used : StateEditor(org.opentripplanner.routing.core.StateEditor) StreetLeg(org.opentripplanner.model.plan.StreetLeg) State(org.opentripplanner.routing.core.State) ArrayList(java.util.ArrayList) GraphPath(org.opentripplanner.routing.spt.GraphPath) Itinerary(org.opentripplanner.model.plan.Itinerary) RoutingRequest(org.opentripplanner.routing.api.request.RoutingRequest) Edge(org.opentripplanner.routing.graph.Edge)

Aggregations

StreetLeg (org.opentripplanner.model.plan.StreetLeg)3 State (org.opentripplanner.routing.core.State)3 ArrayList (java.util.ArrayList)2 FlexTripEdge (org.opentripplanner.ext.flex.edgetype.FlexTripEdge)2 Itinerary (org.opentripplanner.model.plan.Itinerary)2 WalkStep (org.opentripplanner.model.plan.WalkStep)2 Edge (org.opentripplanner.routing.graph.Edge)2 Calendar (java.util.Calendar)1 LineString (org.locationtech.jts.geom.LineString)1 CoordinateArrayListSequence (org.opentripplanner.api.resource.CoordinateArrayListSequence)1 FlexibleTransitLeg (org.opentripplanner.ext.flex.FlexibleTransitLeg)1 Leg (org.opentripplanner.model.plan.Leg)1 RoutingRequest (org.opentripplanner.routing.api.request.RoutingRequest)1 StateEditor (org.opentripplanner.routing.core.StateEditor)1 PathwayEdge (org.opentripplanner.routing.edgetype.PathwayEdge)1 StreetEdge (org.opentripplanner.routing.edgetype.StreetEdge)1 VehicleParkingEdge (org.opentripplanner.routing.edgetype.VehicleParkingEdge)1 VehicleRentalEdge (org.opentripplanner.routing.edgetype.VehicleRentalEdge)1 Graph (org.opentripplanner.routing.graph.Graph)1 GraphPath (org.opentripplanner.routing.spt.GraphPath)1