Skip to content

Commit 5adac66

Browse files
authored
Merge pull request #945 from GIScience/feature#944-encoding_of_low_speed_edges
More consistent handling of low-speed edges
2 parents 17eb7fb + 50594e8 commit 5adac66

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ RELEASING:
3737
### Added
3838
- Time-dependent core-based routing algorithms
3939
- Option to disable edge-based routing in core for a single weighting ([#928](https://github.com/GIScience/openrouteservice/issues/928))
40+
### Changed
41+
- Speed values falling below encoder's resolution are consequently stored as lowest possible non-zero value rather than being rounded to zero together with setting access to the corresponding edges to false ([#944](https://github.com/GIScience/openrouteservice/issues/944))
4042
### Fixed
4143
- Do not consider ill-defined "maxspeed = 0" OSM tags ([#940](https://github.com/GIScience/openrouteservice/issues/940))
4244
- Use JSON definitions of country-specific speed limits ([#939](https://github.com/GIScience/openrouteservice/issues/939))

openrouteservice/src/main/java/org/heigit/ors/routing/graphhopper/extensions/flagencoders/VehicleFlagEncoder.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.graphhopper.routing.util.EncodingManager;
2626
import com.graphhopper.storage.ConditionalEdges;
2727
import com.graphhopper.storage.IntsRef;
28+
import com.graphhopper.util.BitUtil;
2829
import com.graphhopper.util.Helper;
2930
import com.graphhopper.util.PMap;
3031

@@ -64,6 +65,8 @@ public abstract class VehicleFlagEncoder extends ORSAbstractFlagEncoder {
6465
// This value determines the speed for roads with access=destination
6566
protected int destinationSpeed;
6667

68+
protected final double minPossibleSpeed;
69+
6770
protected Map<String, Integer> trackTypeSpeedMap;
6871
protected Map<String, Integer> badSurfaceSpeedMap;
6972
protected Map<String, Integer> defaultSpeedMap;
@@ -84,6 +87,8 @@ protected void setProperties(PMap properties) {
8487
VehicleFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts) {
8588
super(speedBits, speedFactor, maxTurnCosts);
8689

90+
minPossibleSpeed = this.speedFactor;
91+
8792
restrictions.addAll(Arrays.asList("motorcar", "motor_vehicle", "vehicle", "access"));
8893

8994
restrictedValues.add("private");
@@ -224,18 +229,13 @@ public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, EncodingManager.A
224229

225230
speed = getSurfaceSpeed(way, speed);
226231

227-
if(way.hasTag(KEY_ESTIMATED_DISTANCE)) {
228-
if(this.useAcceleration) {
232+
if (way.hasTag(KEY_ESTIMATED_DISTANCE)) {
233+
if (way.hasTag(KEY_HIGHWAY, KEY_RESIDENTIAL)) {
234+
speed = addResedentialPenalty(speed, way);
235+
}
236+
else if (this.useAcceleration) {
229237
double estDist = way.getTag(KEY_ESTIMATED_DISTANCE, Double.MAX_VALUE);
230-
if(way.hasTag(KEY_HIGHWAY, KEY_RESIDENTIAL)) {
231-
speed = addResedentialPenalty(speed, way);
232-
} else {
233-
speed = Math.max(adjustSpeedForAcceleration(estDist, speed), speedFactor);
234-
}
235-
} else {
236-
if(way.hasTag(KEY_HIGHWAY, KEY_RESIDENTIAL)) {
237-
speed = addResedentialPenalty(speed, way);
238-
}
238+
speed = adjustSpeedForAcceleration(estDist, speed);
239239
}
240240
}
241241

@@ -296,6 +296,21 @@ public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, EncodingManager.A
296296
return edgeFlags;
297297
}
298298

299+
// Override this method in order to set minimum speed rather than disabling access
300+
@Override
301+
protected void setSpeed(boolean reverse, IntsRef edgeFlags, double speed) {
302+
if (speed >= 0.0D && !Double.isNaN(speed)) {
303+
if (speed < minPossibleSpeed)
304+
speed = minPossibleSpeed;
305+
else if (speed > this.getMaxSpeed())
306+
speed = this.getMaxSpeed();
307+
308+
this.speedEncoder.setDecimal(reverse, edgeFlags, speed);
309+
} else {
310+
throw new IllegalArgumentException("Speed cannot be negative or NaN: " + speed + ", flags:" + BitUtil.LITTLE.toBitString(edgeFlags));
311+
}
312+
}
313+
299314
private void setAccess(EncodingManager.Access access, IntsRef edgeFlags, boolean fwd, boolean bwd) {
300315
if (fwd)
301316
accessEnc.setBool(false, edgeFlags, true);
@@ -478,9 +493,6 @@ protected int getTrackGradeLevel(String grade) {
478493
if(interimDistance < 100) {
479494
speed = speed * 0.5;
480495
}
481-
//Don't go below 2.5 because it will be stored as 0 later
482-
if(speed < 5)
483-
speed = 5;
484496
}
485497

486498
return speed;

0 commit comments

Comments
 (0)