Skip to content

Commit 50594e8

Browse files
committed
Move low speed checks to setSpeed method
1 parent e934b73 commit 50594e8

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
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: 21 additions & 4 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");
@@ -230,7 +235,7 @@ public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, EncodingManager.A
230235
}
231236
else if (this.useAcceleration) {
232237
double estDist = way.getTag(KEY_ESTIMATED_DISTANCE, Double.MAX_VALUE);
233-
speed = Math.max(adjustSpeedForAcceleration(estDist, speed), speedFactor);
238+
speed = adjustSpeedForAcceleration(estDist, speed);
234239
}
235240
}
236241

@@ -291,6 +296,21 @@ else if (this.useAcceleration) {
291296
return edgeFlags;
292297
}
293298

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+
294314
private void setAccess(EncodingManager.Access access, IntsRef edgeFlags, boolean fwd, boolean bwd) {
295315
if (fwd)
296316
accessEnc.setBool(false, edgeFlags, true);
@@ -473,9 +493,6 @@ protected int getTrackGradeLevel(String grade) {
473493
if(interimDistance < 100) {
474494
speed = speed * 0.5;
475495
}
476-
//Don't go below 2.5 because it will be stored as 0 later
477-
if(speed < 5)
478-
speed = 5;
479496
}
480497

481498
return speed;

0 commit comments

Comments
 (0)