Skip to content

Commit 58df80d

Browse files
committed
Avoid speed value 1 km/h, which gets rounded to 0 km/h by the speed encoder.
Make sure that unpaved sections of a cycle route relation do not get pushed for the race bike encoder, even tough they are part of a cycle route relation. Adding fot tests for the racing bike encoder.
1 parent 465bed5 commit 58df80d

10 files changed

+201
-51
lines changed

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

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
*/
3737
public class BikeFlagCommonEncoder extends AbstractFlagEncoder
3838
{
39-
private static final int DEFAULT_REL_CODE = 4;
39+
public static final int DEFAULT_REL_CODE = 4;
4040
public static final int PUSHING_SECTION_SPEED = 4;
4141
// private int safeWayBit = 0;
4242
private int unpavedBit = 0;
@@ -200,18 +200,19 @@ public long handleRelationTags( OSMRelation relation, long oldRelationFlags )
200200
}
201201

202202
// In case that the way belongs to a relation for which we do have a relation triggered weight change.
203-
// FIXME: Re-write in case that there is a more geneic way to influence the weighting (issue #124).
203+
// FIXME: Re-write in case that there is a more generic way to influence the weighting (issue #124).
204204
// Here we boost or reduce the speed according to the relationWeightCode:
205205
int relationWeightCodeToSpeed( int highwaySpeed, int relationCode )
206206
{
207207
int speed;
208208
if (highwaySpeed < 15)
209-
// We know that our way belongs to a cycle route, so we assume 15km/h minimum
209+
// We know that our way belongs to a cycle route, so we are optimistic and assume 15km/h minimum,
210+
// irrespective of the tracktype and surface
210211
speed = 15;
211212
else
212213
speed = highwaySpeed;
213-
// Add or remove 3km/h per every relation weight boost point
214-
return speed + 3 * (relationCode - DEFAULT_REL_CODE);
214+
// Add or remove 4km/h per every relation weight boost point
215+
return speed + 4 * (relationCode - DEFAULT_REL_CODE);
215216
}
216217

217218
@Override
@@ -317,38 +318,52 @@ public long analyzeNodeTags( OSMNode node )
317318

318319
int getSpeed( OSMWay way )
319320
{
320-
if (!way.hasTag("bicycle", intended) && way.hasTag("highway", pushingSections))
321-
if (way.hasTag("highway", "steps"))
322-
return PUSHING_SECTION_SPEED / 2;
323-
else
324-
return PUSHING_SECTION_SPEED;
321+
int speed = 0;
325322

326323
String s = way.getTag("surface");
327324
if (!Helper.isEmpty(s))
328325
{
329326
Integer sInt = SURFACE_SPEED.get(s);
330327
if (sInt != null)
331-
return sInt;
328+
speed = sInt;
332329
}
333-
String tt = way.getTag("tracktype");
334-
if (!Helper.isEmpty(tt))
330+
else
335331
{
336-
Integer tInt = TRACKTYPE_SPEED.get(tt);
337-
if (tInt != null)
338-
return tInt;
332+
String tt = way.getTag("tracktype");
333+
if (!Helper.isEmpty(tt))
334+
{
335+
Integer tInt = TRACKTYPE_SPEED.get(tt);
336+
if (tInt != null)
337+
speed = tInt;
338+
}
339+
else
340+
{
341+
String highway = way.getTag("highway");
342+
if (!Helper.isEmpty(highway))
343+
{
344+
Integer hwInt = HIGHWAY_SPEED.get(highway);
345+
if (hwInt != null) {
346+
if (way.getTag("service") == null)
347+
speed = hwInt;
348+
else
349+
speed = HIGHWAY_SPEED.get("living_street");
350+
}
351+
}
352+
}
339353
}
340-
String highway = way.getTag("highway");
341-
if (!Helper.isEmpty(highway))
354+
355+
// Until now we assumed that the way is no pusing section
356+
// Now we check, but only in case that our speed is bigger compared to the PUSHING_SECTION_SPEED
357+
if ( (speed > PUSHING_SECTION_SPEED) &&
358+
(!way.hasTag("bicycle", intended) && way.hasTag("highway", pushingSections)) )
342359
{
343-
Integer hwInt = HIGHWAY_SPEED.get(highway);
344-
if (hwInt != null) {
345-
if (way.getTag("service") == null)
346-
return hwInt;
347-
else
348-
return HIGHWAY_SPEED.get("living_street");
349-
}
360+
if (way.hasTag("highway", "steps"))
361+
speed = PUSHING_SECTION_SPEED / 2;
362+
else
363+
speed = PUSHING_SECTION_SPEED;
350364
}
351-
return 10;
365+
366+
return speed;
352367
}
353368

354369
@Override
@@ -424,7 +439,7 @@ public int getValue()
424439

425440
};
426441

427-
private final Set<String> SAFE_HIGHWAY_TAGS = new HashSet<String>();
442+
//private final Set<String> SAFE_HIGHWAY_TAGS = new HashSet<String>();
428443
private final Set<String> UNPAVED_SURFACE_TAGS = new HashSet<String>();
429444
private final Map<String, Integer> TRACKTYPE_SPEED = new HashMap<String, Integer>();
430445
private final Map<String, Integer> SURFACE_SPEED = new HashMap<String, Integer>();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class BikeFlagEncoder extends BikeFlagCommonEncoder
4747
setSurfaceSpeed("cobblestone", 6);
4848

4949
setHighwaySpeed("living_street", 15);
50-
setHighwaySpeed("steps", PUSHING_SECTION_SPEED);
50+
setHighwaySpeed("steps", PUSHING_SECTION_SPEED/2);
5151

5252
setHighwaySpeed("cycleway", 18);
5353
setHighwaySpeed("path", 18);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class MountainBikeFlagEncoder extends BikeFlagCommonEncoder
4949
setSurfaceSpeed("cobblestone", 20);
5050

5151
setHighwaySpeed("living_street", 15);
52-
setHighwaySpeed("steps", PUSHING_SECTION_SPEED);
52+
setHighwaySpeed("steps", PUSHING_SECTION_SPEED/2);
5353

5454
setHighwaySpeed("cycleway", 12);
5555
setHighwaySpeed("path", 24);

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

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,31 @@ public class RacingBikeFlagEncoder extends BikeFlagCommonEncoder
3030
{
3131
super ();
3232
setTrackTypeSpeed("grade1", 20); // paved
33-
setTrackTypeSpeed("grade2", 1); // now unpaved ...
34-
setTrackTypeSpeed("grade3", 1);
35-
setTrackTypeSpeed("grade4", 1);
36-
setTrackTypeSpeed("grade5", 1); // like sand/grass
33+
setTrackTypeSpeed("grade2", PUSHING_SECTION_SPEED); // now unpaved ...
34+
setTrackTypeSpeed("grade3", PUSHING_SECTION_SPEED/2);
35+
setTrackTypeSpeed("grade4", PUSHING_SECTION_SPEED/2);
36+
setTrackTypeSpeed("grade5", PUSHING_SECTION_SPEED/2); // like sand/grass
3737

3838
setSurfaceSpeed("asphalt", 20);
3939
setSurfaceSpeed("concrete", 20);
4040
setSurfaceSpeed("paved", 20);
41-
setSurfaceSpeed("unpaved", 1);
42-
setSurfaceSpeed("gravel", 1);
43-
setSurfaceSpeed("ground", 1);
44-
setSurfaceSpeed("dirt", 1);
45-
setSurfaceSpeed("paving_stones", 1);
46-
setSurfaceSpeed("grass", 1);
47-
setSurfaceSpeed("cobblestone", 1);
41+
setSurfaceSpeed("unpaved", PUSHING_SECTION_SPEED/2);
42+
setSurfaceSpeed("gravel", PUSHING_SECTION_SPEED/2);
43+
setSurfaceSpeed("ground", PUSHING_SECTION_SPEED/2);
44+
setSurfaceSpeed("dirt", PUSHING_SECTION_SPEED/2);
45+
setSurfaceSpeed("paving_stones", PUSHING_SECTION_SPEED);
46+
setSurfaceSpeed("grass", PUSHING_SECTION_SPEED/2);
47+
setSurfaceSpeed("cobblestone", PUSHING_SECTION_SPEED/2);
4848

4949
setHighwaySpeed("living_street", 15);
50-
setHighwaySpeed("steps", 1);
50+
setHighwaySpeed("steps", PUSHING_SECTION_SPEED/2);
5151

5252
setHighwaySpeed("cycleway", 18);
5353
setHighwaySpeed("path", 15);
5454
setHighwaySpeed("footway", 15);
5555
setHighwaySpeed("pedestrian", 15);
5656
setHighwaySpeed("road", 10);
57-
setHighwaySpeed("track", 20);
57+
setHighwaySpeed("track", PUSHING_SECTION_SPEED/2); // assume unpaved
5858
setHighwaySpeed("service", 20);
5959
setHighwaySpeed("unclassified", 20);
6060
setHighwaySpeed("residential", 20);
@@ -82,6 +82,27 @@ public class RacingBikeFlagEncoder extends BikeFlagCommonEncoder
8282

8383
}
8484

85+
// In case that the way belongs to a relation for which we do have a relation triggered weight change.
86+
// FIXME: Re-write in case that there is a more generic way to influence the weighting (issue #124).
87+
// Here we boost or reduce the speed according to the relationWeightCode:
88+
@Override
89+
int relationWeightCodeToSpeed( int highwaySpeed, int relationCode )
90+
{
91+
int speed;
92+
if ( (highwaySpeed>PUSHING_SECTION_SPEED) && (highwaySpeed < 15) )
93+
// We know that our way belongs to a cycle route, so we assume 15km/h minimum
94+
speed = 15;
95+
else
96+
speed = highwaySpeed;
97+
98+
if (speed>PUSHING_SECTION_SPEED)
99+
// Add or remove 4km/h per every relation weight boost point
100+
return speed + 4 * (relationCode - DEFAULT_REL_CODE);
101+
else
102+
return speed; // We are not pushing unpaved parts
103+
}
104+
105+
85106
@Override
86107
public String toString()
87108
{

core/src/test/java/com/graphhopper/routing/RoutingAlgorithmIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public void testMonacoRacingBike()
181181
list.add(new OneRun(43.730864, 7.420771, 43.727687, 7.418737, 2597, 110));
182182
list.add(new OneRun(43.727687, 7.418737, 43.74958, 7.436566, 3615, 155));
183183
list.add(new OneRun(43.728677, 7.41016, 43.739213, 7.427806, 2323, 100));
184-
list.add(new OneRun(43.733802, 7.413433, 43.739662, 7.424355, 1475, 80));
184+
list.add(new OneRun(43.733802, 7.413433, 43.739662, 7.424355, 1490, 74));
185185
runAlgo(testCollector, "files/monaco.osm.gz", "target/graph-monaco",
186186
list, "CAR,BIKE,RACINGBIKE", true, "RACINGBIKE", "fastest");
187187
assertEquals(testCollector.toString(), 0, testCollector.errors.size());

core/src/test/java/com/graphhopper/routing/util/AbstractBikeFlagEncoderTester.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ public abstract class AbstractBikeFlagEncoderTester
4848

4949
abstract BikeFlagCommonEncoder createBikeEncoder(String encoderlist, String encoder);
5050

51+
public int getEncodedDecodedSpeed( OSMWay way )
52+
{
53+
long allowed = encoder.acceptBit;
54+
long flags = encoder.handleWayTags(way, allowed, 0);
55+
return encoder.getSpeed(flags);
56+
}
57+
5158
public String encodeDecodeWayType( String name, OSMWay way )
5259
{
5360
long allowed = encoder.acceptBit;

core/src/test/java/com/graphhopper/routing/util/BikeFlagEncoderTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.graphhopper.reader.OSMRelation;
2121
import com.graphhopper.reader.OSMWay;
22+
import static com.graphhopper.routing.util.BikeFlagCommonEncoder.PUSHING_SECTION_SPEED;
2223
import org.junit.Test;
2324

2425
import java.util.HashMap;
@@ -162,13 +163,13 @@ public void testHandleWayTagsInfluencedByRelation()
162163
relMap.put("network", "rcn");
163164
relFlags = encoder.handleRelationTags(osmRel, 0);
164165
flags = encoder.handleWayTags(osmWay, allowed, relFlags);
165-
assertEquals(20, encoder.getSpeed(flags));
166+
assertEquals(22, encoder.getSpeed(flags));
166167

167168
// relation code is OUTSTANDING_NICE
168169
relMap.put("network", "ncn");
169170
relFlags = encoder.handleRelationTags(osmRel, 0);
170171
flags = encoder.handleWayTags(osmWay, allowed, relFlags);
171-
assertEquals(24, encoder.getSpeed(flags));
172+
assertEquals(26, encoder.getSpeed(flags));
172173

173174
// PREFER relation, but tertiary road
174175
// => no pushing section but road wayTypeCode and faster
@@ -179,7 +180,7 @@ public void testHandleWayTagsInfluencedByRelation()
179180
relMap.put("network", "lcn");
180181
relFlags = encoder.handleRelationTags(osmRel, 0);
181182
flags = encoder.handleWayTags(osmWay, allowed, relFlags);
182-
assertEquals(20, encoder.getSpeed(flags));
183+
assertEquals(22, encoder.getSpeed(flags));
183184
assertEquals(0, encoder.getWayTypeCode(flags));
184185

185186
// test max and min speed

core/src/test/java/com/graphhopper/routing/util/EncodingManagerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ public void testMixBikeTypesAndRelationCombination()
161161
long allow = bikeencoder.acceptBit | mountainbikeencoder.acceptBit;
162162
long flags = manager.handleWayTags(osmWay, allow, relFlags);
163163

164-
//Uninfluenced speed for grade1 bikeencoder = 4 (pushing section) -> smaller than 15 -> VERYNICE -> 18
165-
assertEquals(20, bikeencoder.getSpeed(flags));
164+
//Uninfluenced speed for grade1 bikeencoder = 4 (pushing section) -> smaller than 15 -> VERYNICE -> 22
165+
assertEquals(22, bikeencoder.getSpeed(flags));
166166
//Uninfluenced speed for grade1 bikeencoder = 12 -> smaller than 15 -> PREFER -> 18
167167
assertEquals(18, mountainbikeencoder.getSpeed(flags));
168168
}

core/src/test/java/com/graphhopper/routing/util/MountainBikeFlagEncoderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,21 +149,21 @@ public void testHandleWayTagsInfluencedByRelation()
149149
relMap.put("network", "lcn");
150150
relFlags = encoder.handleRelationTags(osmRel, 0);
151151
flags = encoder.handleWayTags(osmWay, allowed, relFlags);
152-
assertEquals(26, encoder.getSpeed(flags));
152+
assertEquals(28, encoder.getSpeed(flags));
153153
assertEquals(3, encoder.getWayTypeCode(flags));
154154
assertEquals(1, encoder.getPavementCode(flags));
155155

156156
// relation code is PREFER
157157
relMap.put("network", "rcn");
158158
relFlags = encoder.handleRelationTags(osmRel, 0);
159159
flags = encoder.handleWayTags(osmWay, allowed, relFlags);
160-
assertEquals(26, encoder.getSpeed(flags));
160+
assertEquals(28, encoder.getSpeed(flags));
161161

162162
// relation code is PREFER
163163
relMap.put("network", "ncn");
164164
relFlags = encoder.handleRelationTags(osmRel, 0);
165165
flags = encoder.handleWayTags(osmWay, allowed, relFlags);
166-
assertEquals(26, encoder.getSpeed(flags));
166+
assertEquals(28, encoder.getSpeed(flags));
167167

168168
// PREFER relation, but tertiary road
169169
// => no pushing section but road wayTypeCode and faster

0 commit comments

Comments
 (0)