diff --git a/src/ext/java/org/opentripplanner/ext/flex/FlexLegMapper.java b/src/ext/java/org/opentripplanner/ext/flex/FlexLegMapper.java index c7fbba3bb4f..bac15fcf5c7 100644 --- a/src/ext/java/org/opentripplanner/ext/flex/FlexLegMapper.java +++ b/src/ext/java/org/opentripplanner/ext/flex/FlexLegMapper.java @@ -27,7 +27,7 @@ static public void fixFlexTripLeg(Leg leg, FlexTripEdge flexTripEdge) { } public static void addFlexPlaces(Leg leg, FlexTripEdge flexEdge, Locale requestedLocale) { - leg.from = Place.forStop(flexEdge.s1, flexEdge.flexTemplate.fromStopIndex, null); - leg.to = Place.forStop(flexEdge.s2, flexEdge.flexTemplate.toStopIndex, null); + leg.from = Place.forFlexStop(flexEdge.s1, flexEdge.getFromVertex(), flexEdge.flexTemplate.fromStopIndex, null); + leg.to = Place.forFlexStop(flexEdge.s2, flexEdge.getToVertex(), flexEdge.flexTemplate.toStopIndex, null); } } diff --git a/src/ext/java/org/opentripplanner/ext/flex/FlexRouter.java b/src/ext/java/org/opentripplanner/ext/flex/FlexRouter.java index f39d5c6c35e..6af763a930e 100644 --- a/src/ext/java/org/opentripplanner/ext/flex/FlexRouter.java +++ b/src/ext/java/org/opentripplanner/ext/flex/FlexRouter.java @@ -2,6 +2,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import java.util.Locale; import org.opentripplanner.common.model.T2; import org.opentripplanner.ext.flex.flexpathcalculator.FlexPathCalculator; import org.opentripplanner.ext.flex.flexpathcalculator.StreetFlexPathCalculator; @@ -88,7 +89,7 @@ public FlexRouter( } } - public Collection createFlexOnlyItineraries() { + public Collection createFlexOnlyItineraries(Locale locale) { calculateFlexAccessTemplates(); calculateFlexEgressTemplates(); @@ -103,7 +104,7 @@ public Collection createFlexOnlyItineraries() { StopLocation transferStop = template.getTransferStop(); if (this.flexEgressTemplates.stream().anyMatch(t -> t.getAccessEgressStop().equals(transferStop))) { for(NearbyStop egress : streetEgressByStop.get(transferStop)) { - Itinerary itinerary = template.createDirectItinerary(egress, arriveBy, departureTime, startOfTime); + Itinerary itinerary = template.createDirectItinerary(egress, arriveBy, departureTime, startOfTime, locale); if (itinerary != null) { itineraries.add(itinerary); } diff --git a/src/ext/java/org/opentripplanner/ext/flex/template/FlexAccessTemplate.java b/src/ext/java/org/opentripplanner/ext/flex/template/FlexAccessTemplate.java index 65d64266a9e..b3a5e260f6a 100644 --- a/src/ext/java/org/opentripplanner/ext/flex/template/FlexAccessTemplate.java +++ b/src/ext/java/org/opentripplanner/ext/flex/template/FlexAccessTemplate.java @@ -32,7 +32,8 @@ public FlexAccessTemplate( } public Itinerary createDirectItinerary( - NearbyStop egress, boolean arriveBy, int departureTime, ZonedDateTime startOfTime + NearbyStop egress, boolean arriveBy, int departureTime, ZonedDateTime startOfTime, + Locale locale ) { List egressEdges = egress.edges; @@ -89,7 +90,7 @@ public Itinerary createDirectItinerary( Itinerary itinerary = GraphPathToItineraryMapper.generateItinerary( new GraphPath(state), - Locale.ENGLISH + locale ); ZonedDateTime zdt = startOfTime.plusSeconds(timeShift); diff --git a/src/main/java/org/opentripplanner/model/plan/Place.java b/src/main/java/org/opentripplanner/model/plan/Place.java index a9a94a84874..d6785999963 100644 --- a/src/main/java/org/opentripplanner/model/plan/Place.java +++ b/src/main/java/org/opentripplanner/model/plan/Place.java @@ -136,6 +136,22 @@ public static Place forStop(StopLocation stop, Integer stopIndex, Integer stopSe .build(); } + public static Place forFlexStop( + StopLocation stop, + Vertex vertex, + Integer stopIndex, + Integer stopSequence + ) { + // The actual vertex is used because the StopLocation coordinates may not be equal to the vertex's + // coordinates. + return defaults(vertex, stop.getName()) + .vertexType(VertexType.TRANSIT) + .stop(stop) + .stopIndex(stopIndex) + .stopSequence(stopSequence) + .build(); + } + public static Place forStop(TransitStopVertex vertex, String name) { return defaults(vertex, name) .vertexType(VertexType.TRANSIT) diff --git a/src/main/java/org/opentripplanner/routing/algorithm/mapping/GraphPathToItineraryMapper.java b/src/main/java/org/opentripplanner/routing/algorithm/mapping/GraphPathToItineraryMapper.java index 0ce860a389a..9c7fa51c388 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/mapping/GraphPathToItineraryMapper.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/mapping/GraphPathToItineraryMapper.java @@ -211,6 +211,7 @@ private static State[][] sliceStates(State[] states) { var modeChange = backMode != forwardMode && backMode != null && forwardMode != null; var parkingChange = backState.isVehicleParked() != forwardState.isVehicleParked(); var rentalChange = isRentalPickUp(backState) || isRentalDropOff(backState); + var flexEdge = forwardState.getBackEdge() instanceof FlexTripEdge; if (parkingChange) { /* Remove the state for actually parking (traversing VehicleParkingEdge) from the @@ -221,7 +222,7 @@ private static State[][] sliceStates(State[] states) { legsIndexes.add(legIndexPairs); legIndexPairs = new int[] {i + 1, states.length - 1}; } - else if (modeChange || rentalChange) { + else if (modeChange || rentalChange || flexEdge) { legIndexPairs[1] = i; legsIndexes.add(legIndexPairs); legIndexPairs = new int[] {i, states.length - 1}; diff --git a/src/main/java/org/opentripplanner/routing/algorithm/raptor/router/street/DirectFlexRouter.java b/src/main/java/org/opentripplanner/routing/algorithm/raptor/router/street/DirectFlexRouter.java index e92df8cf6c7..7dc6190bbbe 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/raptor/router/street/DirectFlexRouter.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/raptor/router/street/DirectFlexRouter.java @@ -49,7 +49,7 @@ public static List route( egressStops ); - return new ArrayList<>(flexRouter.createFlexOnlyItineraries()); + return new ArrayList<>(flexRouter.createFlexOnlyItineraries(request.locale)); } } }