return new Bike2WeightFlagEncoder(configuration);
double fwdDecline = decDist2DSum > 1 ? decEleSum / decDist2DSum : 0; double restDist2D = fullDist2D - incDist2DSum - decDist2DSum; double maxSpeed = getHighwaySpeed("cycleway"); if (isForward(flags)) { double speed = getSpeed(flags); double fwdFaster = 1 + 2 * keepIn(fwdDecline, 0, 0.2); fwdFaster = fwdFaster * fwdFaster; fwdSlower = fwdSlower * fwdSlower; speed = speed * (fwdSlower * incDist2DSum + fwdFaster * decDist2DSum + 1 * restDist2D) / fullDist2D; flags = this.setSpeed(flags, keepIn(speed, PUSHING_SECTION_SPEED / 2, maxSpeed)); if (isBackward(flags)) { double speedReverse = getReverseSpeed(flags); double bwFaster = 1 + 2 * keepIn(fwdIncline, 0, 0.2); bwFaster = bwFaster * bwFaster; bwSlower = bwSlower * bwSlower; speedReverse = speedReverse * (bwFaster * incDist2DSum + bwSlower * decDist2DSum + 1 * restDist2D) / fullDist2D; flags = this.setReverseSpeed(flags, keepIn(speedReverse, PUSHING_SECTION_SPEED / 2, maxSpeed));
@Override public long setReverseSpeed(long flags, double speed) { if (speed < 0) throw new IllegalArgumentException("Speed cannot be negative: " + speed + ", flags:" + BitUtil.LITTLE.toBitString(flags)); if (speed < speedEncoder.factor / 2) return setLowSpeed(flags, speed, true); if (speed > getMaxSpeed()) speed = getMaxSpeed(); return reverseSpeedEncoder.setDoubleValue(flags, speed); }
@Override public long handleSpeed(ReaderWay way, double speed, long flags) { // handle oneways flags = super.handleSpeed(way, speed, flags); if (isBackward(flags)) flags = setReverseSpeed(flags, speed); if (isForward(flags)) flags = setSpeed(flags, speed); return flags; }
@Override public long reverseFlags(long flags) { // swap access flags = super.reverseFlags(flags); // swap speeds double otherValue = reverseSpeedEncoder.getDoubleValue(flags); flags = setReverseSpeed(flags, speedEncoder.getDoubleValue(flags)); return setSpeed(flags, otherValue); }
@Override public int defineWayBits(int index, int shift) { shift = super.defineWayBits(index, shift); reverseSpeedEncoder = new EncodedDoubleValue("Reverse Speed", shift, speedBits, speedFactor, getHighwaySpeed("cycleway"), maxPossibleSpeed); shift += reverseSpeedEncoder.getBits(); return shift; }
@Override public long setProperties(double speed, boolean forward, boolean backward) { long flags = super.setProperties(speed, forward, backward); if (backward) return setReverseSpeed(flags, speed); return flags; }
@Override public long handleSpeed(ReaderWay way, double speed, long flags) { // handle oneways flags = super.handleSpeed(way, speed, flags); if (isBackward(flags)) flags = setReverseSpeed(flags, speed); if (isForward(flags)) flags = setSpeed(flags, speed); return flags; }
@Override public long reverseFlags( long flags ) { // swap access flags = super.reverseFlags(flags); // swap speeds double otherValue = reverseSpeedEncoder.getDoubleValue(flags); flags = setReverseSpeed(flags, speedEncoder.getDoubleValue(flags)); return setSpeed(flags, otherValue); }
@Override public int defineWayBits(int index, int shift) { shift = super.defineWayBits(index, shift); reverseSpeedEncoder = new EncodedDoubleValue("Reverse Speed", shift, speedBits, speedFactor, getHighwaySpeed("cycleway"), maxPossibleSpeed); shift += reverseSpeedEncoder.getBits(); return shift; }
@Override public long setProperties( double speed, boolean forward, boolean backward ) { long flags = super.setProperties(speed, forward, backward); if (backward) return setReverseSpeed(flags, speed); return flags; }
double fwdDecline = decDist2DSum > 1 ? decEleSum / decDist2DSum : 0; double restDist2D = fullDist2D - incDist2DSum - decDist2DSum; double maxSpeed = getHighwaySpeed("cycleway"); if (isForward(flags)) { double speed = getSpeed(flags); double fwdFaster = 1 + 2 * keepIn(fwdDecline, 0, 0.2); fwdFaster = fwdFaster * fwdFaster; fwdSlower = fwdSlower * fwdSlower; speed = speed * (fwdSlower * incDist2DSum + fwdFaster * decDist2DSum + 1 * restDist2D) / fullDist2D; flags = this.setSpeed(flags, keepIn(speed, PUSHING_SECTION_SPEED / 2, maxSpeed)); if (isBackward(flags)) { double speedReverse = getReverseSpeed(flags); double bwFaster = 1 + 2 * keepIn(fwdIncline, 0, 0.2); bwFaster = bwFaster * bwFaster; bwSlower = bwSlower * bwSlower; speedReverse = speedReverse * (bwFaster * incDist2DSum + bwSlower * decDist2DSum + 1 * restDist2D) / fullDist2D; flags = this.setReverseSpeed(flags, keepIn(speedReverse, PUSHING_SECTION_SPEED / 2, maxSpeed));
@Override public long handleSpeed( OSMWay way, double speed, long flags ) { // handle oneways flags = super.handleSpeed(way, speed, flags); if (isBackward(flags)) flags = setReverseSpeed(flags, speed); if (isForward(flags)) flags = setSpeed(flags, speed); return flags; }
@Test public void testDirectionDependentSpeedBwdSearch() { runTestWithDirectionDependentEdgeSpeed(20, 10, 2, 0, IntArrayList.from(2, 1, 0), new MotorcycleFlagEncoder()); runTestWithDirectionDependentEdgeSpeed(20, 10, 2, 0, IntArrayList.from(2, 1, 0), new Bike2WeightFlagEncoder()); }
@Override public long reverseFlags(long flags) { // swap access flags = super.reverseFlags(flags); // swap speeds double otherValue = reverseSpeedEncoder.getDoubleValue(flags); flags = setReverseSpeed(flags, speedEncoder.getDoubleValue(flags)); return setSpeed(flags, otherValue); }
@Override public long setReverseSpeed( long flags, double speed ) { if (speed < 0) throw new IllegalArgumentException("Speed cannot be negative: " + speed + ", flags:" + BitUtil.LITTLE.toBitString(flags)); if (speed < speedEncoder.factor / 2) return setLowSpeed(flags, speed, true); if (speed > getMaxSpeed()) speed = getMaxSpeed(); return reverseSpeedEncoder.setDoubleValue(flags, speed); }
@Override public int defineWayBits( int index, int shift ) { shift = super.defineWayBits(index, shift); reverseSpeedEncoder = new EncodedDoubleValue("Reverse Speed", shift, speedBits, speedFactor, getHighwaySpeed("cycleway"), maxPossibleSpeed); shift += reverseSpeedEncoder.getBits(); return shift; }