/* * Licensed to GraphHopper GmbH under one or more contributor * license agreements. See the NOTICE file distributed with this work for * additional information regarding copyright ownership. * * GraphHopper GmbH licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.graphhopper.routing.util; import com.graphhopper.reader.ReaderWay; import com.graphhopper.routing.weighting.PriorityWeighting; import com.graphhopper.util.PMap; import java.util.TreeMap; import static com.graphhopper.routing.util.PriorityCode.*; /** * Defines bit layout for hiking * * @author Peter Karich */ public class HikeFlagEncoder extends FootFlagEncoder { /** * Should be only instantiated via EncodingManager */ public HikeFlagEncoder() { this(4, 1); } public HikeFlagEncoder(PMap properties) { this((int) properties.getLong("speedBits", 4), properties.getDouble("speedFactor", 1)); this.properties = properties; this.setBlockFords(properties.getBool("block_fords", true)); } public HikeFlagEncoder(String propertiesStr) { this(new PMap(propertiesStr)); } public HikeFlagEncoder(int speedBits, double speedFactor) { super(speedBits, speedFactor); hikingNetworkToCode.put("iwn", BEST.getValue()); hikingNetworkToCode.put("nwn", BEST.getValue()); hikingNetworkToCode.put("rwn", VERY_NICE.getValue()); hikingNetworkToCode.put("lwn", VERY_NICE.getValue()); init(); } @Override public int getVersion() { return 2; } @Override public long acceptWay(ReaderWay 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; } // special case not for all acceptedRailways, only platform if (way.hasTag("railway", "platform")) return acceptBit; return 0; } // hiking allows all sac_scale values // String sacScale = way.getTag("sac_scale"); if (way.hasTag("sidewalk", sidewalkValues)) return acceptBit; // no need to evaluate ferries or fords - already included here if (way.hasTag("foot", intendedValues)) 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 (isBlockFords() && (way.hasTag("highway", "ford") || way.hasTag("ford"))) return 0; // check access restrictions if (way.hasTag(restrictions, restrictedValues) && !getConditionalTagInspector().isRestrictedWayConditionallyPermitted(way)) return 0; if (getConditionalTagInspector().isPermittedWayConditionallyRestricted(way)) return 0; else return acceptBit; } @Override void collect(ReaderWay way, TreeMap<Double, Integer> weightToPrioMap) { String highway = way.getTag("highway"); if (way.hasTag("foot", "designated")) weightToPrioMap.put(100d, PREFER.getValue()); double maxSpeed = getMaxSpeed(way); if (safeHighwayTags.contains(highway) || maxSpeed > 0 && maxSpeed <= 20) { weightToPrioMap.put(40d, PREFER.getValue()); if (way.hasTag("tunnel", intendedValues)) { if (way.hasTag("sidewalk", sidewalksNoValues)) weightToPrioMap.put(40d, REACH_DEST.getValue()); else weightToPrioMap.put(40d, UNCHANGED.getValue()); } } else if (maxSpeed > 50 || avoidHighwayTags.contains(highway)) { if (way.hasTag("sidewalk", sidewalksNoValues)) weightToPrioMap.put(45d, WORST.getValue()); else weightToPrioMap.put(45d, REACH_DEST.getValue()); } if (way.hasTag("bicycle", "official") || way.hasTag("bicycle", "designated")) weightToPrioMap.put(44d, AVOID_IF_POSSIBLE.getValue()); } @Override public boolean supports(Class<?> feature) { if (super.supports(feature)) return true; return PriorityWeighting.class.isAssignableFrom(feature); } @Override public String toString() { return "hike"; } }