Skip to content

Commit 64d5208

Browse files
committed
handle duration tags for elevators in the same way as for escalators
1 parent b2fbac1 commit 64d5208

File tree

4 files changed

+61
-25
lines changed

4 files changed

+61
-25
lines changed

application/src/main/java/org/opentripplanner/graph_builder/module/osm/ElevatorProcessor.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package org.opentripplanner.graph_builder.module.osm;
22

33
import gnu.trove.list.TLongList;
4+
import java.time.Duration;
45
import java.util.ArrayList;
56
import java.util.Arrays;
67
import java.util.Iterator;
78
import java.util.List;
89
import java.util.Map;
9-
import java.util.OptionalInt;
10+
import java.util.function.Consumer;
1011
import org.opentripplanner.framework.i18n.NonLocalizedString;
1112
import org.opentripplanner.graph_builder.issue.api.DataImportIssueStore;
1213
import org.opentripplanner.graph_builder.issue.api.Issue;
13-
import org.opentripplanner.osm.model.OsmEntity;
1414
import org.opentripplanner.osm.model.OsmLevel;
1515
import org.opentripplanner.osm.model.OsmNode;
1616
import org.opentripplanner.osm.model.OsmWay;
@@ -40,18 +40,25 @@ class ElevatorProcessor {
4040

4141
private static final Logger LOG = LoggerFactory.getLogger(ElevatorProcessor.class);
4242

43-
private final DataImportIssueStore issueStore;
4443
private final OsmDatabase osmdb;
4544
private final VertexGenerator vertexGenerator;
45+
private final Consumer<String> osmEntityDurationIssueConsumer;
4646

4747
public ElevatorProcessor(
4848
DataImportIssueStore issueStore,
4949
OsmDatabase osmdb,
5050
VertexGenerator vertexGenerator
5151
) {
52-
this.issueStore = issueStore;
5352
this.osmdb = osmdb;
5453
this.vertexGenerator = vertexGenerator;
54+
this.osmEntityDurationIssueConsumer = v ->
55+
issueStore.add(
56+
Issue.issue(
57+
"InvalidDuration",
58+
"Duration for osm node {} is not a valid duration: '{}'; the value is ignored.",
59+
v
60+
)
61+
);
5562
}
5663

5764
public void buildElevatorEdges(Graph graph) {
@@ -93,7 +100,10 @@ public void buildElevatorEdges(Graph graph) {
93100
levelName
94101
);
95102
}
96-
int travelTime = parseDuration(node).orElse(-1);
103+
long travelTime = node
104+
.getDuration(osmEntityDurationIssueConsumer)
105+
.map(Duration::toSeconds)
106+
.orElse(-1L);
97107

98108
var wheelchair = node.wheelchairAccessibility();
99109

@@ -102,7 +112,7 @@ public void buildElevatorEdges(Graph graph) {
102112
wheelchair,
103113
!node.isBicycleExplicitlyDenied(),
104114
levels.length,
105-
travelTime
115+
(int) travelTime
106116
);
107117
} // END elevator edge loop
108118

@@ -136,7 +146,10 @@ public void buildElevatorEdges(Graph graph) {
136146
);
137147
}
138148

139-
int travelTime = parseDuration(elevatorWay).orElse(-1);
149+
long travelTime = elevatorWay
150+
.getDuration(osmEntityDurationIssueConsumer)
151+
.map(Duration::toSeconds)
152+
.orElse(-1L);
140153
int levels = nodes.size();
141154
var wheelchair = elevatorWay.wheelchairAccessibility();
142155

@@ -145,7 +158,7 @@ public void buildElevatorEdges(Graph graph) {
145158
wheelchair,
146159
!elevatorWay.isBicycleExplicitlyDenied(),
147160
levels,
148-
travelTime
161+
(int) travelTime
149162
);
150163
LOG.debug("Created elevatorHopEdges for way {}", elevatorWay.getId());
151164
}
@@ -221,17 +234,4 @@ private boolean isElevatorWay(OsmWay way) {
221234
// https://www.openstreetmap.org/way/187719215
222235
return nodeRefs.get(0) != nodeRefs.get(nodeRefs.size() - 1);
223236
}
224-
225-
private OptionalInt parseDuration(OsmEntity element) {
226-
return element.getTagAsInt("duration", v ->
227-
issueStore.add(
228-
Issue.issue(
229-
"InvalidDuration",
230-
"Duration for osm node %d is not a number: '%s'; it's replaced with '-1' (unknown).",
231-
element.getId(),
232-
v
233-
)
234-
)
235-
);
236-
}
237237
}

application/src/main/java/org/opentripplanner/osm/model/OsmEntity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ public Optional<Duration> getTagValueAsDuration(String key, Consumer<String> err
318318
return Optional.empty();
319319
}
320320

321+
public Optional<Duration> getDuration(Consumer<String> errorHandler) {
322+
return getTagValueAsDuration("duration", errorHandler);
323+
}
324+
321325
/**
322326
* Some tags are allowed to have values like 55, "true" or "false".
323327
* <p>

application/src/main/java/org/opentripplanner/osm/model/OsmWay.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,6 @@ public boolean isEscalator() {
133133
return (isTag("highway", "steps") && isOneOfTags("conveying", ESCALATOR_CONVEYING_TAGS));
134134
}
135135

136-
public Optional<Duration> getDuration(Consumer<String> errorHandler) {
137-
return getTagValueAsDuration("duration", errorHandler);
138-
}
139-
140136
public boolean isForwardEscalator() {
141137
return isEscalator() && "forward".equals(this.getTag("conveying"));
142138
}

application/src/test/java/org/opentripplanner/street/model/edge/ElevatorHopEdgeTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
package org.opentripplanner.street.model.edge;
22

3+
import static com.google.common.truth.Truth.assertThat;
34
import static org.junit.jupiter.api.Assertions.assertEquals;
45
import static org.junit.jupiter.api.Assertions.assertNotNull;
56
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
import static org.opentripplanner.graph_builder.module.osm.moduletests._support.NodeBuilder.node;
68
import static org.opentripplanner.street.model._data.StreetModelForTest.intersectionVertex;
79

10+
import java.util.List;
811
import java.util.stream.Stream;
12+
import org.junit.jupiter.api.Test;
913
import org.junit.jupiter.params.ParameterizedTest;
1014
import org.junit.jupiter.params.provider.Arguments;
1115
import org.junit.jupiter.params.provider.MethodSource;
16+
import org.opentripplanner.framework.geometry.WgsCoordinate;
17+
import org.opentripplanner.graph_builder.module.osm.OsmModule;
18+
import org.opentripplanner.graph_builder.module.osm.moduletests._support.TestOsmProvider;
19+
import org.opentripplanner.osm.model.OsmWay;
20+
import org.opentripplanner.routing.api.request.StreetMode;
1221
import org.opentripplanner.routing.api.request.preference.AccessibilityPreferences;
1322
import org.opentripplanner.routing.api.request.preference.WheelchairPreferences;
23+
import org.opentripplanner.routing.graph.Graph;
24+
import org.opentripplanner.service.osminfo.internal.DefaultOsmInfoGraphBuildRepository;
25+
import org.opentripplanner.service.vehicleparking.internal.DefaultVehicleParkingRepository;
1426
import org.opentripplanner.street.model.StreetTraversalPermission;
1527
import org.opentripplanner.street.model.vertex.Vertex;
1628
import org.opentripplanner.street.search.request.StreetSearchRequest;
1729
import org.opentripplanner.street.search.state.State;
1830
import org.opentripplanner.transit.model.basic.Accessibility;
31+
import org.opentripplanner.transit.model.framework.Deduplicator;
1932

2033
class ElevatorHopEdgeTest {
2134

@@ -87,4 +100,27 @@ private State[] traverse(Accessibility wheelchair, StreetSearchRequest req) {
87100

88101
return edge.traverse(state);
89102
}
103+
104+
@Test
105+
void testDuration() {
106+
var way = new OsmWay();
107+
way.addTag("duration", "00:01:02");
108+
way.addTag("highway", "elevator");
109+
var provider = TestOsmProvider.of().addWay(way).build();
110+
var graph = new Graph(new Deduplicator());
111+
var osmModule = OsmModule.of(
112+
provider,
113+
graph,
114+
new DefaultOsmInfoGraphBuildRepository(),
115+
new DefaultVehicleParkingRepository()
116+
).build();
117+
osmModule.buildGraph();
118+
var edges = graph.getEdgesOfType(ElevatorHopEdge.class);
119+
assertThat(edges).hasSize(2);
120+
var edge = (ElevatorHopEdge) edges.getFirst();
121+
var from = edge.getFromVertex();
122+
var req = StreetSearchRequest.of().withMode(StreetMode.WALK);
123+
var res = edge.traverse(new State(from, req.build()))[0];
124+
assertEquals(62_000, res.getTimeDeltaMilliseconds());
125+
}
90126
}

0 commit comments

Comments
 (0)