return new MotorcycleFlagEncoder(configuration);
@Override public long handleWayTags(ReaderWay way, long allowed, long priorityFromRelation) { if (!isAccept(allowed)) return 0; if (!isFerry(allowed)) { double speed = getSpeed(way); speed = applyMaxSpeed(way, speed); double maxMCSpeed = parseSpeed(way.getTag("maxspeed:motorcycle")); if (maxMCSpeed > 0 && maxMCSpeed < speed) speed = maxMCSpeed * 0.9; flags = setBool(0, K_ROUNDABOUT, true); flags = setReverseSpeed(flags, speed); flags |= backwardBit; } else { flags = setSpeed(flags, speed); flags |= forwardBit; flags = setSpeed(flags, speed); flags = setReverseSpeed(flags, speed); flags |= directionBitMask; double ferrySpeed = getFerrySpeed(way); flags = setSpeed(flags, ferrySpeed); flags = setReverseSpeed(flags, ferrySpeed); flags |= directionBitMask;
@Override public void applyWayTags(ReaderWay way, EdgeIteratorState edge) { double speed = this.getSpeed(edge.getFlags()); double roadDistance = edge.getDistance(); double beelineDistance = getBeelineDistance(way); double bendiness = beelineDistance / roadDistance; bendiness = discriminateSlowStreets(bendiness, speed); bendiness = increaseBendinessImpact(bendiness); bendiness = correctErrors(bendiness); edge.setFlags(this.curvatureEncoder.setValue(edge.getFlags(), convertToInt(bendiness))); }
@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); }
@Test public void testSetSpeed0_issue367() { long flags = encoder.setProperties(10, true, true); flags = encoder.setSpeed(flags, 0); assertEquals(0, encoder.getSpeed(flags), .1); assertEquals(10, encoder.getReverseSpeed(flags), .1); assertFalse(encoder.isForward(flags)); assertTrue(encoder.isBackward(flags)); }
@Test public void testRoundabout() { long flags = encoder.setAccess(0, true, true); long resFlags = encoder.setBool(flags, FlagEncoder.K_ROUNDABOUT, true); assertTrue(encoder.isBool(resFlags, FlagEncoder.K_ROUNDABOUT)); assertTrue(encoder.isForward(resFlags)); assertTrue(encoder.isBackward(resFlags)); resFlags = encoder.setBool(flags, FlagEncoder.K_ROUNDABOUT, false); assertFalse(encoder.isBool(resFlags, FlagEncoder.K_ROUNDABOUT)); assertTrue(encoder.isForward(resFlags)); assertTrue(encoder.isBackward(resFlags)); ReaderWay way = new ReaderWay(1); way.setTag("highway", "motorway"); flags = encoder.handleWayTags(way, encoder.acceptBit, 0); assertTrue(encoder.isForward(flags)); assertTrue(encoder.isBackward(flags)); assertFalse(encoder.isBool(flags, FlagEncoder.K_ROUNDABOUT)); way.setTag("junction", "roundabout"); flags = encoder.handleWayTags(way, encoder.acceptBit, 0); assertTrue(encoder.isForward(flags)); assertFalse(encoder.isBackward(flags)); assertTrue(encoder.isBool(flags, FlagEncoder.K_ROUNDABOUT)); way.clearTags(); way.setTag("highway", "motorway"); way.setTag("junction", "circular"); flags = encoder.handleWayTags(way, encoder.acceptBit, 0); assertTrue(encoder.isForward(flags)); assertFalse(encoder.isBackward(flags)); assertTrue(encoder.isBool(flags, FlagEncoder.K_ROUNDABOUT)); }
@Test public void testHandleWayTags() { ReaderWay way = new ReaderWay(1); way.setTag("highway", "service"); long flags = encoder.acceptWay(way); assertTrue(flags > 0); long result = encoder.handleWayTags(way, flags, 0); assertEquals(20, encoder.getSpeed(result), .1); assertEquals(20, encoder.getReverseSpeed(result), .1); }
@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; }
@Test public void testAccess() { ReaderWay way = new ReaderWay(1); assertFalse(encoder.acceptWay(way) > 0); way.setTag("highway", "service"); assertTrue(encoder.acceptWay(way) > 0); way.setTag("access", "no"); assertFalse(encoder.acceptWay(way) > 0); assertTrue(encoder.acceptWay(way) > 0); assertFalse(encoder.acceptWay(way) > 0); assertFalse(encoder.acceptWay(way) > 0); way.setTag("motorcycle", "yes"); assertTrue(encoder.acceptWay(way) > 0); assertTrue(encoder.acceptWay(way) > 0); assertTrue(encoder.isFerry(encoder.acceptWay(way))); way.setTag("motorcycle", "no"); assertFalse(encoder.acceptWay(way) > 0); assertFalse(encoder.acceptWay(way) > 0); assertFalse(encoder.isFerry(encoder.acceptWay(way))); assertFalse(encoder.acceptWay(way) > 0); way.setTag("access", "yes"); way.setTag("motor_vehicle", "no"); assertFalse(encoder.acceptWay(way) > 0);
private Graph initExampleGraph() { GraphHopperStorage gs = new GraphHopperStorage(new RAMDirectory(), em, true, new GraphExtension.NoOpExtension()).create(1000); NodeAccess na = gs.getNodeAccess(); // 50--(0.0001)-->49--(0.0004)-->55--(0.0005)-->60 na.setNode(0, 51.1, 12.001, 50); na.setNode(1, 51.1, 12.002, 60); EdgeIteratorState edge = gs.edge(0, 1). setWayGeometry(Helper.createPointList3D(51.1, 12.0011, 49, 51.1, 12.0015, 55)); edge.setDistance(100); edge.setFlags(encoder.setReverseSpeed(encoder.setProperties(10, true, true), 15)); return gs; }
@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 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 handleWayTags(ReaderWay way, long allowed, long priorityFromRelation) { if (!isAccept(allowed)) return 0; if (!isFerry(allowed)) { double speed = getSpeed(way); speed = applyMaxSpeed(way, speed); double maxMCSpeed = parseSpeed(way.getTag("maxspeed:motorcycle")); if (maxMCSpeed > 0 && maxMCSpeed < speed) speed = maxMCSpeed * 0.9; flags = setBool(0, K_ROUNDABOUT, true); flags = setReverseSpeed(flags, speed); flags |= backwardBit; } else { flags = setSpeed(flags, speed); flags |= forwardBit; flags = setSpeed(flags, speed); flags = setReverseSpeed(flags, speed); flags |= directionBitMask; double ferrySpeed = getFerrySpeed(way); flags = setSpeed(flags, ferrySpeed); flags = setReverseSpeed(flags, ferrySpeed); flags |= directionBitMask;
@Override public void applyWayTags(ReaderWay way, EdgeIteratorState edge) { double speed = this.getSpeed(edge.getFlags()); double roadDistance = edge.getDistance(); double beelineDistance = getBeelineDistance(way); double bendiness = beelineDistance / roadDistance; bendiness = discriminateSlowStreets(bendiness, speed); bendiness = increaseBendinessImpact(bendiness); bendiness = correctErrors(bendiness); edge.setFlags(this.curvatureEncoder.setValue(edge.getFlags(), convertToInt(bendiness))); }
@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); }
@Test public void testDirectionDependentSpeedFwdSearch() { runTestWithDirectionDependentEdgeSpeed(10, 20, 0, 2, IntArrayList.from(0, 1, 2), new MotorcycleFlagEncoder()); runTestWithDirectionDependentEdgeSpeed(10, 20, 0, 2, IntArrayList.from(0, 1, 2), new Bike2WeightFlagEncoder()); }
@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; }