|
2 | 2 |
|
3 | 3 | import java.time.Duration; |
4 | 4 | import java.util.Collection; |
5 | | -import java.util.List; |
6 | | -import java.util.stream.Collectors; |
7 | | -import org.opentripplanner.framework.application.OTPRequestTimeoutException; |
| 5 | +import java.util.Set; |
8 | 6 | import org.opentripplanner.graph_builder.module.nearbystops.StopResolver; |
9 | 7 | import org.opentripplanner.graph_builder.module.nearbystops.StreetNearbyStopFinder; |
10 | 8 | import org.opentripplanner.routing.api.request.RouteRequest; |
11 | 9 | import org.opentripplanner.routing.api.request.request.StreetRequest; |
12 | 10 | import org.opentripplanner.routing.graphfinder.NearbyStop; |
13 | | -import org.opentripplanner.routing.graphfinder.NearbyStopFactory; |
14 | 11 | import org.opentripplanner.routing.linking.LinkingContext; |
15 | 12 | import org.opentripplanner.street.model.edge.ExtensionRequestContext; |
16 | | -import org.opentripplanner.utils.collection.ListUtils; |
17 | | -import org.slf4j.Logger; |
18 | | -import org.slf4j.LoggerFactory; |
| 13 | +import org.opentripplanner.street.model.vertex.Vertex; |
19 | 14 |
|
20 | 15 | /** |
21 | | - * This uses a street search to find paths to all the access/egress stop within range |
| 16 | + * This uses a street search to find paths to all the access/egress stop within range. Doesn't |
| 17 | + * support routing through via locations. |
22 | 18 | */ |
23 | | -public class DefaultAccessEgressRouter { |
| 19 | +public class DefaultAccessEgressRouter extends AccessEgressRouter { |
24 | 20 |
|
25 | | - private static final Logger LOG = LoggerFactory.getLogger(DefaultAccessEgressRouter.class); |
26 | 21 | private final StopResolver stopResolver; |
27 | | - private final NearbyStopFactory nearbyStopFactory; |
28 | 22 |
|
29 | 23 | public DefaultAccessEgressRouter(StopResolver stopResolver) { |
| 24 | + super(stopResolver); |
30 | 25 | this.stopResolver = stopResolver; |
31 | | - this.nearbyStopFactory = new NearbyStopFactory(stopResolver::getRegularStop); |
32 | 26 | } |
33 | 27 |
|
34 | 28 | /** |
35 | 29 | * Find accesses or egresses. |
36 | 30 | */ |
37 | | - public Collection<NearbyStop> findAccessEgresses( |
| 31 | + @Override |
| 32 | + Collection<NearbyStop> findStreetAccessEgresses( |
38 | 33 | RouteRequest request, |
39 | 34 | StreetRequest streetRequest, |
40 | 35 | Collection<ExtensionRequestContext> extensionRequestContexts, |
41 | 36 | AccessEgressType accessOrEgress, |
42 | 37 | Duration durationLimit, |
43 | 38 | int maxStopCount, |
44 | | - LinkingContext linkingContext |
| 39 | + LinkingContext linkingContext, |
| 40 | + Set<Vertex> ignoreVertices |
45 | 41 | ) { |
46 | | - OTPRequestTimeoutException.checkForTimeout(); |
47 | | - |
48 | | - // Note: We calculate access/egresses in two parts. First we fetch the stops with zero distance. |
49 | | - // Then we do street search. This is because some stations might use the centroid for street |
50 | | - // routing, but should still give zero distance access/egresses to its child-stops. |
51 | | - var zeroDistanceAccessEgress = findAccessEgressWithZeroDistance( |
52 | | - request, |
53 | | - streetRequest, |
54 | | - accessOrEgress, |
55 | | - linkingContext |
56 | | - ); |
57 | | - |
58 | | - // When looking for street accesses/egresses we ignore the already found direct accesses/egresses |
59 | | - var ignoreVertices = zeroDistanceAccessEgress |
60 | | - .stream() |
61 | | - .map(nearbyStop -> nearbyStop.lastStates.getLast().getVertex()) |
62 | | - .collect(Collectors.toSet()); |
63 | | - |
64 | 42 | var originVertices = accessOrEgress.isAccess() |
65 | 43 | ? linkingContext.findVertices(request.from()) |
66 | 44 | : linkingContext.findVertices(request.to()); |
67 | | - var streetAccessEgress = StreetNearbyStopFinder.of(stopResolver, durationLimit, maxStopCount) |
| 45 | + return StreetNearbyStopFinder.of(stopResolver, durationLimit, maxStopCount) |
68 | 46 | .withIgnoreVertices(ignoreVertices) |
69 | 47 | .withExtensionRequestContexts(extensionRequestContexts) |
70 | 48 | .build() |
71 | 49 | .findNearbyStops(originVertices, request, streetRequest, accessOrEgress.isEgress()); |
72 | | - |
73 | | - var results = ListUtils.combine(zeroDistanceAccessEgress, streetAccessEgress); |
74 | | - LOG.debug("Found {} {} stops", results.size(), accessOrEgress); |
75 | | - return results; |
76 | | - } |
77 | | - |
78 | | - /** |
79 | | - * Return a list of direct accesses/egresses that do not require any street search. This will |
80 | | - * return an empty list if the source/destination is not a stopId. |
81 | | - */ |
82 | | - private List<NearbyStop> findAccessEgressWithZeroDistance( |
83 | | - RouteRequest routeRequest, |
84 | | - StreetRequest streetRequest, |
85 | | - AccessEgressType accessOrEgress, |
86 | | - LinkingContext linkingContext |
87 | | - ) { |
88 | | - var transitStopVertices = accessOrEgress.isAccess() |
89 | | - ? linkingContext.fromStopVertices() |
90 | | - : linkingContext.toStopVertices(); |
91 | | - |
92 | | - return nearbyStopFactory.nearbyStopsForTransitStopVerticesFiltered( |
93 | | - transitStopVertices, |
94 | | - accessOrEgress.isEgress(), |
95 | | - routeRequest, |
96 | | - streetRequest |
97 | | - ); |
98 | 50 | } |
99 | 51 | } |
0 commit comments