Skip to content

Commit b31a44b

Browse files
authored
ferry speed calculator (graphhopper#2849)
1 parent ba83ee0 commit b31a44b

27 files changed

+185
-121
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
### 8.0 [not yet released]
22

3+
- removed duration:seconds as intermediate tag
34
- /info endpoint does no longer return the vehicle used per profile and won't return encoded value of vehicles like car_average_speed
45
- Country rules no longer contain maxspeed handling, enable a much better alternative via `max_speed_calculator.enabled: true`. On the client side use `max_speed_estimated` to determine if max_speed is from OSM or an estimation. See #2810
56
- bike routing better avoids dangerous roads, see #2796 and #2802

core/src/main/java/com/graphhopper/GraphHopper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,8 @@ protected OSMParsers buildOSMParsers(Map<String, String> vehiclesByName, List<St
656656
osmParsers.addWayTagParser(new OSMMaxSpeedParser(encodingManager.getDecimalEncodedValue(MaxSpeed.KEY)));
657657
if (!encodedValueStrings.contains(RoadAccess.KEY))
658658
osmParsers.addWayTagParser(new OSMRoadAccessParser(encodingManager.getEnumEncodedValue(RoadAccess.KEY, RoadAccess.class), OSMRoadAccessParser.toOSMRestrictions(TransportationMode.CAR)));
659+
if (!encodedValueStrings.contains(FerrySpeed.KEY))
660+
osmParsers.addWayTagParser(new FerrySpeedCalculator(encodingManager.getDecimalEncodedValue(FerrySpeed.KEY)));
659661
if (encodingManager.hasEncodedValue(AverageSlope.KEY) || encodingManager.hasEncodedValue(MaxSlope.KEY)) {
660662
if (!encodingManager.hasEncodedValue(AverageSlope.KEY) || !encodingManager.hasEncodedValue(MaxSlope.KEY))
661663
throw new IllegalArgumentException("Enable both, average_slope and max_slope");

core/src/main/java/com/graphhopper/reader/osm/OSMReader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -487,11 +487,10 @@ protected void preprocessWay(ReaderWay way, WaySegmentParser.CoordinateSupplier
487487
" minutes), distance=" + distance + " m");
488488
return;
489489
}
490-
// These tags will be present if 1) isCalculateWayDistance was true for this way, 2) no OSM nodes were missing
490+
// tag will be present if 1) isCalculateWayDistance was true for this way, 2) no OSM nodes were missing
491491
// such that the distance could actually be calculated, 3) there was a duration tag we could parse, and 4) the
492492
// derived speed was not unrealistically slow.
493493
way.setTag("speed_from_duration", speedInKmPerHour);
494-
way.setTag("duration:seconds", durationInSeconds);
495494
}
496495

497496
static String fixWayName(String str) {

core/src/main/java/com/graphhopper/routing/ev/DefaultEncodedValueFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ public EncodedValue create(String name, PMap properties) {
9595
return Curvature.create();
9696
} else if (Crossing.KEY.equals(name)) {
9797
return new EnumEncodedValue<>(Crossing.KEY, Crossing.class);
98+
} else if (FerrySpeed.KEY.equals(name)) {
99+
return FerrySpeed.create();
98100
} else {
99101
throw new IllegalArgumentException("DefaultEncodedValueFactory cannot find EncodedValue " + name);
100102
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.graphhopper.routing.ev;
2+
3+
public class FerrySpeed {
4+
public static final String KEY = "ferry_speed";
5+
6+
public static DecimalEncodedValue create() {
7+
return new DecimalEncodedValueImpl(KEY, 5, 2, false);
8+
}
9+
}

core/src/main/java/com/graphhopper/routing/util/EncodingManager.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ private void addDefaultEncodedValues() {
168168
RoadClassLink.KEY,
169169
RoadEnvironment.KEY,
170170
MaxSpeed.KEY,
171-
RoadAccess.KEY
171+
RoadAccess.KEY,
172+
FerrySpeed.KEY
172173
));
173174
if (em.getVehicles().stream().anyMatch(vehicle -> vehicle.contains("bike") || vehicle.contains("mtb") || vehicle.contains("racingbike"))) {
174175
keys.add(BikeNetwork.KEY);
@@ -274,4 +275,4 @@ public <T extends EncodedValue> T getEncodedValue(String key, Class<T> encodedVa
274275
public static String getKey(String prefix, String str) {
275276
return prefix + "_" + str;
276277
}
277-
}
278+
}
Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
11
package com.graphhopper.routing.util;
22

33
import com.graphhopper.reader.ReaderWay;
4+
import com.graphhopper.routing.ev.DecimalEncodedValue;
5+
import com.graphhopper.routing.ev.EdgeIntAccess;
6+
import com.graphhopper.routing.util.parsers.TagParser;
7+
import com.graphhopper.storage.IntsRef;
48

5-
public class FerrySpeedCalculator {
6-
private final double unknownSpeed, minSpeed, maxSpeed;
9+
import java.util.Arrays;
10+
import java.util.Collection;
711

8-
public FerrySpeedCalculator(double minSpeed, double maxSpeed, double unknownSpeed) {
9-
this.minSpeed = minSpeed;
10-
this.maxSpeed = maxSpeed;
11-
this.unknownSpeed = unknownSpeed;
12+
public class FerrySpeedCalculator implements TagParser {
13+
public static final Collection<String> FERRIES = Arrays.asList("shuttle_train", "ferry");
14+
private DecimalEncodedValue ferrySpeedEnc;
15+
16+
public FerrySpeedCalculator(DecimalEncodedValue ferrySpeedEnc) {
17+
this.ferrySpeedEnc = ferrySpeedEnc;
1218
}
1319

14-
public double getSpeed(ReaderWay way) {
20+
static double getSpeed(ReaderWay way) {
1521
// todo: We currently face two problems related to ferry speeds:
1622
// 1) We cannot account for waiting times for short ferries (when we do the ferry speed is slower than the slowest we can store)
1723
// 2) When the ferry speed is larger than the maximum speed of the encoder (like 15km/h for foot) the
1824
// ferry speed will be faster than what we can store.
1925

20-
// OSMReader adds the artificial 'speed_from_duration', 'duration:seconds' and 'way_distance' tags that we can
26+
// OSMReader adds the artificial 'speed_from_duration' and 'way_distance' tags that we can
2127
// use to set the ferry speed. Otherwise we need to use fallback values.
2228
double speedInKmPerHour = way.getTag("speed_from_duration", Double.NaN);
2329
if (!Double.isNaN(speedInKmPerHour)) {
2430
// we reduce the speed to account for waiting time (we increase the duration by 40%)
25-
double speedWithWaitingTime = speedInKmPerHour / 1.4;
26-
return Math.round(Math.max(minSpeed, Math.min(speedWithWaitingTime, maxSpeed)));
31+
return Math.round(speedInKmPerHour / 1.4);
2732
} else {
2833
// we have no speed value to work with because there was no valid duration tag.
2934
// we have to take a guess based on the distance.
@@ -35,11 +40,23 @@ else if (wayDistance < 500)
3540
// that take you from one harbour to another, but rather ways that only represent the beginning of a
3641
// longer ferry connection and that are used by multiple different connections, like here: https://www.openstreetmap.org/way/107913687
3742
// It should not matter much which speed we use in this case, so we have no special handling for these.
38-
return minSpeed;
43+
return 1;
3944
else {
4045
// todo: distinguish speed based on the distance of the ferry, see #2532
41-
return unknownSpeed;
46+
return 6;
4247
}
4348
}
4449
}
50+
51+
public static double minmax(double speed, DecimalEncodedValue avgSpeedEnc) {
52+
return Math.max(avgSpeedEnc.getSmallestNonZeroValue(), Math.min(speed, avgSpeedEnc.getMaxStorableDecimal()));
53+
}
54+
55+
@Override
56+
public void handleWayTags(int edgeId, EdgeIntAccess edgeIntAccess, ReaderWay way, IntsRef relationFlags) {
57+
if (!way.hasTag("highway") && way.hasTag("route", FERRIES)) {
58+
double ferrySpeed = minmax(getSpeed(way), ferrySpeedEnc);
59+
ferrySpeedEnc.setDecimal(false, edgeId, edgeIntAccess, ferrySpeed);
60+
}
61+
}
4562
}

core/src/main/java/com/graphhopper/routing/util/parsers/AbstractAccessParser.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import java.util.*;
1414

1515
public abstract class AbstractAccessParser implements TagParser {
16-
static final Collection<String> FERRIES = Arrays.asList("shuttle_train", "ferry");
1716
static final Collection<String> ONEWAYS = Arrays.asList("yes", "true", "1", "-1");
1817
static final Collection<String> INTENDED = Arrays.asList("yes", "designated", "official", "permissive");
1918

@@ -22,7 +21,6 @@ public abstract class AbstractAccessParser implements TagParser {
2221
protected final Set<String> restrictedValues = new HashSet<>(5);
2322

2423
protected final Set<String> intendedValues = new HashSet<>(INTENDED);
25-
protected final Set<String> ferries = new HashSet<>(FERRIES);
2624
protected final Set<String> oneways = new HashSet<>(ONEWAYS);
2725
// http://wiki.openstreetmap.org/wiki/Mapfeatures#Barrier
2826
protected final Set<String> barriers = new HashSet<>(5);

core/src/main/java/com/graphhopper/routing/util/parsers/AbstractAverageSpeedParser.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010
import java.util.HashSet;
1111
import java.util.Set;
1212

13-
import static com.graphhopper.routing.util.parsers.AbstractAccessParser.FERRIES;
13+
import static com.graphhopper.routing.util.FerrySpeedCalculator.FERRIES;
1414

1515
public abstract class AbstractAverageSpeedParser implements TagParser {
1616
// http://wiki.openstreetmap.org/wiki/Mapfeatures#Barrier
1717
protected final DecimalEncodedValue avgSpeedEnc;
1818
protected final Set<String> ferries = new HashSet<>(FERRIES);
19-
protected final FerrySpeedCalculator ferrySpeedCalc;
19+
protected final DecimalEncodedValue ferrySpeedEnc;
2020

21-
protected AbstractAverageSpeedParser(DecimalEncodedValue speedEnc) {
21+
protected AbstractAverageSpeedParser(DecimalEncodedValue speedEnc, DecimalEncodedValue ferrySpeedEnc) {
2222
this.avgSpeedEnc = speedEnc;
23-
this.ferrySpeedCalc = new FerrySpeedCalculator(speedEnc.getSmallestNonZeroValue(), speedEnc.getMaxStorableDecimal(), 6);
23+
this.ferrySpeedEnc = ferrySpeedEnc;
2424
}
2525

2626
/**

core/src/main/java/com/graphhopper/routing/util/parsers/BikeAverageSpeedParser.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ public class BikeAverageSpeedParser extends BikeCommonAverageSpeedParser {
77

88
public BikeAverageSpeedParser(EncodedValueLookup lookup, PMap properties) {
99
this(lookup.getDecimalEncodedValue(VehicleSpeed.key(properties.getString("name", "bike"))),
10-
lookup.getEnumEncodedValue(Smoothness.KEY, Smoothness.class));
10+
lookup.getEnumEncodedValue(Smoothness.KEY, Smoothness.class),
11+
lookup.getDecimalEncodedValue(FerrySpeed.KEY));
1112
}
1213

13-
public BikeAverageSpeedParser(DecimalEncodedValue speedEnc, EnumEncodedValue<Smoothness> smoothnessEnc) {
14-
super(speedEnc, smoothnessEnc);
14+
public BikeAverageSpeedParser(DecimalEncodedValue speedEnc, EnumEncodedValue<Smoothness> smoothnessEnc, DecimalEncodedValue ferrySpeedEnc) {
15+
super(speedEnc, smoothnessEnc, ferrySpeedEnc);
1516
addPushingSection("path");
1617
}
1718
}

core/src/main/java/com/graphhopper/routing/util/parsers/BikeCommonAccessParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import java.util.*;
1010

11+
import static com.graphhopper.routing.util.FerrySpeedCalculator.FERRIES;
12+
1113
public abstract class BikeCommonAccessParser extends AbstractAccessParser implements TagParser {
1214

1315
private static final Set<String> OPP_LANES = new HashSet<>(Arrays.asList("opposite", "opposite_lane", "opposite_track"));
@@ -41,7 +43,7 @@ public WayAccess getAccess(ReaderWay way) {
4143
if (highwayValue == null) {
4244
WayAccess access = WayAccess.CAN_SKIP;
4345

44-
if (way.hasTag("route", ferries)) {
46+
if (way.hasTag("route", FERRIES)) {
4547
// if bike is NOT explicitly tagged allow bike but only if foot is not specified either
4648
String bikeTag = way.getTag("bicycle");
4749
if (bikeTag == null && !way.hasTag("foot") || intendedValues.contains(bikeTag))

core/src/main/java/com/graphhopper/routing/util/parsers/BikeCommonAverageSpeedParser.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.graphhopper.routing.ev.EdgeIntAccess;
66
import com.graphhopper.routing.ev.EnumEncodedValue;
77
import com.graphhopper.routing.ev.Smoothness;
8+
import com.graphhopper.routing.util.FerrySpeedCalculator;
89
import com.graphhopper.util.Helper;
910

1011
import java.util.HashMap;
@@ -25,8 +26,8 @@ public abstract class BikeCommonAverageSpeedParser extends AbstractAverageSpeedP
2526
private final EnumEncodedValue<Smoothness> smoothnessEnc;
2627
protected final Set<String> intendedValues = new HashSet<>(5);
2728

28-
protected BikeCommonAverageSpeedParser(DecimalEncodedValue speedEnc, EnumEncodedValue<Smoothness> smoothnessEnc) {
29-
super(speedEnc);
29+
protected BikeCommonAverageSpeedParser(DecimalEncodedValue speedEnc, EnumEncodedValue<Smoothness> smoothnessEnc, DecimalEncodedValue ferrySpeedEnc) {
30+
super(speedEnc, ferrySpeedEnc);
3031
this.smoothnessEnc = smoothnessEnc;
3132

3233
// duplicate code as also in BikeCommonPriorityParser
@@ -133,7 +134,7 @@ public void handleWayTags(int edgeId, EdgeIntAccess edgeIntAccess, ReaderWay way
133134
String highwayValue = way.getTag("highway");
134135
if (highwayValue == null) {
135136
if (way.hasTag("route", ferries)) {
136-
double ferrySpeed = ferrySpeedCalc.getSpeed(way);
137+
double ferrySpeed = FerrySpeedCalculator.minmax(ferrySpeedEnc.getDecimal(false, edgeId, edgeIntAccess), avgSpeedEnc);
137138
setSpeed(false, edgeId, edgeIntAccess, ferrySpeed);
138139
if (avgSpeedEnc.isStoreTwoDirections())
139140
setSpeed(true, edgeId, edgeIntAccess, ferrySpeed);

core/src/main/java/com/graphhopper/routing/util/parsers/BikeCommonPriorityParser.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import java.util.*;
1212

1313
import static com.graphhopper.routing.ev.RouteNetwork.*;
14+
import static com.graphhopper.routing.util.FerrySpeedCalculator.FERRIES;
1415
import static com.graphhopper.routing.util.PriorityCode.*;
15-
import static com.graphhopper.routing.util.parsers.AbstractAccessParser.FERRIES;
1616
import static com.graphhopper.routing.util.parsers.AbstractAccessParser.INTENDED;
1717
import static com.graphhopper.routing.util.parsers.AbstractAverageSpeedParser.getMaxSpeed;
1818
import static com.graphhopper.routing.util.parsers.AbstractAverageSpeedParser.isValidSpeed;
@@ -180,7 +180,7 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap<Double, PriorityCode> w
180180
weightToPrioMap.put(50d, priorityCode == null ? AVOID : priorityCode);
181181
if (way.hasTag("tunnel", intendedValues)) {
182182
PriorityCode worse = priorityCode == null ? BAD : priorityCode.worse().worse();
183-
weightToPrioMap.put(50d, worse == EXCLUDE ? REACH_DESTINATION : worse);
183+
weightToPrioMap.put(50d, worse == EXCLUDE ? REACH_DESTINATION : worse);
184184
}
185185
}
186186

@@ -199,14 +199,14 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap<Double, PriorityCode> w
199199
PriorityCode pushingSectionPrio = SLIGHT_AVOID;
200200
if (way.hasTag("bicycle", "yes") || way.hasTag("bicycle", "permissive"))
201201
pushingSectionPrio = PREFER;
202-
if (isDesignated(way) && (!way.hasTag("highway","steps")))
202+
if (isDesignated(way) && (!way.hasTag("highway", "steps")))
203203
pushingSectionPrio = VERY_NICE;
204204
if (way.hasTag("foot", "yes")) {
205205
pushingSectionPrio = pushingSectionPrio.worse();
206206
if (way.hasTag("segregated", "yes"))
207207
pushingSectionPrio = pushingSectionPrio.better();
208208
}
209-
if (way.hasTag("highway","steps")) {
209+
if (way.hasTag("highway", "steps")) {
210210
pushingSectionPrio = BAD;
211211
}
212212
weightToPrioMap.put(100d, pushingSectionPrio);
@@ -231,7 +231,8 @@ void collect(ReaderWay way, double wayTypeSpeed, TreeMap<Double, PriorityCode> w
231231
// Increase the priority for scenic routes or in case that maxspeed limits our average speed as compensation. See #630
232232
if (way.hasTag("scenic", "yes") || maxSpeed > 0 && maxSpeed <= wayTypeSpeed) {
233233
PriorityCode lastEntryValue = weightToPrioMap.lastEntry().getValue();
234-
if (lastEntryValue.getValue() < BEST.getValue()) weightToPrioMap.put(110d, lastEntryValue.better());
234+
if (lastEntryValue.getValue() < BEST.getValue())
235+
weightToPrioMap.put(110d, lastEntryValue.better());
235236
}
236237
}
237238

core/src/main/java/com/graphhopper/routing/util/parsers/CarAccessParser.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import java.util.*;
2727

28+
import static com.graphhopper.routing.util.FerrySpeedCalculator.FERRIES;
29+
2830
public class CarAccessParser extends AbstractAccessParser implements TagParser {
2931

3032
protected final Set<String> trackTypeValues = new HashSet<>();
@@ -80,7 +82,7 @@ public WayAccess getAccess(ReaderWay way) {
8082
String highwayValue = way.getTag("highway");
8183
String firstValue = way.getFirstPriorityTag(restrictions);
8284
if (highwayValue == null) {
83-
if (way.hasTag("route", ferries)) {
85+
if (way.hasTag("route", FERRIES)) {
8486
if (restrictedValues.contains(firstValue))
8587
return WayAccess.CAN_SKIP;
8688
if (intendedValues.contains(firstValue) ||

core/src/main/java/com/graphhopper/routing/util/parsers/CarAverageSpeedParser.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@
1818
package com.graphhopper.routing.util.parsers;
1919

2020
import com.graphhopper.reader.ReaderWay;
21-
import com.graphhopper.routing.ev.DecimalEncodedValue;
22-
import com.graphhopper.routing.ev.EdgeIntAccess;
23-
import com.graphhopper.routing.ev.EncodedValueLookup;
24-
import com.graphhopper.routing.ev.VehicleSpeed;
21+
import com.graphhopper.routing.ev.*;
22+
import com.graphhopper.routing.util.FerrySpeedCalculator;
2523
import com.graphhopper.util.Helper;
2624
import com.graphhopper.util.PMap;
2725

@@ -45,11 +43,12 @@ public class CarAverageSpeedParser extends AbstractAverageSpeedParser implements
4543
protected final Map<String, Integer> defaultSpeedMap = new HashMap<>();
4644

4745
public CarAverageSpeedParser(EncodedValueLookup lookup, PMap properties) {
48-
this(lookup.getDecimalEncodedValue(VehicleSpeed.key(properties.getString("name", "car"))));
46+
this(lookup.getDecimalEncodedValue(VehicleSpeed.key(properties.getString("name", "car"))),
47+
lookup.getDecimalEncodedValue(FerrySpeed.KEY));
4948
}
5049

51-
public CarAverageSpeedParser(DecimalEncodedValue speedEnc) {
52-
super(speedEnc);
50+
public CarAverageSpeedParser(DecimalEncodedValue speedEnc, DecimalEncodedValue ferrySpeed) {
51+
super(speedEnc, ferrySpeed);
5352

5453
badSurfaceSpeedMap.add("cobblestone");
5554
badSurfaceSpeedMap.add("unhewn_cobblestone");
@@ -124,7 +123,7 @@ protected double getSpeed(ReaderWay way) {
124123
@Override
125124
public void handleWayTags(int edgeId, EdgeIntAccess edgeIntAccess, ReaderWay way) {
126125
if (way.hasTag("route", ferries)) {
127-
double ferrySpeed = ferrySpeedCalc.getSpeed(way);
126+
double ferrySpeed = FerrySpeedCalculator.minmax(ferrySpeedEnc.getDecimal(false, edgeId, edgeIntAccess), avgSpeedEnc);
128127
setSpeed(false, edgeId, edgeIntAccess, ferrySpeed);
129128
if (avgSpeedEnc.isStoreTwoDirections())
130129
setSpeed(true, edgeId, edgeIntAccess, ferrySpeed);

core/src/main/java/com/graphhopper/routing/util/parsers/DefaultTagParserFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.graphhopper.routing.util.parsers;
1919

2020
import com.graphhopper.routing.ev.*;
21+
import com.graphhopper.routing.util.FerrySpeedCalculator;
2122
import com.graphhopper.routing.util.TransportationMode;
2223
import com.graphhopper.util.PMap;
2324

@@ -83,6 +84,8 @@ else if (name.equals(State.KEY))
8384
return new StateParser(lookup.getEnumEncodedValue(State.KEY, State.class));
8485
else if (name.equals(Crossing.KEY))
8586
return new OSMCrossingParser(lookup.getEnumEncodedValue(Crossing.KEY, Crossing.class));
87+
else if (name.equals(FerrySpeed.KEY))
88+
return new FerrySpeedCalculator(lookup.getDecimalEncodedValue(FerrySpeed.KEY));
8689
return null;
8790
}
8891
}

core/src/main/java/com/graphhopper/routing/util/parsers/FootAccessParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.*;
2727

2828
import static com.graphhopper.routing.ev.RouteNetwork.*;
29+
import static com.graphhopper.routing.util.FerrySpeedCalculator.FERRIES;
2930
import static com.graphhopper.routing.util.PriorityCode.UNCHANGED;
3031

3132
public class FootAccessParser extends AbstractAccessParser implements TagParser {
@@ -97,7 +98,7 @@ public WayAccess getAccess(ReaderWay way) {
9798
if (highwayValue == null) {
9899
WayAccess acceptPotentially = WayAccess.CAN_SKIP;
99100

100-
if (way.hasTag("route", ferries)) {
101+
if (way.hasTag("route", FERRIES)) {
101102
String footTag = way.getTag("foot");
102103
if (footTag == null || intendedValues.contains(footTag))
103104
acceptPotentially = WayAccess.FERRY;

0 commit comments

Comments
 (0)