Skip to content

Commit 81797e3

Browse files
committed
Add support for via locations in access/egress
1 parent 5a8e641 commit 81797e3

File tree

12 files changed

+469
-87
lines changed

12 files changed

+469
-87
lines changed

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/TransitRouter.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
import org.opentripplanner.raptor.spi.ExtraMcRouterSearch;
2424
import org.opentripplanner.routing.algorithm.mapping.RaptorPathToItineraryMapper;
2525
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.AccessEgressPenaltyDecorator;
26+
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.AccessEgressRouter;
27+
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.AccessEgressRouterFactory;
2628
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.AccessEgressType;
2729
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.AccessEgresses;
28-
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.DefaultAccessEgressRouter;
2930
import org.opentripplanner.routing.algorithm.raptoradapter.router.street.FlexAccessEgressRouter;
3031
import org.opentripplanner.routing.algorithm.raptoradapter.transit.RaptorTransitData;
3132
import org.opentripplanner.routing.algorithm.raptoradapter.transit.RoutingAccessEgress;
@@ -63,7 +64,7 @@ public class TransitRouter {
6364
private final AdditionalSearchDays additionalSearchDays;
6465
private final ViaCoordinateTransferFactory viaTransferResolver;
6566
private final LinkingContext linkingContext;
66-
private final DefaultAccessEgressRouter accessEgressRouter;
67+
private final AccessEgressRouter accessEgressRouter;
6768

6869
private TransitRouter(
6970
RouteRequest request,
@@ -82,7 +83,8 @@ private TransitRouter(
8283
this.debugTimingAggregator = debugTimingAggregator;
8384
this.viaTransferResolver = serverContext.viaTransferResolver();
8485
this.linkingContext = linkingContext;
85-
this.accessEgressRouter = new DefaultAccessEgressRouter(
86+
this.accessEgressRouter = AccessEgressRouterFactory.create(
87+
request,
8688
new TransitServiceResolver(serverContext.transitService())
8789
);
8890
}
@@ -274,11 +276,13 @@ private Collection<? extends RoutingAccessEgress> fetchAccessEgresses(AccessEgre
274276
var nearbyStops = accessEgressRouter.findAccessEgresses(
275277
accessRequest,
276278
streetRequest,
279+
serverContext.traverseVisitor(),
277280
serverContext.listExtensionRequestContexts(accessRequest),
278281
type,
279282
durationLimit,
280283
stopCountLimit,
281-
linkingContext
284+
linkingContext,
285+
serverContext.streetLimitationParametersService().maxCarSpeed()
282286
);
283287
var accessEgresses = AccessEgressMapper.mapNearbyStops(nearbyStops, type);
284288
accessEgresses = timeshiftRideHailing(streetRequest, type, accessEgresses);

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/AccessEgressRouter.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@
55
import java.util.List;
66
import java.util.Set;
77
import java.util.stream.Collectors;
8+
import org.opentripplanner.astar.spi.TraverseVisitor;
89
import org.opentripplanner.framework.application.OTPRequestTimeoutException;
910
import org.opentripplanner.graph_builder.module.nearbystops.StopResolver;
1011
import org.opentripplanner.routing.api.request.RouteRequest;
1112
import org.opentripplanner.routing.api.request.request.StreetRequest;
1213
import org.opentripplanner.routing.graphfinder.NearbyStop;
1314
import org.opentripplanner.routing.graphfinder.NearbyStopFactory;
1415
import org.opentripplanner.routing.linking.LinkingContext;
16+
import org.opentripplanner.street.model.edge.Edge;
1517
import org.opentripplanner.street.model.edge.ExtensionRequestContext;
1618
import org.opentripplanner.street.model.vertex.Vertex;
19+
import org.opentripplanner.street.search.state.State;
1720
import org.opentripplanner.utils.collection.ListUtils;
1821
import org.slf4j.Logger;
1922
import org.slf4j.LoggerFactory;
@@ -27,7 +30,7 @@ public abstract class AccessEgressRouter {
2730
private static final Logger LOG = LoggerFactory.getLogger(AccessEgressRouter.class);
2831
private final NearbyStopFactory nearbyStopFactory;
2932

30-
public AccessEgressRouter(StopResolver stopResolver) {
33+
AccessEgressRouter(StopResolver stopResolver) {
3134
this.nearbyStopFactory = new NearbyStopFactory(stopResolver::getRegularStop);
3235
}
3336

@@ -37,11 +40,13 @@ public AccessEgressRouter(StopResolver stopResolver) {
3740
public Collection<NearbyStop> findAccessEgresses(
3841
RouteRequest request,
3942
StreetRequest streetRequest,
43+
TraverseVisitor<State, Edge> traverseVisitor,
4044
Collection<ExtensionRequestContext> extensionRequestContexts,
4145
AccessEgressType accessOrEgress,
4246
Duration durationLimit,
4347
int maxStopCount,
44-
LinkingContext linkingContext
48+
LinkingContext linkingContext,
49+
float maxCarSpeed
4550
) {
4651
OTPRequestTimeoutException.checkForTimeout();
4752

@@ -64,12 +69,14 @@ public Collection<NearbyStop> findAccessEgresses(
6469
var streetAccessEgress = findStreetAccessEgresses(
6570
request,
6671
streetRequest,
72+
traverseVisitor,
6773
extensionRequestContexts,
6874
accessOrEgress,
6975
durationLimit,
7076
maxStopCount,
7177
linkingContext,
72-
ignoreVertices
78+
ignoreVertices,
79+
maxCarSpeed
7380
);
7481

7582
var results = ListUtils.combine(zeroDistanceAccessEgress, streetAccessEgress);
@@ -83,12 +90,14 @@ public Collection<NearbyStop> findAccessEgresses(
8390
abstract Collection<NearbyStop> findStreetAccessEgresses(
8491
RouteRequest request,
8592
StreetRequest streetRequest,
93+
TraverseVisitor<State, Edge> traverseVisitor,
8694
Collection<ExtensionRequestContext> extensionRequestContexts,
8795
AccessEgressType accessOrEgress,
8896
Duration durationLimit,
8997
int maxStopCount,
9098
LinkingContext linkingContext,
91-
Set<Vertex> ignoreVertices
99+
Set<Vertex> ignoreVertices,
100+
float maxCarSpeed
92101
);
93102

94103
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.opentripplanner.routing.algorithm.raptoradapter.router.street;
2+
3+
import org.opentripplanner.graph_builder.module.nearbystops.StopResolver;
4+
import org.opentripplanner.routing.api.request.RouteRequest;
5+
6+
/**
7+
* This factory encapsulates the logic for deciding which access/egress router to use.
8+
*/
9+
public class AccessEgressRouterFactory {
10+
11+
/**
12+
* @return {@link DefaultAccessEgressRouter} if there are no via locations, otherwise
13+
* {@link ViaAccessEgressRouter}.
14+
*/
15+
public static AccessEgressRouter create(RouteRequest request, StopResolver stopResolver) {
16+
return request.isViaSearch()
17+
? new ViaAccessEgressRouter(stopResolver)
18+
: new DefaultAccessEgressRouter(stopResolver);
19+
}
20+
}

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DefaultAccessEgressRouter.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import java.time.Duration;
44
import java.util.Collection;
55
import java.util.Set;
6+
import org.opentripplanner.astar.spi.TraverseVisitor;
67
import org.opentripplanner.graph_builder.module.nearbystops.StopResolver;
78
import org.opentripplanner.graph_builder.module.nearbystops.StreetNearbyStopFinder;
89
import org.opentripplanner.routing.api.request.RouteRequest;
910
import org.opentripplanner.routing.api.request.request.StreetRequest;
1011
import org.opentripplanner.routing.graphfinder.NearbyStop;
1112
import org.opentripplanner.routing.linking.LinkingContext;
13+
import org.opentripplanner.street.model.edge.Edge;
1214
import org.opentripplanner.street.model.edge.ExtensionRequestContext;
1315
import org.opentripplanner.street.model.vertex.Vertex;
16+
import org.opentripplanner.street.search.state.State;
1417

1518
/**
1619
* This uses a street search to find paths to all the access/egress stop within range. Doesn't
@@ -20,24 +23,23 @@ public class DefaultAccessEgressRouter extends AccessEgressRouter {
2023

2124
private final StopResolver stopResolver;
2225

23-
public DefaultAccessEgressRouter(StopResolver stopResolver) {
26+
DefaultAccessEgressRouter(StopResolver stopResolver) {
2427
super(stopResolver);
2528
this.stopResolver = stopResolver;
2629
}
2730

28-
/**
29-
* Find accesses or egresses.
30-
*/
3131
@Override
3232
Collection<NearbyStop> findStreetAccessEgresses(
3333
RouteRequest request,
3434
StreetRequest streetRequest,
35+
TraverseVisitor<State, Edge> traverseVisitor,
3536
Collection<ExtensionRequestContext> extensionRequestContexts,
3637
AccessEgressType accessOrEgress,
3738
Duration durationLimit,
3839
int maxStopCount,
3940
LinkingContext linkingContext,
40-
Set<Vertex> ignoreVertices
41+
Set<Vertex> ignoreVertices,
42+
float maxCarSpeed
4143
) {
4244
var originVertices = accessOrEgress.isAccess()
4345
? linkingContext.findVertices(request.from())

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/DirectFlexRouter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,24 @@ public static List<Itinerary> route(
3535
Collection<NearbyStop> accessStops = accessEgressRouter.findAccessEgresses(
3636
request,
3737
request.journey().direct(),
38+
serverContext.traverseVisitor(),
3839
serverContext.listExtensionRequestContexts(request),
3940
AccessEgressType.ACCESS,
4041
serverContext.flexParameters().maxAccessWalkDuration(),
4142
0,
42-
linkingContext
43+
linkingContext,
44+
serverContext.streetLimitationParametersService().maxCarSpeed()
4345
);
4446
Collection<NearbyStop> egressStops = accessEgressRouter.findAccessEgresses(
4547
request,
4648
request.journey().direct(),
49+
serverContext.traverseVisitor(),
4750
serverContext.listExtensionRequestContexts(request),
4851
AccessEgressType.EGRESS,
4952
serverContext.flexParameters().maxEgressWalkDuration(),
5053
0,
51-
linkingContext
54+
linkingContext,
55+
serverContext.streetLimitationParametersService().maxCarSpeed()
5256
);
5357

5458
var flexRouter = new FlexRouter(

application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/router/street/FlexAccessEgressRouter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private FlexAccessEgressRouter() {}
2323

2424
public static Collection<FlexAccessEgress> routeAccessEgress(
2525
RouteRequest request,
26-
DefaultAccessEgressRouter accessEgressRouter,
26+
AccessEgressRouter accessEgressRouter,
2727
OtpServerRequestContext serverContext,
2828
AdditionalSearchDays searchDays,
2929
FlexParameters config,
@@ -39,23 +39,27 @@ public static Collection<FlexAccessEgress> routeAccessEgress(
3939
? accessEgressRouter.findAccessEgresses(
4040
request,
4141
new StreetRequest(StreetMode.WALK),
42+
serverContext.traverseVisitor(),
4243
extensionRequestContexts,
4344
AccessEgressType.ACCESS,
4445
serverContext.flexParameters().maxAccessWalkDuration(),
4546
0,
46-
linkingContext
47+
linkingContext,
48+
serverContext.streetLimitationParametersService().maxCarSpeed()
4749
)
4850
: List.of();
4951

5052
Collection<NearbyStop> egressStops = accessOrEgress.isEgress()
5153
? accessEgressRouter.findAccessEgresses(
5254
request,
5355
new StreetRequest(StreetMode.WALK),
56+
serverContext.traverseVisitor(),
5457
extensionRequestContexts,
5558
AccessEgressType.EGRESS,
5659
serverContext.flexParameters().maxEgressWalkDuration(),
5760
0,
58-
linkingContext
61+
linkingContext,
62+
serverContext.streetLimitationParametersService().maxCarSpeed()
5963
)
6064
: List.of();
6165

0 commit comments

Comments
 (0)