Skip to content

Commit 6c2ea81

Browse files
committed
Merge branch 'escalator-duration-parse' into dev-2.x
2 parents e790986 + 27457e7 commit 6c2ea81

File tree

9 files changed

+130
-34
lines changed

9 files changed

+130
-34
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/main/java/org/opentripplanner/street/model/edge/ElevatorHopEdge.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ public StreetTraversalPermission getPermission() {
9898
return permission;
9999
}
100100

101+
public int getTravelTime() {
102+
return travelTime;
103+
}
104+
101105
@Override
102106
public State[] traverse(State s0) {
103107
RoutingPreferences preferences = s0.getPreferences();

application/src/test/java/org/opentripplanner/graph_builder/module/osm/moduletests/BoardingLocationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.opentripplanner.service.vehicleparking.internal.DefaultVehicleParkingRepository;
1717
import org.opentripplanner.transit.model.framework.Deduplicator;
1818

19-
public class BoardingLocationTest {
19+
class BoardingLocationTest {
2020

2121
/**
2222
* There is a one-way road which is also marked as a platform in Sky Campus which crashed OSM.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.opentripplanner.graph_builder.module.osm.moduletests;
2+
3+
import static com.google.common.truth.Truth.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.opentripplanner.graph_builder.module.osm.moduletests._support.NodeBuilder.node;
6+
7+
import org.junit.jupiter.api.Test;
8+
import org.opentripplanner.framework.geometry.WgsCoordinate;
9+
import org.opentripplanner.graph_builder.module.osm.OsmModule;
10+
import org.opentripplanner.graph_builder.module.osm.moduletests._support.TestOsmProvider;
11+
import org.opentripplanner.osm.model.OsmWay;
12+
import org.opentripplanner.routing.graph.Graph;
13+
import org.opentripplanner.service.osminfo.internal.DefaultOsmInfoGraphBuildRepository;
14+
import org.opentripplanner.service.vehicleparking.internal.DefaultVehicleParkingRepository;
15+
import org.opentripplanner.street.model.edge.ElevatorHopEdge;
16+
import org.opentripplanner.transit.model.framework.Deduplicator;
17+
18+
class ElevatorTest {
19+
20+
@Test
21+
void testDuration() {
22+
var way = new OsmWay();
23+
way.addTag("duration", "00:01:02");
24+
way.addTag("highway", "elevator");
25+
var provider = TestOsmProvider.of().addWay(way).build();
26+
var graph = new Graph(new Deduplicator());
27+
var osmModule = OsmModule.of(
28+
provider,
29+
graph,
30+
new DefaultOsmInfoGraphBuildRepository(),
31+
new DefaultVehicleParkingRepository()
32+
).build();
33+
osmModule.buildGraph();
34+
var edges = graph.getEdgesOfType(ElevatorHopEdge.class);
35+
assertThat(edges).hasSize(2);
36+
for (var edge : edges) {
37+
assertEquals(62, edge.getTravelTime());
38+
}
39+
}
40+
41+
@Test
42+
void testMultilevelNodeDuration() {
43+
var node0 = node(0, new WgsCoordinate(0, 0));
44+
var node1 = node(1, new WgsCoordinate(2, 0));
45+
var node = node(2, new WgsCoordinate(1, 0));
46+
node.addTag("duration", "00:01:02");
47+
node.addTag("highway", "elevator");
48+
node.addTag("level", "1;2");
49+
var provider = TestOsmProvider.of()
50+
.addWayFromNodes(way -> way.addTag("level", "1"), node0, node)
51+
.addWayFromNodes(way -> way.addTag("level", "2"), node1, node)
52+
.build();
53+
var graph = new Graph(new Deduplicator());
54+
var osmModule = OsmModule.of(
55+
provider,
56+
graph,
57+
new DefaultOsmInfoGraphBuildRepository(),
58+
new DefaultVehicleParkingRepository()
59+
).build();
60+
osmModule.buildGraph();
61+
var edges = graph.getEdgesOfType(ElevatorHopEdge.class);
62+
assertThat(edges).hasSize(2);
63+
for (var edge : edges) {
64+
assertEquals(62, edge.getTravelTime());
65+
}
66+
}
67+
}

application/src/test/java/org/opentripplanner/graph_builder/module/osm/moduletests/_support/TestOsmProvider.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.Arrays;
66
import java.util.List;
77
import java.util.concurrent.atomic.AtomicLong;
8+
import java.util.function.Consumer;
89
import org.opentripplanner._support.time.ZoneIds;
910
import org.opentripplanner.graph_builder.module.osm.OsmDatabase;
1011
import org.opentripplanner.osm.OsmProvider;
@@ -119,21 +120,28 @@ public Builder addWayFromNodes(OsmNode... nodes) {
119120
}
120121

121122
public Builder addWayFromNodes(long id, List<OsmNode> nodes) {
123+
return addWayFromNodes(way -> {}, id, nodes);
124+
}
125+
126+
public Builder addWayFromNodes(Consumer<OsmWay> wayConsumer, OsmNode... nodes) {
127+
return addWayFromNodes(wayConsumer, counter.incrementAndGet(), List.of(nodes));
128+
}
129+
130+
public Builder addRelation(OsmRelation relation) {
131+
this.relations.add(relation);
132+
return this;
133+
}
134+
135+
private Builder addWayFromNodes(Consumer<OsmWay> wayConsumer, long id, List<OsmNode> nodes) {
122136
this.nodes.addAll(nodes);
123137
var nodeIds = nodes.stream().map(OsmEntity::getId).toList();
124-
125138
var way = new OsmWay();
126139
way.setId(id);
127140
way.addTag("highway", "pedestrian");
141+
wayConsumer.accept(way);
128142
way.getNodeRefs().addAll(nodeIds);
129-
130143
this.ways.add(way);
131144
return this;
132145
}
133-
134-
public Builder addRelation(OsmRelation relation) {
135-
this.relations.add(relation);
136-
return this;
137-
}
138146
}
139147
}

application/src/test/java/org/opentripplanner/graph_builder/module/osm/moduletests/walkablearea/SimpleAreaTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.opentripplanner.test.support.GeoJsonIo;
1717
import org.opentripplanner.transit.model.framework.Deduplicator;
1818

19-
public class SimpleAreaTest {
19+
class SimpleAreaTest {
2020

2121
@Test
2222
void walkableArea() {

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import static org.opentripplanner.street.model._data.StreetModelForTest.intersectionVertex;
77

88
import java.util.stream.Stream;
9+
import org.junit.jupiter.api.Test;
910
import org.junit.jupiter.params.ParameterizedTest;
1011
import org.junit.jupiter.params.provider.Arguments;
1112
import org.junit.jupiter.params.provider.MethodSource;
13+
import org.opentripplanner.routing.api.request.StreetMode;
1214
import org.opentripplanner.routing.api.request.preference.AccessibilityPreferences;
1315
import org.opentripplanner.routing.api.request.preference.WheelchairPreferences;
1416
import org.opentripplanner.street.model.StreetTraversalPermission;
@@ -76,6 +78,21 @@ void allowByDefault(Accessibility wheelchair, double expectedCost) {
7678
assertEquals(expectedCost, wheelchairResult.weight);
7779
}
7880

81+
@Test
82+
void testTraversal() {
83+
var edge = ElevatorHopEdge.createElevatorHopEdge(
84+
from,
85+
to,
86+
StreetTraversalPermission.ALL,
87+
null,
88+
2,
89+
62
90+
);
91+
var req = StreetSearchRequest.of().withMode(StreetMode.WALK);
92+
var res = edge.traverse(new State(from, req.build()))[0];
93+
assertEquals(62_000, res.getTimeDeltaMilliseconds());
94+
}
95+
7996
private State[] traverse(Accessibility wheelchair, StreetSearchRequest req) {
8097
var edge = ElevatorHopEdge.createElevatorHopEdge(
8198
from,

0 commit comments

Comments
 (0)