Skip to content

Commit dee71f5

Browse files
committed
Handle stepFree option consistently
... for ways in the base TranversalPermissionLabeler (by passing the TransportNetworkConfig files as an argument), and for nodes with kerb tags Also, reduce duplicate code
1 parent 4b8a005 commit dee71f5

File tree

7 files changed

+42
-28
lines changed

7 files changed

+42
-28
lines changed

src/main/java/com/conveyal/r5/analyst/cluster/TransportNetworkConfig.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ public class TransportNetworkConfig {
7070
public Double maxIncline;
7171

7272
/**
73-
* When used with certain TraversalPermissionLabelers (NoSteepInclinesTraversalPermissionLabeler for now), whether
74-
* to exclude pedestrian traversal of ways with highway=stairs tags and nodes with kerb=raised tags
73+
* Whether to exclude pedestrian traversal of ways with highway=stairs tags and nodes with kerb=raised tags. This
74+
* option should generally be used with detailed sidewalk networks and a TraversalPermissionLabeler that forces
75+
* use of sidewalks (i.e., disallows walking on roadways).
7576
*/
7677
public boolean stepFree;
7778

src/main/java/com/conveyal/r5/labeling/NoSidewalkCyclingTraversalPermissionLabeler.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package com.conveyal.r5.labeling;
22

33
import com.conveyal.osmlib.Way;
4+
import com.conveyal.r5.analyst.cluster.TransportNetworkConfig;
45
import com.conveyal.r5.streets.EdgeStore;
56

67
/**
78
* USTraversalPermissionLabeler, except biking is disallowed on ways with footway=sidewalk tag
89
*/
910
public class NoSidewalkCyclingTraversalPermissionLabeler extends USTraversalPermissionLabeler {
11+
public NoSidewalkCyclingTraversalPermissionLabeler (TransportNetworkConfig config) {
12+
super(config);
13+
}
14+
1015
@Override
1116
public RoadPermission getPermissions(Way way) {
1217
RoadPermission rp = super.getPermissions(way);

src/main/java/com/conveyal/r5/labeling/NoSteepInclinesTraversalPermissionLabeler.java

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,40 +8,27 @@
88
* USTraversalPermissionLabeler, except walking is disallowed on ways that allow cars and ways with inclines
99
* steeper than a specified limit.
1010
*/
11-
public class NoSteepInclinesTraversalPermissionLabeler extends USTraversalPermissionLabeler {
11+
public class NoSteepInclinesTraversalPermissionLabeler extends SidewalkTraversalPermissionLabeler {
1212

1313
Double maxIncline;
14-
boolean stepFree;
1514
public NoSteepInclinesTraversalPermissionLabeler (TransportNetworkConfig config) {
15+
super(config);
1616
if (config != null) {
1717
if (config.maxIncline != null) this.maxIncline = config.maxIncline;
18-
this.stepFree = config.stepFree;
1918
}
2019
}
2120
@Override
2221
public RoadPermission getPermissions(Way way) {
22+
// Base class (SidewalkTraversalPermissionLabeler) disallows walking on ways that allow cars
2323
RoadPermission rp = super.getPermissions(way);
2424

25-
// Disallow walking on ways that allow cars
26-
if (rp.forward.contains(EdgeStore.EdgeFlag.ALLOWS_CAR) ||
27-
rp.forward.contains(EdgeStore.EdgeFlag.NO_THRU_TRAFFIC_CAR) ||
28-
rp.backward.contains(EdgeStore.EdgeFlag.ALLOWS_CAR) ||
29-
rp.backward.contains(EdgeStore.EdgeFlag.NO_THRU_TRAFFIC_CAR)
30-
) {
31-
rp.disallowPedestrians();
32-
}
33-
3425
// Disallow walking on ways with slopes steeper than specified maxIncline
35-
else if (maxIncline != null) {
26+
if (maxIncline != null) {
3627
if (way.hasTag("incline") && Math.abs(Double.parseDouble(way.getTag("incline"))) > maxIncline) {
3728
rp.disallowPedestrians();
3829
}
3930
}
4031

41-
if (stepFree && way.hasTag("highway", "steps")) {
42-
rp.disallowPedestrians();
43-
}
44-
4532
return rp;
4633
}
4734

src/main/java/com/conveyal/r5/labeling/SidewalkTraversalPermissionLabeler.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.conveyal.r5.labeling;
22

33
import com.conveyal.osmlib.Way;
4+
import com.conveyal.r5.analyst.cluster.TransportNetworkConfig;
45
import com.conveyal.r5.streets.EdgeStore;
56

67
/**
@@ -16,6 +17,10 @@ public class SidewalkTraversalPermissionLabeler extends TraversalPermissionLabel
1617
"access=yes");
1718
}
1819

20+
public SidewalkTraversalPermissionLabeler (TransportNetworkConfig config) {
21+
super(config);
22+
}
23+
1924
@Override
2025
public RoadPermission getPermissions(Way way) {
2126
RoadPermission rp = super.getPermissions(way);
@@ -24,10 +29,7 @@ public RoadPermission getPermissions(Way way) {
2429
rp.backward.contains(EdgeStore.EdgeFlag.ALLOWS_CAR) ||
2530
rp.backward.contains(EdgeStore.EdgeFlag.NO_THRU_TRAFFIC_CAR)
2631
) {
27-
rp.forward.remove(EdgeStore.EdgeFlag.ALLOWS_PEDESTRIAN);
28-
rp.forward.remove(EdgeStore.EdgeFlag.NO_THRU_TRAFFIC_PEDESTRIAN);
29-
rp.backward.remove(EdgeStore.EdgeFlag.ALLOWS_PEDESTRIAN);
30-
rp.backward.remove(EdgeStore.EdgeFlag.NO_THRU_TRAFFIC_PEDESTRIAN);
32+
rp.disallowPedestrians();
3133
}
3234
return rp;
3335
}

src/main/java/com/conveyal/r5/labeling/TraversalPermissionLabeler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.conveyal.r5.labeling;
22

33
import com.conveyal.osmlib.Way;
4+
import com.conveyal.r5.analyst.cluster.TransportNetworkConfig;
45
import com.conveyal.r5.streets.EdgeStore;
56
import org.slf4j.Logger;
67
import org.slf4j.LoggerFactory;
@@ -29,6 +30,8 @@ public abstract class TraversalPermissionLabeler {
2930
//This is immutable map of highway tag and boolean which is true if this tag has same road with _link
3031
static final Map<String, Boolean> validHighwayTags;
3132

33+
boolean stepFree;
34+
3235
static {
3336

3437
Map<String, Boolean> validHighwayTagsConst;
@@ -63,6 +66,12 @@ public abstract class TraversalPermissionLabeler {
6366
addPermissions("footway|steps|platform|public_transport=platform|railway=platform|corridor", "access=no;foot=yes");
6467
}
6568

69+
public TraversalPermissionLabeler (TransportNetworkConfig config) {
70+
if (config != null) {
71+
this.stepFree = config.stepFree;
72+
}
73+
}
74+
6675
public RoadPermission getPermissions(Way way) {
6776
EnumMap<Node, Label> tree = getTreeForWay(way);
6877

@@ -132,6 +141,10 @@ public RoadPermission getPermissions(Way way) {
132141
applyOppositeBicyclePermissions(way, backward);
133142
}
134143

144+
if (stepFree && way.hasTag("highway", "steps")) {
145+
forward.remove(EdgeStore.EdgeFlag.ALLOWS_PEDESTRIAN);
146+
backward.remove(EdgeStore.EdgeFlag.ALLOWS_PEDESTRIAN);
147+
}
135148

136149
return new RoadPermission(forward, backward);
137150
}

src/main/java/com/conveyal/r5/labeling/USTraversalPermissionLabeler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.conveyal.r5.labeling;
22

33

4+
import com.conveyal.r5.analyst.cluster.TransportNetworkConfig;
5+
46
/**
57
* Traversal permission labeler for the United States, adding things that differ from the base TraversalPermissionLabeler.
68
* https://wiki.openstreetmap.org/wiki/OSM_tags_for_routing/Access-Restrictions#United_States_of_America
@@ -12,4 +14,8 @@ public class USTraversalPermissionLabeler extends TraversalPermissionLabeler {
1214
addPermissions("cycleway", "bicycle=yes;foot=yes");
1315
}
1416

17+
public USTraversalPermissionLabeler (TransportNetworkConfig config) {
18+
super(config);
19+
}
20+
1521
}

src/main/java/com/conveyal/r5/streets/StreetLayer.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,17 +212,17 @@ public class StreetLayer implements Serializable, Cloneable {
212212

213213
public StreetLayer() {
214214
speedLabeler = new SpeedLabeler(SpeedConfig.defaultConfig());
215-
permissionLabeler = new USTraversalPermissionLabeler();
215+
permissionLabeler = new USTraversalPermissionLabeler(null);
216216
}
217217

218218
public StreetLayer(TransportNetworkConfig config) {
219219
this();
220220
if (config != null) {
221221
permissionLabeler = switch (config.traversalPermissionLabeler) {
222-
case "sidewalk" -> new SidewalkTraversalPermissionLabeler();
223-
case "noSidewalkCycling" -> new NoSidewalkCyclingTraversalPermissionLabeler();
222+
case "sidewalk" -> new SidewalkTraversalPermissionLabeler(config);
223+
case "noSidewalkCycling" -> new NoSidewalkCyclingTraversalPermissionLabeler(config);
224224
case "noSteepWays" -> new NoSteepInclinesTraversalPermissionLabeler(config);
225-
case null -> new USTraversalPermissionLabeler();
225+
case null -> new USTraversalPermissionLabeler(config);
226226
default -> throw new IllegalArgumentException(
227227
"Unknown traversal permission labeler: " + config.traversalPermissionLabeler
228228
);
@@ -231,7 +231,7 @@ public StreetLayer(TransportNetworkConfig config) {
231231
stepFree = config.stepFree;
232232

233233
} else {
234-
permissionLabeler = new USTraversalPermissionLabeler();
234+
permissionLabeler = new USTraversalPermissionLabeler(null);
235235
}
236236
}
237237

0 commit comments

Comments
 (0)