ElectroBikeFlagEncoder.java

/*  This file is part of Openrouteservice.
 *
 *  Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
 *  GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
 *  of the License, or (at your option) any later version.

 *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *  See the GNU Lesser General Public License for more details.

 *  You should have received a copy of the GNU Lesser General Public License along with this library;
 *  if not, see <https://www.gnu.org/licenses/>.
 */
package org.heigit.ors.routing.graphhopper.extensions.flagencoders.bike;

import com.graphhopper.util.PMap;
import org.heigit.ors.routing.graphhopper.extensions.flagencoders.FlagEncoderNames;

public class ElectroBikeFlagEncoder extends CommonBikeFlagEncoder {
    private static final int MEAN_SPEED = 20;

    public ElectroBikeFlagEncoder(PMap properties) {
        this((int) properties.getLong("speed_bits", 4) + (properties.getBool("consider_elevation", false) ? 1 : 0),
                properties.getLong("speed_factor", 2),
                properties.getBool("turn_costs", false) ? 1 : 0, properties.getBool("consider_elevation", false));
        setProperties(properties);
    }

    public ElectroBikeFlagEncoder(int speedBits, double speedFactor, int maxTurnCosts, boolean considerElevation) {
        super(speedBits, speedFactor, maxTurnCosts, considerElevation);

        preferHighwayTags.add("service");
        preferHighwayTags.add("tertiary");
        preferHighwayTags.add("tertiary_link");
        preferHighwayTags.add("residential");
        preferHighwayTags.add("unclassified");

        setTrackTypeSpeed("grade1", 21); // paved
        setTrackTypeSpeed("grade2", 15); // now unpaved ...
        setTrackTypeSpeed("grade3", 9);
        setTrackTypeSpeed("grade4", 7);
        setTrackTypeSpeed("grade5", 4); // like sand/grass

        setSurfaceSpeed("paved", 21);
        setSurfaceSpeed("asphalt", 21);
        setSurfaceSpeed("cobblestone", 9);
        setSurfaceSpeed("cobblestone:flattened", 11);
        setSurfaceSpeed("sett", 11);
        setSurfaceSpeed("concrete", 21);
        setSurfaceSpeed("concrete:lanes", 18);
        setSurfaceSpeed("concrete:plates", 18);
        setSurfaceSpeed("paving_stones", 13);
        setSurfaceSpeed("paving_stones:30", 13);
        setSurfaceSpeed("unpaved", 15);
        setSurfaceSpeed("compacted", 17);
        setSurfaceSpeed("dirt", 11);
        setSurfaceSpeed("earth", 13);
        setSurfaceSpeed("fine_gravel", 19);
        setSurfaceSpeed("grass", 9);
        setSurfaceSpeed("grass_paver", 9);
        setSurfaceSpeed("gravel", 13);
        setSurfaceSpeed("ground", 13);
        setSurfaceSpeed("ice", PUSHING_SECTION_SPEED / 2);
        setSurfaceSpeed("metal", 11);
        setSurfaceSpeed("mud", 11);
        setSurfaceSpeed("pebblestone", 18);
        setSurfaceSpeed("salt", 7);
        setSurfaceSpeed("sand", 7);
        setSurfaceSpeed("wood", 7);

        setHighwaySpeed("living_street", 9);
        setHighwaySpeed("steps", PUSHING_SECTION_SPEED / 2);
        setHighwaySpeed("cycleway", 21);
        setHighwaySpeed("path", 13);
        setHighwaySpeed("footway", 7);
        setHighwaySpeed("pedestrian", 7);
        setHighwaySpeed("road", 14);
        setHighwaySpeed("track", 13);
        setHighwaySpeed("service", 15);
        setHighwaySpeed("unclassified", 18);
        setHighwaySpeed("residential", 21);

        setHighwaySpeed("trunk", 20);
        setHighwaySpeed("trunk_link", 20);
        setHighwaySpeed("primary", 21);
        setHighwaySpeed("primary_link", 21);
        setHighwaySpeed("secondary", 21);
        setHighwaySpeed("secondary_link", 21);
        setHighwaySpeed("tertiary", 21);
        setHighwaySpeed("tertiary_link", 21);

        addPushingSection("path");
        addPushingSection("footway");
        addPushingSection("pedestrian");
        addPushingSection("steps");

        avoidHighwayTags.add("trunk");
        avoidHighwayTags.add("trunk_link");
        avoidHighwayTags.add("primary");
        avoidHighwayTags.add("primary_link");
        avoidHighwayTags.add("secondary");
        avoidHighwayTags.add("secondary_link");

        blockByDefaultBarriers.add("kissing_gate");

        setSpecificClassBicycle("touring");
    }

    public double getMeanSpeed() {
        return MEAN_SPEED;
    }

    @Override
    protected double getDownhillMaxSpeed() {
        return 30;
    }

    @Override
    public String toString() {
        return FlagEncoderNames.BIKE_ELECTRO;
    }
}