From 53f1f769de1eb41a89c8ee72f6b05a505b706444 Mon Sep 17 00:00:00 2001 From: Zsombor Welker Date: Fri, 4 Jun 2021 13:57:22 +0200 Subject: [PATCH 1/3] FlexRouting: use the actual board / alight coordinates when creating legs For Locations the coordinate is the center point of the area, not the actual place where the transition happens. --- .../opentripplanner/ext/flex/FlexLegMapper.java | 4 ++-- .../org/opentripplanner/ext/flex/FlexRouter.java | 5 +++-- .../org/opentripplanner/model/plan/Place.java | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) 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/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) From 7cebc606f3c1368ea1496ba862b674023971a4cd Mon Sep 17 00:00:00 2001 From: Zsombor Welker Date: Fri, 4 Jun 2021 16:19:57 +0200 Subject: [PATCH 2/3] FlexRouting: use the request locale when creating itineraries --- .../ext/flex/template/FlexAccessTemplate.java | 5 +++-- .../algorithm/raptor/router/street/DirectFlexRouter.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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/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)); } } } From b5c0e119569d01a874f44c75db85195146488116 Mon Sep 17 00:00:00 2001 From: Zsombor Welker Date: Fri, 4 Jun 2021 16:25:41 +0200 Subject: [PATCH 3/3] Correctly split states which contain a mode for a single State When traversing *Link edges `backMode = null`, which in most cases doesn't cause problems. When splitting Flex states, there is only a single `BUS` state, which the logic skipped. The last-seen mode is tracked, instead of the previous mode, which correct the check for mode changes. --- .../algorithm/mapping/GraphPathToItineraryMapper.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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..4edb94c2623 100644 --- a/src/main/java/org/opentripplanner/routing/algorithm/mapping/GraphPathToItineraryMapper.java +++ b/src/main/java/org/opentripplanner/routing/algorithm/mapping/GraphPathToItineraryMapper.java @@ -202,13 +202,18 @@ private static State[][] sliceStates(State[] states) { int[] legIndexPairs = {0, states.length - 1}; List legsIndexes = new ArrayList(); + TraverseMode lastMode = null; for (int i = 1; i < states.length - 1; i++) { var backState = states[i]; var forwardState = states[i + 1]; var backMode = backState.getBackMode(); var forwardMode = forwardState.getBackMode(); - var modeChange = backMode != forwardMode && backMode != null && forwardMode != null; + if (backMode != null) { + lastMode = backMode; + } + + var modeChange = lastMode != forwardMode && lastMode != null && forwardMode != null; var parkingChange = backState.isVehicleParked() != forwardState.isVehicleParked(); var rentalChange = isRentalPickUp(backState) || isRentalDropOff(backState);