From 415a6eb2679e9fa0dd46aec66a3ce6f0ab652cc2 Mon Sep 17 00:00:00 2001 From: David Mejorado Date: Tue, 15 Jul 2025 15:51:32 -0700 Subject: [PATCH] feat: enable narrow gauge and miniature routes Co-authored-by: Sachin Goel Co-authored-by: Quan Huynh --- .../railway_routing/ev/RailwayClass.java | 2 +- .../parsers/RailAccessParser.java | 2 +- .../parsers/OSMRailwayClassParserTest.java | 8 +++++++- .../parsers/RailAccessParserTest.java | 20 ++++++++++++++++++- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/geofabrik/railway_routing/ev/RailwayClass.java b/src/main/java/de/geofabrik/railway_routing/ev/RailwayClass.java index 3741caf..073f46c 100644 --- a/src/main/java/de/geofabrik/railway_routing/ev/RailwayClass.java +++ b/src/main/java/de/geofabrik/railway_routing/ev/RailwayClass.java @@ -7,7 +7,7 @@ * This enum defines the railway class of an edge. It maps the railway=* key of OSM to an enum. All edges that do not fit get OTHER as value. */ public enum RailwayClass { - OTHER, RAIL, SUBWAY, TRAM, LIGHT_RAIL, FUNICULAR, CONSTRUCTION, MONORAIL, PROPOSED; + OTHER, RAIL, SUBWAY, TRAM, LIGHT_RAIL, FUNICULAR, CONSTRUCTION, MONORAIL, PROPOSED, NARROW_GAUGE, MINIATURE; public static final String KEY = "railway_class"; diff --git a/src/main/java/de/geofabrik/railway_routing/parsers/RailAccessParser.java b/src/main/java/de/geofabrik/railway_routing/parsers/RailAccessParser.java index 47e3ea6..f8cd41e 100644 --- a/src/main/java/de/geofabrik/railway_routing/parsers/RailAccessParser.java +++ b/src/main/java/de/geofabrik/railway_routing/parsers/RailAccessParser.java @@ -16,7 +16,7 @@ public class RailAccessParser extends AbstractAccessParser { public static final String DEFAULT_NAME = "rail"; private static final Set ALLOWED_RAIL_TYPES = Set.of( - "rail", "light_rail", "tram", "subway", "construction", "proposed", "funicular", "monorail" + "rail", "light_rail", "tram", "subway", "construction", "proposed", "funicular", "monorail", "narrow_gauge", "miniature" ); public RailAccessParser(BooleanEncodedValue accessEnc) { diff --git a/src/test/java/de/geofabrik/railway_routing/parsers/OSMRailwayClassParserTest.java b/src/test/java/de/geofabrik/railway_routing/parsers/OSMRailwayClassParserTest.java index 89dc3de..5308038 100644 --- a/src/test/java/de/geofabrik/railway_routing/parsers/OSMRailwayClassParserTest.java +++ b/src/test/java/de/geofabrik/railway_routing/parsers/OSMRailwayClassParserTest.java @@ -57,7 +57,7 @@ void railwayClass() { way = new ReaderWay(29L); way.setTag("railway", "narrow_gauge"); parser.handleWayTags(edgeId, edgeIntAccess, way, relFlags); - assertEquals(RailwayClass.OTHER, classEnc.getEnum(false, edgeId, edgeIntAccess)); + assertEquals(RailwayClass.NARROW_GAUGE, classEnc.getEnum(false, edgeId, edgeIntAccess)); edgeIntAccess = new ArrayEdgeIntAccess(1); way = new ReaderWay(29L); @@ -88,6 +88,12 @@ void railwayClass() { way.setTag("railway", "monorail"); parser.handleWayTags(edgeId, edgeIntAccess, way, relFlags); assertEquals(RailwayClass.MONORAIL, classEnc.getEnum(false, edgeId, edgeIntAccess)); + + edgeIntAccess = new ArrayEdgeIntAccess(1); + way = new ReaderWay(29L); + way.setTag("railway", "miniature"); + parser.handleWayTags(edgeId, edgeIntAccess, way, relFlags); + assertEquals(RailwayClass.MINIATURE, classEnc.getEnum(false, edgeId, edgeIntAccess)); } } diff --git a/src/test/java/de/geofabrik/railway_routing/parsers/RailAccessParserTest.java b/src/test/java/de/geofabrik/railway_routing/parsers/RailAccessParserTest.java index c3d6295..7de92be 100644 --- a/src/test/java/de/geofabrik/railway_routing/parsers/RailAccessParserTest.java +++ b/src/test/java/de/geofabrik/railway_routing/parsers/RailAccessParserTest.java @@ -66,11 +66,29 @@ public void testRejectRoad() { } @Test - public void testRejectsNarrowGauge() { + public void testAcceptsNarrowGauge() { PMap properties = new PMap(); RailAccessParser e = createAccessParser(createEncodingManager(), properties); ReaderWay way = new ReaderWay(1); way.setTag("railway", "narrow_gauge"); + assertEquals(e.getAccess(way), WayAccess.WAY); + } + + @Test + public void testAcceptsMiniature() { + PMap properties = new PMap(); + RailAccessParser e = createAccessParser(createEncodingManager(), properties); + ReaderWay way = new ReaderWay(1); + way.setTag("railway", "miniature"); + assertEquals(e.getAccess(way), WayAccess.WAY); + } + + @Test + public void testRejectsAbandoned() { + PMap properties = new PMap(); + RailAccessParser e = createAccessParser(createEncodingManager(), properties); + ReaderWay way = new ReaderWay(1); + way.setTag("railway", "abandoned"); assertEquals(WayAccess.CAN_SKIP, e.getAccess(way)); } }