From 2c0bc6b37ca2b493ce41794bc66929e809c0cf39 Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 8 May 2026 00:56:16 +0200 Subject: [PATCH 1/5] feat: pass from and to node ids to tag parsers --- .../java/com/graphhopper/reader/osm/OSMReader.java | 4 +++- .../com/graphhopper/routing/util/EncodingManager.java | 10 ++++++++++ .../graphhopper/routing/util/parsers/TagParser.java | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/graphhopper/reader/osm/OSMReader.java b/core/src/main/java/com/graphhopper/reader/osm/OSMReader.java index 04a1f93687a..635c2815187 100644 --- a/core/src/main/java/com/graphhopper/reader/osm/OSMReader.java +++ b/core/src/main/java/com/graphhopper/reader/osm/OSMReader.java @@ -328,7 +328,9 @@ protected void addEdge(int fromIndex, int toIndex, PointList pointList, ReaderWa throw new IllegalStateException("unaccepted way: " + way.getId()); IntsRef relationFlags = getRelFlagsMap(way.getId()); - IntsRef edgeFlags = encodingManager.handleWayTags(way, acceptWay, relationFlags); + // ORS-GH MOD START additional parameters for from and to node ids + IntsRef edgeFlags = encodingManager.handleWayTags(fromIndex, toIndex, way, acceptWay, relationFlags); + // ORS-GH MOD END if (edgeFlags.isEmpty()) return; diff --git a/core/src/main/java/com/graphhopper/routing/util/EncodingManager.java b/core/src/main/java/com/graphhopper/routing/util/EncodingManager.java index 8593fd2b470..8a9321a61ad 100644 --- a/core/src/main/java/com/graphhopper/routing/util/EncodingManager.java +++ b/core/src/main/java/com/graphhopper/routing/util/EncodingManager.java @@ -599,7 +599,17 @@ public void handleTurnRelationTags(OSMTurnRelation turnRelation, TurnCostParser. * @param relationFlags The preprocessed relation flags is used to influence the way properties. */ public IntsRef handleWayTags(ReaderWay way, AcceptWay acceptWay, IntsRef relationFlags) { + // ORS-GH MOD START additional parameters to provide from/to node ids to tag parsers + return handleWayTags(-1, -1, way, acceptWay, relationFlags); + } + + public IntsRef handleWayTags(int fromIndex, int toIndex, ReaderWay way, AcceptWay acceptWay, IntsRef relationFlags) { IntsRef edgeFlags = createEdgeFlags(); + // modified handler must be called before regular processing to ensure that "ors:country" tags set by the BorderParser are available for the downstream CountryParser + for (TagParser parser : edgeTagParsers) { + parser.handleWayTags(fromIndex, toIndex, edgeFlags, way, acceptWay.isFerry(), relationFlags); + } + // ORS-GH MOD END for (TagParser parser : edgeTagParsers) { parser.handleWayTags(edgeFlags, way, acceptWay.isFerry(), relationFlags); } diff --git a/core/src/main/java/com/graphhopper/routing/util/parsers/TagParser.java b/core/src/main/java/com/graphhopper/routing/util/parsers/TagParser.java index be49a8e2806..ea805eadde4 100644 --- a/core/src/main/java/com/graphhopper/routing/util/parsers/TagParser.java +++ b/core/src/main/java/com/graphhopper/routing/util/parsers/TagParser.java @@ -33,4 +33,10 @@ public interface TagParser { void createEncodedValues(EncodedValueLookup lookup, List registerNewEncodedValue); IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean ferry, IntsRef relationFlags); + + // ORS-GH MOD START additional method to provide from/to node ids + default IntsRef handleWayTags(int from, int to, IntsRef edgeFlags, ReaderWay way, boolean ferry, IntsRef relationFlags) { + return edgeFlags; + } + // ORS-GH MOD END } From 35394e5ebe2cad9ab233bfa3fa5d7e93c20f288a Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 8 May 2026 01:36:08 +0200 Subject: [PATCH 2/5] feat: override country tags with their ORS counterparts --- .../main/java/com/graphhopper/routing/ev/Country.java | 9 ++++++++- .../graphhopper/routing/util/parsers/CountryParser.java | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/graphhopper/routing/ev/Country.java b/core/src/main/java/com/graphhopper/routing/ev/Country.java index 0569995f858..352daf7ed49 100644 --- a/core/src/main/java/com/graphhopper/routing/ev/Country.java +++ b/core/src/main/java/com/graphhopper/routing/ev/Country.java @@ -240,7 +240,14 @@ public enum Country { YEM("Yemen", "YE"), ZAF("South Africa", "ZA"), ZMB("Zambia", "ZM"), - ZWE("Zimbabwe", "ZW"); + // ORS-GH MOD START additional ORS-specific territories + ZWE("Zimbabwe", "ZW"), + // the following values are for testing purposes only + XXA("Area 1", "XA"), + XXB("Area 2", "XB"), + XXC("Area 3", "XC"), + XXD("Area 4", "XD"); + // ORS-GH MOD END public static final String KEY = "country"; diff --git a/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java b/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java index 999a7ea92e3..51bdd56f775 100644 --- a/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java +++ b/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java @@ -41,6 +41,10 @@ public void createEncodedValues(EncodedValueLookup lookup, List re @Override public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean ferry, IntsRef relationFlags) { Country country = way.getTag("country", Country.MISSING); + // ORS-GH MOD START override with country information set by ORS + if (way.hasTag("ors:country")) + country = way.getTag("ors:country", Country.MISSING); + // ORS-GH MOD END countryEnc.setEnum(false, edgeFlags, country); return edgeFlags; } From 709bdae23c35ad162f8145807aa66b8f948599bd Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 8 May 2026 13:36:22 +0200 Subject: [PATCH 3/5] feat: log detailed error message when processing of a way fails --- .../java/com/graphhopper/reader/osm/WaySegmentParser.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/graphhopper/reader/osm/WaySegmentParser.java b/core/src/main/java/com/graphhopper/reader/osm/WaySegmentParser.java index 37464bce2f5..b6a2fa9bdc6 100644 --- a/core/src/main/java/com/graphhopper/reader/osm/WaySegmentParser.java +++ b/core/src/main/java/com/graphhopper/reader/osm/WaySegmentParser.java @@ -265,8 +265,13 @@ public void handleWay(ReaderWay way) { // ORS-GH MOD START - way preprocessor might have changed the way tags, so we need to check the filter again if (!wayFilter.test(way)) return; + try { + splitWayAtJunctionsAndEmptySections(segment, way); + } catch (Exception e) { + LOGGER.error("Error while processing way " + way.getId() + ": " + e.getMessage()); + throw e; + } // ORS-GH MOD END - splitWayAtJunctionsAndEmptySections(segment, way); } private void splitWayAtJunctionsAndEmptySections(List fullSegment, ReaderWay way) { From a271720df430c5fa3fac1f01c1365f5dd6c4441a Mon Sep 17 00:00:00 2001 From: aoles Date: Tue, 19 May 2026 23:29:31 +0200 Subject: [PATCH 4/5] refactor: define constant for ors-specific country tag --- .../graphhopper/routing/util/parsers/CountryParser.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java b/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java index 51bdd56f775..648cf7ca354 100644 --- a/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java +++ b/core/src/main/java/com/graphhopper/routing/util/parsers/CountryParser.java @@ -28,6 +28,9 @@ public class CountryParser implements TagParser { private final EnumEncodedValue countryEnc; + // ORS-GH MOD START + public static final String KEY_ORS_COUNTRY = "ors:country"; + // ORS-GH MOD END public CountryParser() { this.countryEnc = Country.create(); @@ -42,8 +45,8 @@ public void createEncodedValues(EncodedValueLookup lookup, List re public IntsRef handleWayTags(IntsRef edgeFlags, ReaderWay way, boolean ferry, IntsRef relationFlags) { Country country = way.getTag("country", Country.MISSING); // ORS-GH MOD START override with country information set by ORS - if (way.hasTag("ors:country")) - country = way.getTag("ors:country", Country.MISSING); + if (way.hasTag(KEY_ORS_COUNTRY)) + country = way.getTag(KEY_ORS_COUNTRY, Country.MISSING); // ORS-GH MOD END countryEnc.setEnum(false, edgeFlags, country); return edgeFlags; From 7e98c57b0f6a16e699114eb890938c7bfcfe85a7 Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 12 Jun 2026 17:05:10 +0200 Subject: [PATCH 5/5] feat: add user-defined country codes Co-authored-by: Sascha Fendrich --- .../com/graphhopper/routing/ev/Country.java | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/graphhopper/routing/ev/Country.java b/core/src/main/java/com/graphhopper/routing/ev/Country.java index 352daf7ed49..48c27a9e789 100644 --- a/core/src/main/java/com/graphhopper/routing/ev/Country.java +++ b/core/src/main/java/com/graphhopper/routing/ev/Country.java @@ -240,13 +240,50 @@ public enum Country { YEM("Yemen", "YE"), ZAF("South Africa", "ZA"), ZMB("Zambia", "ZM"), - // ORS-GH MOD START additional ORS-specific territories ZWE("Zimbabwe", "ZW"), - // the following values are for testing purposes only - XXA("Area 1", "XA"), - XXB("Area 2", "XB"), - XXC("Area 3", "XC"), - XXD("Area 4", "XD"); + // ORS-GH MOD START additional user-assigned codes + AAA("AAA", "AA"), + QQM("QQM", "QM"), + QQN("QQN", "QN"), + QQO("QQO", "QO"), + QQP("QQP", "QP"), + QQQ("QQQ", "QQ"), + QQR("QQR", "QR"), + QQS("QQS", "QS"), + QQT("QQT", "QT"), + QQU("QQU", "QU"), + QQV("QQV", "QV"), + QQW("QQW", "QW"), + QQX("QQX", "QX"), + QQY("QQY", "QY"), + QQZ("QQZ", "QZ"), + XXA("XXA", "XA"), + XXB("XXB", "XB"), + XXC("XXC", "XC"), + XXD("XXD", "XD"), + XXE("XXE", "XE"), + XXF("XXF", "XF"), + XXG("XXG", "XG"), + XXH("XXH", "XH"), + XXI("XXI", "XI"), + XXJ("XXJ", "XJ"), + XXK("XXK", "XK"), + XXL("XXL", "XL"), + XXM("XXM", "XM"), + XXN("XXN", "XN"), + XXO("XXO", "XO"), + XXP("XXP", "XP"), + XXQ("XXQ", "XQ"), + XXR("XXR", "XR"), + XXS("XXS", "XS"), + XXT("XXT", "XT"), + XXU("XXU", "XU"), + XXV("XXV", "XV"), + XXW("XXW", "XW"), + XXX("XXX", "XX"), + XXY("XXY", "XY"), + XXZ("XXZ", "XZ"), + ZZZ("ZZZ", "ZZ"); // ORS-GH MOD END public static final String KEY = "country";