/** Constructor for XML Parser */ public static OSMWay create(long id, XMLStreamReader parser) throws XMLStreamException { OSMWay way = new OSMWay(id); parser.nextTag(); way.readNodes(parser); way.readTags(parser); return way; }
/** Special handling for ferry ways. */ protected long handleFerry( OSMWay way, int unknownSpeed, int shortTripsSpeed, int longTripsSpeed) { // to hours double durationInHours = parseDuration(way.getTag("duration")) / 60d; if (durationInHours > 0) try { // to km double estimatedLength = Double.parseDouble(way.getTag("estimated_distance")) / 1000; // If duration AND distance is available we can calculate the speed more precisely // and set both speed to the same value. Factor 1.4 slower because of waiting time! shortTripsSpeed = (int) Math.round(estimatedLength / durationInHours / 1.4); if (shortTripsSpeed > getMaxSpeed()) shortTripsSpeed = getMaxSpeed(); longTripsSpeed = shortTripsSpeed; } catch (Exception ex) { } if (durationInHours == 0) { // unknown speed -> put penalty on ferry transport return speedEncoder.setValue(0, unknownSpeed); } else if (durationInHours > 1) { // lengthy ferries should be faster than short trip ferry return speedEncoder.setValue(0, longTripsSpeed); } else { return speedEncoder.setValue(0, shortTripsSpeed); } }
@Override public int handleWayTags(int allowed, OSMWay way) { if ((allowed & acceptBit) == 0) return 0; int encoded; if ((allowed & ferryBit) == 0) { String sacScale = way.getTag("sac_scale"); if (sacScale != null) { if ("hiking".equals(sacScale)) encoded = speedEncoder.setValue(0, MEAN); else encoded = speedEncoder.setValue(0, SLOW); } else { encoded = speedEncoder.setValue(0, MEAN); } encoded |= directionBitMask; // mark safe ways or ways with cycle lanes if (safeHighwayTags.contains(way.getTag("highway")) || way.hasTag("sidewalk", sidewalks)) { encoded |= safeWayBit; } } else { int durationInMinutes = parseDuration(way.getTag("duration")); if (durationInMinutes == 0) { // unknown speed -> put penalty on ferry transport encoded = speedEncoder.setValue(0, SLOW); } else if (durationInMinutes > 60) { // lengthy ferries should be faster than average hiking encoded = speedEncoder.setValue(0, FERRY); } else { encoded = speedEncoder.setValue(0, MEAN); } encoded |= directionBitMask; } return encoded; }
/** * Some ways are okay but not separate for pedestrians. * * <p> * * @param way */ @Override public int isAllowed(OSMWay way) { String highwayValue = way.getTag("highway"); if (highwayValue == null) { if (way.hasTag("route", ferries)) { String footTag = way.getTag("foot"); if (footTag == null || "yes".equals(footTag)) return acceptBit | ferryBit; } return 0; } String sacScale = way.getTag("sac_scale"); if (sacScale != null) { if (!"hiking".equals(sacScale) && !"mountain_hiking".equals(sacScale)) // other scales are too dangerous, see http://wiki.openstreetmap.org/wiki/Key:sac_scale return 0; } if (way.hasTag("sidewalk", sidewalks)) return acceptBit; // no need to evaluate ferries or fords - already included here if (way.hasTag("foot", intended)) return acceptBit; if (!allowedHighwayTags.contains(highwayValue)) return 0; if (way.hasTag("motorroad", "yes")) return 0; // do not get our feet wet, "yes" is already included above if (way.hasTag("highway", "ford") || way.hasTag("ford")) return 0; if (way.hasTag("bicycle", "official")) return 0; // check access restrictions if (way.hasTag(restrictions, restrictedValues)) return 0; // do not accept railways (sometimes incorrectly mapped!) if (way.hasTag("railway") && !way.hasTag("railway", acceptedRailways)) return 0; return acceptBit; }