diff --git a/CHANGELOG.md b/CHANGELOG.md index 403e89da0a..51a0cef885 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,8 @@ Releasing is documented in RELEASE.md ## [unreleased] ### Added -- Full support for EncodedValues ([#2106](https://github.com/GIScience/openrouteservice/issues/2106)) +- full support for encoded values ([#2108](https://github.com/GIScience/openrouteservice/issues/2108)) +- enable encoded value "ors_surface" ([#2110](https://github.com/GIScience/openrouteservice/issues/2110)) ### Changed - remove spurious entry for an unassigned country ID value 137 from the documentation ([#2103](https://github.com/GIScience/openrouteservice/pull/2103)) diff --git a/ors-api/src/test/java/org/heigit/ors/apitests/routing/ResultTest.java b/ors-api/src/test/java/org/heigit/ors/apitests/routing/ResultTest.java index ff871eea94..bdf10aa9eb 100644 --- a/ors-api/src/test/java/org/heigit/ors/apitests/routing/ResultTest.java +++ b/ors-api/src/test/java/org/heigit/ors/apitests/routing/ResultTest.java @@ -4073,7 +4073,7 @@ void testCustomProfileSurfaceType() { JSONObject customModel = new JSONObject(); JSONObject priority = new JSONObject(); - priority.put("if", "surface == PAVING_STONES"); + priority.put("if", "ors_surface == PAVING_STONES"); priority.put("multiply_by", 0); customModel.put("priority", new JSONArray().put(priority)); body.put("custom_model", customModel); diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/ORSGraphHopperConfig.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/ORSGraphHopperConfig.java index cae3a8dde1..2313a7fad7 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/ORSGraphHopperConfig.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/ORSGraphHopperConfig.java @@ -4,7 +4,7 @@ import com.graphhopper.config.CHProfile; import com.graphhopper.config.LMProfile; import com.graphhopper.config.Profile; -import com.graphhopper.routing.ev.Surface; +import com.graphhopper.routing.ev.OrsSurface; import com.graphhopper.routing.weighting.custom.CustomProfile; import com.graphhopper.util.CustomModel; import com.graphhopper.util.Helper; @@ -260,7 +260,7 @@ public static ORSGraphHopperConfig createGHSettings(ProfileProperties profile, E } private static void addGraphLevelEncodedValues(ORSGraphHopperConfig ghConfig) { - ghConfig.putObject("graph.encoded_values", Surface.KEY); + ghConfig.putObject("graph.encoded_values", OrsSurface.KEY); } public List getCoreProfiles() { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsTagParserFactory.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsTagParserFactory.java index 8ae05c3507..19523ad889 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsTagParserFactory.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsTagParserFactory.java @@ -1,9 +1,11 @@ package org.heigit.ors.routing.graphhopper.extensions; +import com.graphhopper.routing.ev.OrsSurface; import com.graphhopper.routing.util.parsers.DefaultTagParserFactory; import com.graphhopper.routing.util.parsers.TagParser; import com.graphhopper.routing.util.parsers.TagParserFactory; import com.graphhopper.util.PMap; +import org.heigit.ors.routing.graphhopper.extensions.util.parsers.OrsSurfaceParser; public class OrsTagParserFactory implements TagParserFactory { DefaultTagParserFactory defaultTagParserFactory = new DefaultTagParserFactory(); @@ -13,12 +15,10 @@ public TagParser create(String name, PMap configuration) { try { return defaultTagParserFactory.create(name, configuration); } catch (IllegalArgumentException e) { -// TODO: add a new tag parser for each new encoded value here: -// return switch (name) { -// case MyNewEncodedValue.KEY -> new MyNewTagParserTagParser(); -// default -> throw e; -// }; - throw e; + return switch (name) { + case OrsSurface.KEY -> new OrsSurfaceParser(); + default -> throw e; + }; } } } diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/OrsSurfaceParser.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/OrsSurfaceParser.java new file mode 100644 index 0000000000..2a79785953 --- /dev/null +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/OrsSurfaceParser.java @@ -0,0 +1,62 @@ +package org.heigit.ors.routing.graphhopper.extensions.util.parsers; + +import com.graphhopper.reader.ReaderWay; +import com.graphhopper.routing.ev.*; +import com.graphhopper.routing.util.parsers.TagParser; +import com.graphhopper.storage.IntsRef; + +import java.util.List; + +public class OrsSurfaceParser implements TagParser { + private EnumEncodedValue surfaceEnc; + + public OrsSurfaceParser() { + this(new EnumEncodedValue<>(OrsSurface.KEY, OrsSurface.class)); + } + + public OrsSurfaceParser(EnumEncodedValue surfaceEnc) { + this.surfaceEnc = surfaceEnc; + } + + @Override + public void createEncodedValues(EncodedValueLookup encodedValueLookup, List list) { + list.add(surfaceEnc); + } + + @Override + public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay readerWay, boolean b, IntsRef relationFlags) { + String surfaceTag = readerWay.getTag("surface"); + OrsSurface surface = getFromString(surfaceTag); + surfaceEnc.setEnum(false, edgeFlags, surface); + return edgeFlags; + } + + private static OrsSurface getFromString(String surface) { + if (surface == null) + return OrsSurface.UNKNOWN; + + if (surface.contains(";")) + surface = surface.split(";")[0]; + if (surface.contains(":")) + surface = surface.split(":")[0]; + + return switch (surface.toLowerCase()) { + case "paved" -> OrsSurface.PAVED; + case "unpaved", "woodchips", "rock", "rocks", "stone", "shells", "salt" -> OrsSurface.UNPAVED; + case "asphalt", "chipseal", "bitmac", "tarmac" -> OrsSurface.ASPHALT; + case "concrete", "cement" -> OrsSurface.CONCRETE; + case "paving_stones", "paved_stones", "sett", "cobblestone", "unhewn_cobblestone", "bricks", "brick" -> OrsSurface.PAVING_STONES; + case "metal" -> OrsSurface.METAL; + case "wood" -> OrsSurface.WOOD; + case "compacted", "pebblestone" -> OrsSurface.COMPACTED_GRAVEL; + case "gravel", "fine_gravel" -> OrsSurface.GRAVEL; + case "dirt", "earth", "soil" -> OrsSurface.DIRT; + case "ground", "mud" -> OrsSurface.GROUND; + case "ice", "snow" -> OrsSurface.ICE; + case "sand" -> OrsSurface.SAND; + case "grass" -> OrsSurface.GRASS; + case "grass_paver" -> OrsSurface.GRASS_PAVER; + default -> OrsSurface.UNKNOWN; + }; + } +} diff --git a/pom.xml b/pom.xml index 6534174f8d..b201ac708c 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ yyyy-MM-dd'T'HH:mm:ss'Z' - v4.9.8 + v4.9.9 1.18.34 2.0.13