private void registerEncoder(AbstractFlagEncoder encoder) { if (encoder.isRegistered()) throw new IllegalStateException("You must not register a FlagEncoder (" + encoder.toString() + ") twice!"); encoder.setRegistered(true); int usedBits = encoder.defineNodeBits(encoderCount, nextNodeBit); if (usedBits > bitsForEdgeFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForEdgeFlags, "node")); encoder.setNodeBitMask(usedBits - nextNodeBit, nextNodeBit); nextNodeBit = usedBits; usedBits = encoder.defineWayBits(encoderCount, nextWayBit); if (usedBits > bitsForEdgeFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForEdgeFlags, "way") + WAY_ERR); encoder.setWayBitMask(usedBits - nextWayBit, nextWayBit); nextWayBit = usedBits; usedBits = encoder.defineRelationBits(encoderCount, nextRelBit); if (usedBits > bitsForEdgeFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForEdgeFlags, "relation")); encoder.setRelBitMask(usedBits - nextRelBit, nextRelBit); nextRelBit = usedBits; usedBits = encoder.defineTurnBits(encoderCount, nextTurnBit); if (usedBits > bitsForTurnFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForTurnFlags, "turn"));
/** * Determine whether a way is routable for one of the added encoders. */ public long acceptWay(ReaderWay way) { long includeWay = 0; for (AbstractFlagEncoder encoder : edgeEncoders) { includeWay |= encoder.acceptWay(way); } return includeWay; }
public void applyWayTags(ReaderWay way, EdgeIteratorState edge) { // storing the road name does not yet depend on the flagEncoder so manage it directly if (enableInstructions) { // String wayInfo = carFlagEncoder.getWayInfo(way); // http://wiki.openstreetmap.org/wiki/Key:name String name = ""; if (!preferredLanguage.isEmpty()) name = fixWayName(way.getTag("name:" + preferredLanguage)); if (name.isEmpty()) name = fixWayName(way.getTag("name")); // http://wiki.openstreetmap.org/wiki/Key:ref String refName = fixWayName(way.getTag("ref")); if (!refName.isEmpty()) { if (name.isEmpty()) name = refName; else name += ", " + refName; } edge.setName(name); } for (AbstractFlagEncoder encoder : edgeEncoders) { encoder.applyWayTags(way, edge); } }
public String toDetailsString() { StringBuilder str = new StringBuilder(); for (AbstractFlagEncoder encoder : edgeEncoders) { if (str.length() > 0) str.append(","); str.append(encoder.toString()) .append("|") .append(encoder.getPropertiesString()) .append("|version=") .append(encoder.getVersion()); } return str.toString(); }
@Override public long setSpeed(long flags, double speed) { if (speed < 0 || Double.isNaN(speed)) throw new IllegalArgumentException("Speed cannot be negative or NaN: " + speed + ", flags:" + BitUtil.LITTLE.toBitString(flags)); if (speed < speedEncoder.factor / 2) return setLowSpeed(flags, speed, false); if (speed > getMaxSpeed()) speed = getMaxSpeed(); return speedEncoder.setDoubleValue(flags, speed); }
/** * Define the place of the speedBits in the edge flags for car. */ @Override public int defineWayBits(int index, int shift) { // first two bits are reserved for route handling in superclass shift = super.defineWayBits(index, shift); speedEncoder = new EncodedDoubleValue("Speed", shift, speedBits, speedFactor, defaultSpeedMap.get("secondary"), maxPossibleSpeed); return shift + speedEncoder.getBits(); }
@Override public double getDouble(long flags, int key) { switch (key) { case PriorityWeighting.KEY: return (double) priorityWayEncoder.getValue(flags) / BEST.getValue(); default: return super.getDouble(flags, key); } }
/** * @param way needed to retrieve tags * @param speed speed guessed e.g. from the road type or other tags * @return The assumed speed. */ protected double applyMaxSpeed(ReaderWay way, double speed) { double maxSpeed = getMaxSpeed(way); // We obey speed limits if (maxSpeed >= 0) { // We assume that the average speed is 90% of the allowed maximum return maxSpeed * 0.9; } return speed; }
public long flagsDefault(boolean forward, boolean backward) { long flags = 0; for (AbstractFlagEncoder encoder : edgeEncoders) { flags |= encoder.flagsDefault(forward, backward); } return flags; }
@Override protected String getPropertiesString() { return super.getPropertiesString() + "|store_height=" + storeHeight + "|store_weight=" + storeWeight + "|store_width=" + storeWidth; }
@Override public int defineWayBits(int index, int shift) { // first two bits are reserved for route handling in superclass shift = super.defineWayBits(index, shift); // larger value required - ferries are faster than pedestrians speedEncoder = new EncodedDoubleValue("Speed", shift, speedBits, speedFactor, MEAN_SPEED, maxPossibleSpeed); shift += speedEncoder.getBits(); priorityWayEncoder = new EncodedValue("PreferWay", shift, 3, 1, 0, 7); shift += priorityWayEncoder.getBits(); return shift; }
@Override public long setSpeed(long flags, double speed) { if (speed < 0 || Double.isNaN(speed)) throw new IllegalArgumentException("Speed cannot be negative or NaN: " + speed + ", flags:" + BitUtil.LITTLE.toBitString(flags)); if (speed < speedEncoder.factor / 2) return setLowSpeed(flags, speed, false); if (speed > getMaxSpeed()) speed = getMaxSpeed(); return speedEncoder.setDoubleValue(flags, speed); }
public String toDetailsString() { StringBuilder str = new StringBuilder(); for (AbstractFlagEncoder encoder : edgeEncoders) { if (str.length() > 0) str.append(","); str.append(encoder.toString()) .append("|") .append(encoder.getPropertiesString()) .append("|version=") .append(encoder.getVersion()); } return str.toString(); }
@Override public double getDouble(long flags, int key) { switch (key) { case PriorityWeighting.KEY: return (double) priorityWayEncoder.getValue(flags) / BEST.getValue(); default: return super.getDouble(flags, key); } }
if (calculatedTripSpeed > getMaxSpeed()) { return getMaxSpeed();
public long flagsDefault( boolean forward, boolean backward ) { long flags = 0; for (AbstractFlagEncoder encoder : edgeEncoders) { flags |= encoder.flagsDefault(forward, backward); } return flags; }
@Override protected String getPropertiesString() { return super.getPropertiesString() + "|store_height=" + storeHeight + "|store_weight=" + storeWeight + "|store_width=" + storeWidth + "|spatial_rules=" + spatialRules; }
private void registerEncoder(AbstractFlagEncoder encoder) { if (encoder.isRegistered()) throw new IllegalStateException("You must not register a FlagEncoder (" + encoder.toString() + ") twice!"); encoder.setRegistered(true); int usedBits = encoder.defineNodeBits(encoderCount, nextNodeBit); if (usedBits > bitsForEdgeFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForEdgeFlags, "node")); encoder.setNodeBitMask(usedBits - nextNodeBit, nextNodeBit); nextNodeBit = usedBits; usedBits = encoder.defineWayBits(encoderCount, nextWayBit); if (usedBits > bitsForEdgeFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForEdgeFlags, "way") + WAY_ERR); encoder.setWayBitMask(usedBits - nextWayBit, nextWayBit); nextWayBit = usedBits; usedBits = encoder.defineRelationBits(encoderCount, nextRelBit); if (usedBits > bitsForEdgeFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForEdgeFlags, "relation")); encoder.setRelBitMask(usedBits - nextRelBit, nextRelBit); nextRelBit = usedBits; usedBits = encoder.defineTurnBits(encoderCount, nextTurnBit); if (usedBits > bitsForTurnFlags) throw new IllegalArgumentException(String.format(Locale.ROOT, ERR, usedBits, bitsForTurnFlags, "turn"));
@Override public int defineWayBits(int index, int shift) { // first two bits are reserved for route handling in superclass shift = super.defineWayBits(index, shift); speedEncoder = new EncodedDoubleValue("Speed", shift, speedBits, speedFactor, highwaySpeeds.get("cycleway"), maxPossibleSpeed); shift += speedEncoder.getBits(); unpavedBit = 1L << shift++; // 2 bits wayTypeEncoder = new EncodedValue("WayType", shift, 2, 1, 0, 3, true); shift += wayTypeEncoder.getBits(); priorityWayEncoder = new EncodedValue("PreferWay", shift, 3, 1, 0, 7); shift += priorityWayEncoder.getBits(); return shift; }
@Override public long setSpeed( long flags, double speed ) { if (speed < 0 || Double.isNaN(speed)) throw new IllegalArgumentException("Speed cannot be negative or NaN: " + speed + ", flags:" + BitUtil.LITTLE.toBitString(flags)); if (speed < speedEncoder.factor / 2) return setLowSpeed(flags, speed, false); if (speed > getMaxSpeed()) speed = getMaxSpeed(); return speedEncoder.setDoubleValue(flags, speed); }