From dc98a2f382d7d8f665070da070c05f0afc78215b Mon Sep 17 00:00:00 2001 From: Sascha Fendrich Date: Tue, 12 Aug 2025 11:11:21 +0200 Subject: [PATCH 1/5] feat: use ors surface type as encoded value This requires a version of graphhopper that contains the surface type enum as encoded value. --- .../extensions/OrsEncodedValueFactory.java | 14 ++++---- .../extensions/OrsTagParserFactory.java | 14 ++++---- .../graphhopper/extensions/SurfaceType.java | 2 ++ .../util/parsers/SurfaceTypeTagParser.java | 33 +++++++++++++++++++ pom.xml | 4 +-- 5 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java index 30fd2bed28..114008684e 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java @@ -3,6 +3,7 @@ import com.graphhopper.routing.ev.DefaultEncodedValueFactory; import com.graphhopper.routing.ev.EncodedValue; import com.graphhopper.routing.ev.EncodedValueFactory; +import com.graphhopper.routing.ev.EnumEncodedValue; import com.graphhopper.util.Helper; import org.heigit.ors.routing.graphhopper.extensions.ev.DynamicData; @@ -19,17 +20,14 @@ public EncodedValue create(String encodedValueString) { if (Helper.isEmpty(encodedValueString)) throw new IllegalArgumentException("No string provided to load EncodedValue"); - final EncodedValue enc; String name = encodedValueString.split("\\|")[0]; if (name.isEmpty()) throw new IllegalArgumentException("To load EncodedValue a name is required. " + encodedValueString); - if (DynamicData.KEY.equals(name)) { - enc = DynamicData.create(); - } else { - // Fallback to GraphHopper's EncodedValues - enc = defaultEncodedValueFactory.create(encodedValueString); - } - return enc; + return switch (name) { + case DynamicData.KEY -> DynamicData.create(); + case SurfaceType.KEY -> new EnumEncodedValue<>(SurfaceType.KEY, SurfaceType.class); + default -> defaultEncodedValueFactory.create(encodedValueString); // Fallback to GraphHopper's EncodedValues + }; } } 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..279918f030 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 @@ -4,6 +4,9 @@ import com.graphhopper.routing.util.parsers.TagParser; import com.graphhopper.routing.util.parsers.TagParserFactory; import com.graphhopper.util.PMap; +import com.graphhopper.routing.ev.OrsSurface; +import org.heigit.ors.routing.graphhopper.extensions.util.parsers.OrsSurfaceTagParser; +import org.heigit.ors.routing.graphhopper.extensions.util.parsers.SurfaceTypeTagParser; public class OrsTagParserFactory implements TagParserFactory { DefaultTagParserFactory defaultTagParserFactory = new DefaultTagParserFactory(); @@ -13,12 +16,11 @@ 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 SurfaceType.KEY -> new SurfaceTypeTagParser(); + case OrsSurface.KEY -> new OrsSurfaceTagParser(); + default -> throw e; + }; } } } diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java index cc296608a4..b721b8ea06 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java @@ -34,6 +34,8 @@ public enum SurfaceType { GRASS(17), GRASS_PAVER(18); + public static final String KEY = "surface_type"; + private final byte value; private static final SurfaceType[] values = values(); diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java new file mode 100644 index 0000000000..2e8deaca90 --- /dev/null +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java @@ -0,0 +1,33 @@ +package org.heigit.ors.routing.graphhopper.extensions.util.parsers; + +import com.graphhopper.reader.ReaderWay; +import com.graphhopper.routing.ev.EncodedValue; +import com.graphhopper.routing.ev.EncodedValueLookup; +import com.graphhopper.routing.ev.EnumEncodedValue; +import com.graphhopper.routing.util.parsers.TagParser; +import com.graphhopper.storage.IntsRef; +import org.heigit.ors.routing.graphhopper.extensions.SurfaceType; + +import java.util.List; + +public class SurfaceTypeTagParser implements TagParser { + private EnumEncodedValue surfaceTypeEnc; + + public SurfaceTypeTagParser() { + this(new EnumEncodedValue<>(SurfaceType.KEY, SurfaceType.class)); + } + + public SurfaceTypeTagParser(EnumEncodedValue surfaceTypeEnc) { + this.surfaceTypeEnc = surfaceTypeEnc; + } + + @Override + public void createEncodedValues(EncodedValueLookup lookup, List registerNewEncodedValue) { + registerNewEncodedValue.add(surfaceTypeEnc); + } + + @Override + public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean ferry, IntsRef relationFlags) { + return edgeFlags; + } +} diff --git a/pom.xml b/pom.xml index 6534174f8d..e45a535649 100644 --- a/pom.xml +++ b/pom.xml @@ -45,8 +45,8 @@ yyyy-MM-dd'T'HH:mm:ss'Z' - v4.9.8 - + + 4.9-SNAPSHOT 1.18.34 2.0.13 2.22.1 From 62e876ceabe8a5133a91527e1baa379c4b0794a9 Mon Sep 17 00:00:00 2001 From: Sascha Fendrich Date: Tue, 12 Aug 2025 14:56:45 +0200 Subject: [PATCH 2/5] feat: activate OrsSurface encoded value --- CHANGELOG.md | 1 + .../ors/apitests/routing/ResultTest.java | 2 +- .../extensions/ORSGraphHopperConfig.java | 4 +- .../extensions/OrsTagParserFactory.java | 4 +- .../util/parsers/OrsSurfaceParser.java | 62 +++++++++++++++++++ pom.xml | 4 +- 6 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/OrsSurfaceParser.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 403e89da0a..ce750a35e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ Releasing is documented in RELEASE.md ### Added - Full support for EncodedValues ([#2106](https://github.com/GIScience/openrouteservice/issues/2106)) +- Enable encoded value OrsSurface ([#2106](https://github.com/GIScience/openrouteservice/issues/2106)) ### 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 279918f030..48b8ead1be 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 @@ -5,7 +5,7 @@ import com.graphhopper.routing.util.parsers.TagParserFactory; import com.graphhopper.util.PMap; import com.graphhopper.routing.ev.OrsSurface; -import org.heigit.ors.routing.graphhopper.extensions.util.parsers.OrsSurfaceTagParser; +import org.heigit.ors.routing.graphhopper.extensions.util.parsers.OrsSurfaceParser; import org.heigit.ors.routing.graphhopper.extensions.util.parsers.SurfaceTypeTagParser; public class OrsTagParserFactory implements TagParserFactory { @@ -18,7 +18,7 @@ public TagParser create(String name, PMap configuration) { } catch (IllegalArgumentException e) { return switch (name) { case SurfaceType.KEY -> new SurfaceTypeTagParser(); - case OrsSurface.KEY -> new OrsSurfaceTagParser(); + 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 e45a535649..b201ac708c 100644 --- a/pom.xml +++ b/pom.xml @@ -45,8 +45,8 @@ yyyy-MM-dd'T'HH:mm:ss'Z' - - 4.9-SNAPSHOT + v4.9.9 + 1.18.34 2.0.13 2.22.1 From 4ce092801bc7b3c87e65d0167feba841e049943c Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 13 Aug 2025 17:50:22 +0200 Subject: [PATCH 3/5] chore: remove experimental implementation of `SurfaceType` encoded value Encoded values need to be defined in GH codebase in order to be able to use them in custom profiles. --- .../extensions/OrsEncodedValueFactory.java | 2 -- .../extensions/OrsTagParserFactory.java | 4 +-- .../graphhopper/extensions/SurfaceType.java | 2 -- .../util/parsers/SurfaceTypeTagParser.java | 33 ------------------- 4 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java index 114008684e..665f1ca796 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java @@ -3,7 +3,6 @@ import com.graphhopper.routing.ev.DefaultEncodedValueFactory; import com.graphhopper.routing.ev.EncodedValue; import com.graphhopper.routing.ev.EncodedValueFactory; -import com.graphhopper.routing.ev.EnumEncodedValue; import com.graphhopper.util.Helper; import org.heigit.ors.routing.graphhopper.extensions.ev.DynamicData; @@ -26,7 +25,6 @@ public EncodedValue create(String encodedValueString) { return switch (name) { case DynamicData.KEY -> DynamicData.create(); - case SurfaceType.KEY -> new EnumEncodedValue<>(SurfaceType.KEY, SurfaceType.class); default -> defaultEncodedValueFactory.create(encodedValueString); // Fallback to GraphHopper's EncodedValues }; } 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 48b8ead1be..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,12 +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 com.graphhopper.routing.ev.OrsSurface; import org.heigit.ors.routing.graphhopper.extensions.util.parsers.OrsSurfaceParser; -import org.heigit.ors.routing.graphhopper.extensions.util.parsers.SurfaceTypeTagParser; public class OrsTagParserFactory implements TagParserFactory { DefaultTagParserFactory defaultTagParserFactory = new DefaultTagParserFactory(); @@ -17,7 +16,6 @@ public TagParser create(String name, PMap configuration) { return defaultTagParserFactory.create(name, configuration); } catch (IllegalArgumentException e) { return switch (name) { - case SurfaceType.KEY -> new SurfaceTypeTagParser(); case OrsSurface.KEY -> new OrsSurfaceParser(); default -> throw e; }; diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java index b721b8ea06..cc296608a4 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/SurfaceType.java @@ -34,8 +34,6 @@ public enum SurfaceType { GRASS(17), GRASS_PAVER(18); - public static final String KEY = "surface_type"; - private final byte value; private static final SurfaceType[] values = values(); diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java deleted file mode 100644 index 2e8deaca90..0000000000 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/util/parsers/SurfaceTypeTagParser.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.heigit.ors.routing.graphhopper.extensions.util.parsers; - -import com.graphhopper.reader.ReaderWay; -import com.graphhopper.routing.ev.EncodedValue; -import com.graphhopper.routing.ev.EncodedValueLookup; -import com.graphhopper.routing.ev.EnumEncodedValue; -import com.graphhopper.routing.util.parsers.TagParser; -import com.graphhopper.storage.IntsRef; -import org.heigit.ors.routing.graphhopper.extensions.SurfaceType; - -import java.util.List; - -public class SurfaceTypeTagParser implements TagParser { - private EnumEncodedValue surfaceTypeEnc; - - public SurfaceTypeTagParser() { - this(new EnumEncodedValue<>(SurfaceType.KEY, SurfaceType.class)); - } - - public SurfaceTypeTagParser(EnumEncodedValue surfaceTypeEnc) { - this.surfaceTypeEnc = surfaceTypeEnc; - } - - @Override - public void createEncodedValues(EncodedValueLookup lookup, List registerNewEncodedValue) { - registerNewEncodedValue.add(surfaceTypeEnc); - } - - @Override - public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean ferry, IntsRef relationFlags) { - return edgeFlags; - } -} From d03257bebf94e531bee13f678013a5451b0b1559 Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 13 Aug 2025 18:02:26 +0200 Subject: [PATCH 4/5] docs: edits to CHANGELOG entries --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce750a35e0..51a0cef885 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,8 +28,8 @@ Releasing is documented in RELEASE.md ## [unreleased] ### Added -- Full support for EncodedValues ([#2106](https://github.com/GIScience/openrouteservice/issues/2106)) -- Enable encoded value OrsSurface ([#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)) From 0adfac8045b3cc6fd6f671e808627a2fbe9e3265 Mon Sep 17 00:00:00 2001 From: aoles Date: Thu, 14 Aug 2025 00:01:06 +0200 Subject: [PATCH 5/5] refactor: restore previous if-else flow control --- .../extensions/OrsEncodedValueFactory.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java index 665f1ca796..30fd2bed28 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/OrsEncodedValueFactory.java @@ -19,13 +19,17 @@ public EncodedValue create(String encodedValueString) { if (Helper.isEmpty(encodedValueString)) throw new IllegalArgumentException("No string provided to load EncodedValue"); + final EncodedValue enc; String name = encodedValueString.split("\\|")[0]; if (name.isEmpty()) throw new IllegalArgumentException("To load EncodedValue a name is required. " + encodedValueString); - return switch (name) { - case DynamicData.KEY -> DynamicData.create(); - default -> defaultEncodedValueFactory.create(encodedValueString); // Fallback to GraphHopper's EncodedValues - }; + if (DynamicData.KEY.equals(name)) { + enc = DynamicData.create(); + } else { + // Fallback to GraphHopper's EncodedValues + enc = defaultEncodedValueFactory.create(encodedValueString); + } + return enc; } }