From 2a85552451cdb1d8b386679b8c3e7e304b6c4d1e Mon Sep 17 00:00:00 2001 From: aoles Date: Tue, 21 May 2024 09:32:37 +0200 Subject: [PATCH 01/15] refactor: way surface types as enums Use enumerations instead of simple integer constants in order to be able to store the surface types internally under different IDs than the corresponding API values. --- .../graphhopper/extensions/SurfaceType.java | 57 ++++++++++++------- .../storages/WaySurfaceTypeGraphStorage.java | 5 +- .../WaySurfaceTypeGraphStorageBuilder.java | 2 +- .../pathprocessors/ExtraInfoProcessor.java | 2 +- .../routing/util/WaySurfaceDescription.java | 12 ++-- 5 files changed, 47 insertions(+), 31 deletions(-) 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 eeef8c6e54..6ffc194a19 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 @@ -13,34 +13,47 @@ */ package org.heigit.ors.routing.graphhopper.extensions; -public class SurfaceType { +public enum SurfaceType { //Keep in sync with documentation: surface.md - public static final int UNKNOWN = 0; - public static final int PAVED = 1; - public static final int UNPAVED = 2; - public static final int ASPHALT = 3; - public static final int CONCRETE = 4; - public static final int COBBLESTONE = 5; - public static final int METAL = 6; - public static final int WOOD = 7; - public static final int COMPACTED_GRAVEL = 8; - public static final int FINE_GRAVEL = 9; - public static final int GRAVEL = 10; - public static final int DIRT = 11; - public static final int GROUND = 12; - public static final int ICE = 13; - public static final int PAVING_STONE = 14; - public static final int SAND = 15; - public static final int WOODCHIPS = 16; - public static final int GRASS = 17; - public static final int GRASS_PAVER = 18; + UNKNOWN(0), + PAVED(1), + UNPAVED(2), + ASPHALT(3), + CONCRETE(4), + COBBLESTONE(5), + METAL(6), + WOOD(7), + COMPACTED_GRAVEL(8), + FINE_GRAVEL(9), + GRAVEL(10), + DIRT(11), + GROUND(12), + ICE(13), + PAVING_STONE(14), + SAND(15), + WOODCHIPS(16), + GRASS(17), + GRASS_PAVER(18); - private SurfaceType() { + private final byte value; + + private static final SurfaceType values[] = values(); + + private SurfaceType(int value) { + this.value = (byte) value; + } + + public byte value() { + return value; + } + + public static SurfaceType getFromId(int id) { + return values[id]; } - public static int getFromString(String surface) { + public static SurfaceType getFromString(String surface) { if (surface.contains(";")) surface = surface.split(";")[0]; diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java index f69546900f..9aa38d0651 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java @@ -17,6 +17,7 @@ import com.graphhopper.storage.Directory; import com.graphhopper.storage.Graph; import com.graphhopper.storage.GraphExtension; +import org.heigit.ors.routing.graphhopper.extensions.SurfaceType; import org.heigit.ors.routing.util.WaySurfaceDescription; public class WaySurfaceTypeGraphStorage implements GraphExtension { @@ -93,7 +94,7 @@ public void setEdgeValue(int edgeId, WaySurfaceDescription wayDesc) { // add entry long edgePointer = (long) edgeId * edgeEntryBytes; - byteValues[0] = (byte) ((wayDesc.getWayType() << 4) | wayDesc.getSurfaceType() & 0xff); + byteValues[0] = (byte) ((wayDesc.getWayType() << 4) | wayDesc.getSurfaceType().ordinal() & 0xff); orsEdges.setBytes(edgePointer + efWaytype, byteValues, 1); } @@ -105,7 +106,7 @@ public WaySurfaceDescription getEdgeValue(int edgeId, byte[] buffer) { byte compValue = buffer[0]; WaySurfaceDescription res = new WaySurfaceDescription(); res.setWayType((compValue & 0b11110000) >> 4); - res.setSurfaceType(compValue & 0b00001111); + res.setSurfaceType(SurfaceType.getFromId(compValue & 0b00001111)); return res; } diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java index 0147caac46..f73c7b733a 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java @@ -59,7 +59,7 @@ public void processWay(ReaderWay way) { } waySurfaceDesc.setWayType(wayType); - int surfaceType = way.hasTag(TAG_SURFACE) ? SurfaceType.getFromString(way.getTag(TAG_SURFACE)) : SurfaceType.UNKNOWN; + SurfaceType surfaceType = way.hasTag(TAG_SURFACE) ? SurfaceType.getFromString(way.getTag(TAG_SURFACE)) : SurfaceType.UNKNOWN; if (surfaceType == SurfaceType.UNKNOWN) { if (wayType == WayType.ROAD || wayType == WayType.STATE_ROAD || wayType == WayType.STREET) { surfaceType = SurfaceType.PAVED; diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/pathprocessors/ExtraInfoProcessor.java b/ors-engine/src/main/java/org/heigit/ors/routing/pathprocessors/ExtraInfoProcessor.java index f25e96a844..99fcb6514a 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/pathprocessors/ExtraInfoProcessor.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/pathprocessors/ExtraInfoProcessor.java @@ -438,7 +438,7 @@ public void processPathEdge(EdgeIteratorState edge, PointList geom) { WaySurfaceDescription wsd = extWaySurface.getEdgeValue(EdgeIteratorStateHelper.getOriginalEdge(edge), buffer); if (surfaceInfoBuilder != null) - surfaceInfoBuilder.addSegment(wsd.getSurfaceType(), wsd.getSurfaceType(), geom, dist); + surfaceInfoBuilder.addSegment(wsd.getSurfaceType().value(), wsd.getSurfaceType().value(), geom, dist); if (wayTypeInfo != null) wayTypeInfoBuilder.addSegment(wsd.getWayType(), wsd.getWayType(), geom, dist); diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/util/WaySurfaceDescription.java b/ors-engine/src/main/java/org/heigit/ors/routing/util/WaySurfaceDescription.java index d04961e9d0..763bb56e5d 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/util/WaySurfaceDescription.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/util/WaySurfaceDescription.java @@ -1,8 +1,10 @@ package org.heigit.ors.routing.util; +import org.heigit.ors.routing.graphhopper.extensions.SurfaceType; + public class WaySurfaceDescription { private byte wayType; - private byte surfaceType; + private SurfaceType surfaceType; public byte getWayType() { return wayType; @@ -12,16 +14,16 @@ public void setWayType(int wayType) { this.wayType = (byte) wayType; } - public byte getSurfaceType() { + public SurfaceType getSurfaceType() { return surfaceType; } - public void setSurfaceType(int surfaceType) { - this.surfaceType = (byte) surfaceType; + public void setSurfaceType(SurfaceType surfaceType) { + this.surfaceType = surfaceType; } public void reset() { wayType = 0; - surfaceType = 0; + surfaceType = SurfaceType.UNKNOWN; } } From 5fa4bc6c8a4454e5dde7ff7649476bc9faa6c94d Mon Sep 17 00:00:00 2001 From: aoles Date: Tue, 21 May 2024 13:33:52 +0200 Subject: [PATCH 02/15] test: add unit test for way surface storage Check whether values corresponding to the surface types can be reliably written and retrieved from the storage. The test currently fails because the number of different surface types exceeds the available data type range of 4 bits. --- .../storages/WaySurfaceTypeGraphStorage.java | 16 +++++-- .../WaySurfaceTypeGraphStorageTest.java | 42 +++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 ors-engine/src/test/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorageTest.java diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java index 9aa38d0651..ea88d7d9c4 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java @@ -13,10 +13,7 @@ */ package org.heigit.ors.routing.graphhopper.extensions.storages; -import com.graphhopper.storage.DataAccess; -import com.graphhopper.storage.Directory; -import com.graphhopper.storage.Graph; -import com.graphhopper.storage.GraphExtension; +import com.graphhopper.storage.*; import org.heigit.ors.routing.graphhopper.extensions.SurfaceType; import org.heigit.ors.routing.util.WaySurfaceDescription; @@ -46,6 +43,17 @@ public void init(Graph graph, Directory dir) { this.orsEdges = dir.find("ext_waysurface"); } + /** + * initializes the extended storage to be empty - required for testing purposes as the ext_storage aren't created + * at the time tests are run + */ + public void init() { + if (edgesCount > 0) + throw new AssertionError("The ORS storage must be initialized only once."); + Directory d = new RAMDirectory(); + this.orsEdges = d.find(""); + } + protected final int nextBlockEntryIndex(int size) { edgeEntryIndex += size; return edgeEntryIndex; diff --git a/ors-engine/src/test/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorageTest.java b/ors-engine/src/test/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorageTest.java new file mode 100644 index 0000000000..a32992278b --- /dev/null +++ b/ors-engine/src/test/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorageTest.java @@ -0,0 +1,42 @@ +/* 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 . + */ +package org.heigit.ors.routing.graphhopper.extensions.storages; + +import org.heigit.ors.routing.graphhopper.extensions.SurfaceType; +import org.heigit.ors.routing.util.WaySurfaceDescription; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class WaySurfaceTypeGraphStorageTest { + private final WaySurfaceTypeGraphStorage _storage; + + public WaySurfaceTypeGraphStorageTest() { + _storage = new WaySurfaceTypeGraphStorage(); + _storage.init(); + _storage.create(1); + } + + @Test + void TestWaySurfaceStorage() { + WaySurfaceDescription waySurfaceDescription = new WaySurfaceDescription(); + byte [] buffer = new byte[1]; + + for(SurfaceType surface: SurfaceType.values()) { + waySurfaceDescription.setSurfaceType(surface); + _storage.setEdgeValue(1, waySurfaceDescription); + assertEquals(surface, _storage.getEdgeValue(1, buffer).getSurfaceType()); + } + } +} From 366d795dd5d1343be6d7cb866e2727621b5cd689 Mon Sep 17 00:00:00 2001 From: aoles Date: Tue, 21 May 2024 14:11:11 +0200 Subject: [PATCH 03/15] fix: reduce the number of way surface types Remove some less common and relevant surface types such as "woodchips", or ambiguous ones: "fine gravel" and "cobblestone" in order to be able to encode them as 4-bit values. Note that "woodchips" has never been functional because its original value of 16 exceeds the available data type range of 4 bits. --- .../directions/extra-info/surface.md | 43 ++++++++++--------- .../graphhopper/extensions/SurfaceType.java | 9 ++-- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/docs/api-reference/endpoints/directions/extra-info/surface.md b/docs/api-reference/endpoints/directions/extra-info/surface.md index fc09769c01..b9f6bde0dc 100644 --- a/docs/api-reference/endpoints/directions/extra-info/surface.md +++ b/docs/api-reference/endpoints/directions/extra-info/surface.md @@ -7,27 +7,28 @@ $.routes[*].extras.surface.values ``` This extra provides info about the [surface](https://wiki.openstreetmap.org/wiki/Key:surface) of the corresponding parts of the route. +The strike-through values have been recently removed. -| Value | Name | -|:-----:|:----------------:| -| 0 | Unknown | -| 1 | Paved | -| 2 | Unpaved | -| 3 | Asphalt | -| 4 | Concrete | -| 5 | Cobblestone | -| 6 | Metal | -| 7 | Wood | -| 8 | Compacted Gravel | -| 9 | Fine Gravel | -| 10 | Gravel | -| 11 | Dirt | -| 12 | Ground | -| 13 | Ice | -| 14 | Paving Stones | -| 15 | Sand | -| 16 | Woodchips | -| 17 | Grass | -| 18 | Grass Paver | +| Value | Name | +|:------:|:----------------:| +| 0 | Unknown | +| 1 | Paved | +| 2 | Unpaved | +| 3 | Asphalt | +| 4 | Concrete | +| ~~5~~ | ~~Cobblestone~~ | +| 6 | Metal | +| 7 | Wood | +| 8 | Compacted Gravel | +| ~~9~~ | ~~Fine Gravel~~ | +| 10 | Gravel | +| 11 | Dirt | +| 12 | Ground | +| 13 | Ice | +| 14 | Paving Stones | +| 15 | Sand | +| ~~16~~ | ~~Woodchips~~ | +| 17 | Grass | +| 18 | Grass Paver | [//]: # (keep in sync with org.heigit.ors.routing.graphhopper.extensions.SurfaceType) \ No newline at end of file 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 6ffc194a19..7176c2a26b 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 @@ -22,18 +22,15 @@ public enum SurfaceType { UNPAVED(2), ASPHALT(3), CONCRETE(4), - COBBLESTONE(5), METAL(6), WOOD(7), COMPACTED_GRAVEL(8), - FINE_GRAVEL(9), GRAVEL(10), DIRT(11), GROUND(12), ICE(13), PAVING_STONE(14), SAND(15), - WOODCHIPS(16), GRASS(17), GRASS_PAVER(18); @@ -73,7 +70,7 @@ public static SurfaceType getFromString(String surface) { || "sett".equalsIgnoreCase(surface)) { return SurfaceType.PAVING_STONE; } else if ("cobblestone".equalsIgnoreCase(surface)) { - return SurfaceType.COBBLESTONE; + return SurfaceType.PAVING_STONE; } else if ("metal".equalsIgnoreCase(surface)) { return SurfaceType.METAL; } else if ("wood".equalsIgnoreCase(surface)) { @@ -81,7 +78,7 @@ public static SurfaceType getFromString(String surface) { } else if ("compacted".equalsIgnoreCase(surface) || "pebblestone".equalsIgnoreCase(surface)) { return SurfaceType.COMPACTED_GRAVEL; } else if ("fine_gravel".equalsIgnoreCase(surface)) { - return SurfaceType.FINE_GRAVEL; + return SurfaceType.GRAVEL; } else if ("gravel".equalsIgnoreCase(surface)) { return SurfaceType.GRAVEL; } else if ("dirt".equalsIgnoreCase(surface)) { @@ -94,7 +91,7 @@ public static SurfaceType getFromString(String surface) { } else if ("sand".equalsIgnoreCase(surface)) { return SurfaceType.SAND; } else if ("woodchips".equalsIgnoreCase(surface)) { - return SurfaceType.WOODCHIPS; + return SurfaceType.UNPAVED; } else if ("grass".equalsIgnoreCase(surface)) { return SurfaceType.GRASS; } else if ("grass_paver".equalsIgnoreCase(surface)) { From d0ccc4a1e52130b49ce7872d62816b2d0277cf7c Mon Sep 17 00:00:00 2001 From: aoles Date: Tue, 21 May 2024 23:11:30 +0200 Subject: [PATCH 04/15] refactor: replace chained if-then-else statements by a switch statement Improves code readability and potentially performance. --- .../graphhopper/extensions/SurfaceType.java | 88 ++++++++++--------- 1 file changed, 46 insertions(+), 42 deletions(-) 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 7176c2a26b..0c96f86c28 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 @@ -42,7 +42,7 @@ private SurfaceType(int value) { this.value = (byte) value; } - public byte value() { + public byte value() { return value; } @@ -55,47 +55,51 @@ public static SurfaceType getFromString(String surface) { if (surface.contains(";")) surface = surface.split(";")[0]; - if ("paved".equalsIgnoreCase(surface)) { - return SurfaceType.PAVED; - } else if ("unpaved".equalsIgnoreCase(surface)) { - return SurfaceType.UNPAVED; - } else if ("asphalt".equalsIgnoreCase(surface)) { - return SurfaceType.ASPHALT; - } else if ("concrete".equalsIgnoreCase(surface) || "concrete:lanes".equalsIgnoreCase(surface) - || "concrete:plates".equalsIgnoreCase(surface)) { - return SurfaceType.CONCRETE; - } else if ("paving_stones".equalsIgnoreCase(surface) || "paving_stones:20".equalsIgnoreCase(surface) || "paving_stones:30".equalsIgnoreCase(surface) || "paving_stones:50".equalsIgnoreCase(surface) || "paved_stones".equalsIgnoreCase(surface)) { - return SurfaceType.PAVING_STONE; - } else if ("cobblestone:flattened".equalsIgnoreCase(surface) - || "sett".equalsIgnoreCase(surface)) { - return SurfaceType.PAVING_STONE; - } else if ("cobblestone".equalsIgnoreCase(surface)) { - return SurfaceType.PAVING_STONE; - } else if ("metal".equalsIgnoreCase(surface)) { - return SurfaceType.METAL; - } else if ("wood".equalsIgnoreCase(surface)) { - return SurfaceType.WOOD; - } else if ("compacted".equalsIgnoreCase(surface) || "pebblestone".equalsIgnoreCase(surface)) { - return SurfaceType.COMPACTED_GRAVEL; - } else if ("fine_gravel".equalsIgnoreCase(surface)) { - return SurfaceType.GRAVEL; - } else if ("gravel".equalsIgnoreCase(surface)) { - return SurfaceType.GRAVEL; - } else if ("dirt".equalsIgnoreCase(surface)) { - return SurfaceType.DIRT; - } else if ("ground".equalsIgnoreCase(surface) || "earth".equalsIgnoreCase(surface) - || "mud".equalsIgnoreCase(surface)) { - return SurfaceType.GROUND; - } else if ("ice".equalsIgnoreCase(surface) || "snow".equalsIgnoreCase(surface)) { - return SurfaceType.ICE; - } else if ("sand".equalsIgnoreCase(surface)) { - return SurfaceType.SAND; - } else if ("woodchips".equalsIgnoreCase(surface)) { - return SurfaceType.UNPAVED; - } else if ("grass".equalsIgnoreCase(surface)) { - return SurfaceType.GRASS; - } else if ("grass_paver".equalsIgnoreCase(surface)) { - return SurfaceType.GRASS_PAVER; + switch (surface.toLowerCase()) { + case "paved": + return SurfaceType.PAVED; + case "unpaved", "woodchips": + return SurfaceType.UNPAVED; + case "asphalt": + return SurfaceType.ASPHALT; + case "concrete": + case "concrete:lanes": + case "concrete:plates": + return SurfaceType.CONCRETE; + case "paving_stones": + case "paving_stones:20": + case "paving_stones:30": + case "paving_stones:50": + case "paved_stones": + case "cobblestone:flattened": + case "sett": + case "cobblestone": + return SurfaceType.PAVING_STONE; + case "metal": + return SurfaceType.METAL; + case "wood": + return SurfaceType.WOOD; + case "compacted": + case "pebblestone": + return SurfaceType.COMPACTED_GRAVEL; + case "fine_gravel": + case "gravel": + return SurfaceType.GRAVEL; + case "dirt": + return SurfaceType.DIRT; + case "ground": + case "earth": + case "mud": + return SurfaceType.GROUND; + case "ice": + case "snow": + return SurfaceType.ICE; + case "sand": + return SurfaceType.SAND; + case "grass": + return SurfaceType.GRASS; + case "grass_paver": + return SurfaceType.GRASS_PAVER; } return SurfaceType.UNKNOWN; From 6c4583a73420476929fd2e8a599f269941c06c04 Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 00:14:20 +0200 Subject: [PATCH 05/15] refactor: use switch expression for the sake of more compact code --- .../graphhopper/extensions/SurfaceType.java | 72 ++++++------------- 1 file changed, 22 insertions(+), 50 deletions(-) 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 0c96f86c28..389a05c9a3 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 @@ -36,13 +36,13 @@ public enum SurfaceType { private final byte value; - private static final SurfaceType values[] = values(); + private static final SurfaceType[] values = values(); private SurfaceType(int value) { this.value = (byte) value; } - public byte value() { + public byte value() { return value; } @@ -54,54 +54,26 @@ public static SurfaceType getFromString(String surface) { if (surface.contains(";")) surface = surface.split(";")[0]; + if (surface.contains(":")) + surface = surface.split(":")[0]; - switch (surface.toLowerCase()) { - case "paved": - return SurfaceType.PAVED; - case "unpaved", "woodchips": - return SurfaceType.UNPAVED; - case "asphalt": - return SurfaceType.ASPHALT; - case "concrete": - case "concrete:lanes": - case "concrete:plates": - return SurfaceType.CONCRETE; - case "paving_stones": - case "paving_stones:20": - case "paving_stones:30": - case "paving_stones:50": - case "paved_stones": - case "cobblestone:flattened": - case "sett": - case "cobblestone": - return SurfaceType.PAVING_STONE; - case "metal": - return SurfaceType.METAL; - case "wood": - return SurfaceType.WOOD; - case "compacted": - case "pebblestone": - return SurfaceType.COMPACTED_GRAVEL; - case "fine_gravel": - case "gravel": - return SurfaceType.GRAVEL; - case "dirt": - return SurfaceType.DIRT; - case "ground": - case "earth": - case "mud": - return SurfaceType.GROUND; - case "ice": - case "snow": - return SurfaceType.ICE; - case "sand": - return SurfaceType.SAND; - case "grass": - return SurfaceType.GRASS; - case "grass_paver": - return SurfaceType.GRASS_PAVER; - } - - return SurfaceType.UNKNOWN; + return switch (surface.toLowerCase()) { + case "paved" -> SurfaceType.PAVED; + case "unpaved", "woodchips" -> SurfaceType.UNPAVED; + case "asphalt" -> SurfaceType.ASPHALT; + case "concrete" -> SurfaceType.CONCRETE; + case "paving_stones", "paved_stones", "sett", "cobblestone" -> SurfaceType.PAVING_STONE; + case "metal" -> SurfaceType.METAL; + case "wood" -> SurfaceType.WOOD; + case "compacted", "pebblestone" -> SurfaceType.COMPACTED_GRAVEL; + case "gravel", "fine_gravel" -> SurfaceType.GRAVEL; + case "dirt" -> SurfaceType.DIRT; + case "ground", "earth", "mud" -> SurfaceType.GROUND; + case "ice", "snow" -> SurfaceType.ICE; + case "sand" -> SurfaceType.SAND; + case "grass" -> SurfaceType.GRASS; + case "grass_paver" -> SurfaceType.GRASS_PAVER; + default -> SurfaceType.UNKNOWN; + }; } } From 5ded0a3f827915377339a07003ac1d4bfec4a31c Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 08:58:13 +0200 Subject: [PATCH 06/15] chore: refrain from using deprecated method Address issue reported by sonarcloud by replacing calls to `com.graphhopper.storage.Directory#find(java.lang.String)` by `com.graphhopper.storage.Directory#create(java.lang.String)` --- .../partitioning/storage/CellStorage.java | 2 +- .../partitioning/storage/IsochroneNodeStorage.java | 2 +- .../storage/BorderNodeDistanceStorage.java | 2 +- .../fastisochrones/storage/EccentricityStorage.java | 2 +- .../extensions/storages/BordersGraphStorage.java | 4 ++-- .../extensions/storages/CsvGraphStorage.java | 2 +- .../extensions/storages/GreenIndexGraphStorage.java | 2 +- .../storages/HeavyVehicleAttributesGraphStorage.java | 2 +- .../extensions/storages/HillIndexGraphStorage.java | 2 +- .../extensions/storages/NoiseIndexGraphStorage.java | 2 +- .../extensions/storages/OsmIdGraphStorage.java | 4 ++-- .../storages/RoadAccessRestrictionsGraphStorage.java | 4 ++-- .../extensions/storages/ShadowIndexGraphStorage.java | 2 +- .../extensions/storages/SpeedStorage.java | 2 +- .../extensions/storages/TollwaysGraphStorage.java | 2 +- .../extensions/storages/TrafficGraphStorage.java | 12 ++++++------ .../storages/TrailDifficultyScaleGraphStorage.java | 2 +- .../extensions/storages/WayCategoryGraphStorage.java | 2 +- .../storages/WaySurfaceTypeGraphStorage.java | 4 ++-- .../storages/WheelchairAttributesGraphStorage.java | 2 +- 20 files changed, 29 insertions(+), 29 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/CellStorage.java b/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/CellStorage.java index f5ccb51df5..0df2fbbf7f 100644 --- a/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/CellStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/CellStorage.java @@ -60,7 +60,7 @@ public class CellStorage implements Storable { */ public CellStorage(int nodeCount, Directory dir, IsochroneNodeStorage isochroneNodeStorage) { this.isochroneNodeStorage = isochroneNodeStorage; - cells = dir.find("cells"); + cells = dir.create("cells"); byteCount = 4; this.nodeCount = nodeCount; } diff --git a/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/IsochroneNodeStorage.java b/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/IsochroneNodeStorage.java index b80dd9adaa..43e9885a33 100644 --- a/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/IsochroneNodeStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/fastisochrones/partitioning/storage/IsochroneNodeStorage.java @@ -39,7 +39,7 @@ public class IsochroneNodeStorage implements Storable { private final IntSet cellIdsSet = new IntHashSet(); public IsochroneNodeStorage(int nodeCount, Directory dir) { - isochroneNodes = dir.find("isochronenodes"); + isochroneNodes = dir.create("isochronenodes"); this.nodeCount = nodeCount; // 5 bytes per node for its cell id. // 1 byte for isBordernode, diff --git a/ors-engine/src/main/java/org/heigit/ors/fastisochrones/storage/BorderNodeDistanceStorage.java b/ors-engine/src/main/java/org/heigit/ors/fastisochrones/storage/BorderNodeDistanceStorage.java index e9be16a8d4..9c913ef457 100644 --- a/ors-engine/src/main/java/org/heigit/ors/fastisochrones/storage/BorderNodeDistanceStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/fastisochrones/storage/BorderNodeDistanceStorage.java @@ -52,7 +52,7 @@ public class BorderNodeDistanceStorage implements Storable 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_borders"); + this.orsEdges = dir.create("ext_borders"); } /** @@ -117,7 +117,7 @@ public void init() { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); Directory d = new RAMDirectory(); - this.orsEdges = d.find(""); + this.orsEdges = d.create(""); } /** diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/CsvGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/CsvGraphStorage.java index 49f5cd8a0d..1bcc0aea77 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/CsvGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/CsvGraphStorage.java @@ -84,7 +84,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_csv"); + this.orsEdges = dir.create("ext_csv"); } /** diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/GreenIndexGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/GreenIndexGraphStorage.java index e36224c314..b5596d6c70 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/GreenIndexGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/GreenIndexGraphStorage.java @@ -99,7 +99,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_greenindex"); + this.orsEdges = dir.create("ext_greenindex"); } /** diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java index e62d96397a..95e8b9f1ae 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HeavyVehicleAttributesGraphStorage.java @@ -51,7 +51,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ext_hgv storage must be initialized only once."); - this.orsEdges = dir.find("ext_hgv"); + this.orsEdges = dir.create("ext_hgv"); } private int nextBlockEntryIndex(int size) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HillIndexGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HillIndexGraphStorage.java index d930e3364e..0b4693f4fa 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HillIndexGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/HillIndexGraphStorage.java @@ -47,7 +47,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_hillindex"); + this.orsEdges = dir.create("ext_hillindex"); } public HillIndexGraphStorage create(long initBytes) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/NoiseIndexGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/NoiseIndexGraphStorage.java index 15839fe313..7b4ff35999 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/NoiseIndexGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/NoiseIndexGraphStorage.java @@ -103,7 +103,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_noiselevel"); + this.orsEdges = dir.create("ext_noiselevel"); } /** diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/OsmIdGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/OsmIdGraphStorage.java index 64b7a64762..8f9ed2c3d2 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/OsmIdGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/OsmIdGraphStorage.java @@ -25,7 +25,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_osmids"); + this.orsEdges = dir.create("ext_osmids"); } /** @@ -36,7 +36,7 @@ public void init() { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); Directory d = new RAMDirectory(); - this.orsEdges = d.find(""); + this.orsEdges = d.create(""); } public OsmIdGraphStorage create(long initBytes) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/RoadAccessRestrictionsGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/RoadAccessRestrictionsGraphStorage.java index 9f1c1cc5b1..1e80dafaed 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/RoadAccessRestrictionsGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/RoadAccessRestrictionsGraphStorage.java @@ -49,14 +49,14 @@ public void init() { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); Directory d = new RAMDirectory(); - this.edges = d.find(""); + this.edges = d.create(""); } public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ext_road_access_restrictions storage must be initialized only once."); - this.edges = dir.find("ext_road_access_restrictions"); + this.edges = dir.create("ext_road_access_restrictions"); } public void setEdgeValue(int edgeId, int restriction) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/ShadowIndexGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/ShadowIndexGraphStorage.java index 3f309577e1..4b585ace36 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/ShadowIndexGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/ShadowIndexGraphStorage.java @@ -74,7 +74,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_shadowindex"); + this.orsEdges = dir.create("ext_shadowindex"); } /** diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/SpeedStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/SpeedStorage.java index dfb1083a79..1430410057 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/SpeedStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/SpeedStorage.java @@ -27,7 +27,7 @@ public SpeedStorage(FlagEncoder flagEncoder) { @Override public void init(Graph graph, Directory directory) { - this.speedData = directory.find("ext_speeds_" + this.flagEncoder.toString()); + this.speedData = directory.create("ext_speeds_" + this.flagEncoder.toString()); } @Override diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TollwaysGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TollwaysGraphStorage.java index 560ab84da6..4fe729deb8 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TollwaysGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TollwaysGraphStorage.java @@ -38,7 +38,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ext_tolls storage must be initialized only once."); - this.edges = dir.find("ext_tolls"); + this.edges = dir.create("ext_tolls"); } protected final int nextBlockEntryIndex(int size) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrafficGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrafficGraphStorage.java index 6b5658dd96..444f8d9dbe 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrafficGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrafficGraphStorage.java @@ -441,9 +441,9 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdgesProperties = dir.find("ext_traffic_edge_properties"); - this.orsEdgesTrafficLinkLookup = dir.find("ext_traffic_edges_traffic_lookup"); - this.orsSpeedPatternLookup = dir.find("ext_traffic_pattern_lookup"); + this.orsEdgesProperties = dir.create("ext_traffic_edge_properties"); + this.orsEdgesTrafficLinkLookup = dir.create("ext_traffic_edges_traffic_lookup"); + this.orsSpeedPatternLookup = dir.create("ext_traffic_pattern_lookup"); } /** @@ -454,9 +454,9 @@ public void init() { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); Directory d = new RAMDirectory(); - this.orsEdgesProperties = d.find(""); - this.orsEdgesTrafficLinkLookup = d.find(""); - this.orsSpeedPatternLookup = d.find(""); + this.orsEdgesProperties = d.create(""); + this.orsEdgesTrafficLinkLookup = d.create(""); + this.orsSpeedPatternLookup = d.create(""); } /** diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrailDifficultyScaleGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrailDifficultyScaleGraphStorage.java index 27e9e1198f..d924becf33 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrailDifficultyScaleGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/TrailDifficultyScaleGraphStorage.java @@ -39,7 +39,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ext_traildifficulty storage must be initialized only once."); - this.edges = dir.find("ext_traildifficulty"); + this.edges = dir.create("ext_traildifficulty"); } protected final int nextBlockEntryIndex(int size) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WayCategoryGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WayCategoryGraphStorage.java index a5508526dc..e41afc1f27 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WayCategoryGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WayCategoryGraphStorage.java @@ -38,7 +38,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_waycategory"); + this.orsEdges = dir.create("ext_waycategory"); } public WayCategoryGraphStorage create(long initBytes) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java index ea88d7d9c4..d9592923d9 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WaySurfaceTypeGraphStorage.java @@ -40,7 +40,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_waysurface"); + this.orsEdges = dir.create("ext_waysurface"); } /** @@ -51,7 +51,7 @@ public void init() { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); Directory d = new RAMDirectory(); - this.orsEdges = d.find(""); + this.orsEdges = d.create(""); } protected final int nextBlockEntryIndex(int size) { diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WheelchairAttributesGraphStorage.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WheelchairAttributesGraphStorage.java index e115d7abd8..0050330d49 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WheelchairAttributesGraphStorage.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/WheelchairAttributesGraphStorage.java @@ -99,7 +99,7 @@ public void init(Graph graph, Directory dir) { if (edgesCount > 0) throw new AssertionError("The ORS storage must be initialized only once."); - this.orsEdges = dir.find("ext_wheelchair"); + this.orsEdges = dir.create("ext_wheelchair"); } public WheelchairAttributesGraphStorage create(long initBytes) { From 958c9c6fa85efd179594f1710f52e24ee8827445 Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 09:59:15 +0200 Subject: [PATCH 07/15] fix: classify ways tagged with `surface=earth` as surface type "Dirt" According to OSM wiki `surface=earth` is a synonym of `surface=dirt` and is used for where surface is exposed earth/soil/dirt but it is not sand or gravel or rock. --- .../ors/routing/graphhopper/extensions/SurfaceType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 389a05c9a3..f3236e399f 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 @@ -67,8 +67,8 @@ public static SurfaceType getFromString(String surface) { case "wood" -> SurfaceType.WOOD; case "compacted", "pebblestone" -> SurfaceType.COMPACTED_GRAVEL; case "gravel", "fine_gravel" -> SurfaceType.GRAVEL; - case "dirt" -> SurfaceType.DIRT; - case "ground", "earth", "mud" -> SurfaceType.GROUND; + case "dirt", "earth" -> SurfaceType.DIRT; + case "ground", "mud" -> SurfaceType.GROUND; case "ice", "snow" -> SurfaceType.ICE; case "sand" -> SurfaceType.SAND; case "grass" -> SurfaceType.GRASS; From 38973b33059e0d9f8e743344a8309c115d1186cd Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 10:05:30 +0200 Subject: [PATCH 08/15] feat: add surface tag values "unhewn_cobblestone", "bricks" and "brick" Ways labelled with OSM tag `surface` set to "unhewn_cobblestone", "bricks" or "brick" are classified as surface type "Paving Stones" rather than "Unknown". --- .../heigit/ors/routing/graphhopper/extensions/SurfaceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f3236e399f..cf63572d8a 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 @@ -62,7 +62,7 @@ public static SurfaceType getFromString(String surface) { case "unpaved", "woodchips" -> SurfaceType.UNPAVED; case "asphalt" -> SurfaceType.ASPHALT; case "concrete" -> SurfaceType.CONCRETE; - case "paving_stones", "paved_stones", "sett", "cobblestone" -> SurfaceType.PAVING_STONE; + case "paving_stones", "paved_stones", "sett", "cobblestone", "unhewn_cobblestone", "bricks", "brick" -> SurfaceType.PAVING_STONE; case "metal" -> SurfaceType.METAL; case "wood" -> SurfaceType.WOOD; case "compacted", "pebblestone" -> SurfaceType.COMPACTED_GRAVEL; From 0c337519a33c7bc76c39c7cd29196ab9eb13065e Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 10:22:22 +0200 Subject: [PATCH 09/15] feat: add a few less common unpaved surface types Ways labelled with OSM tag `surface` set to "rock", "rocks", "stone", "shells" or "salt" are classified as surface type "Unpaved" rather than "Unknown". --- .../heigit/ors/routing/graphhopper/extensions/SurfaceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cf63572d8a..4dd3ce9791 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 @@ -59,7 +59,7 @@ public static SurfaceType getFromString(String surface) { return switch (surface.toLowerCase()) { case "paved" -> SurfaceType.PAVED; - case "unpaved", "woodchips" -> SurfaceType.UNPAVED; + case "unpaved", "woodchips", "rock", "rocks", "stone", "shells", "salt" -> SurfaceType.UNPAVED; case "asphalt" -> SurfaceType.ASPHALT; case "concrete" -> SurfaceType.CONCRETE; case "paving_stones", "paved_stones", "sett", "cobblestone", "unhewn_cobblestone", "bricks", "brick" -> SurfaceType.PAVING_STONE; From 5b1078ee8243a43fba3447bf0cf62a6338756dec Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 10:33:45 +0200 Subject: [PATCH 10/15] feat: add surface tag values "chipseal", "bitmac" and "tarmac" Ways labelled with OSM tag `surface` set to "chipseal", "bitmac" or "tarmac" are classified as surface type "Asphalt" rather than "Unknown". According to OSM wiki most of chipseal and bitmac surfaces are likely tagged as `surface=asphalt`, whereas `surface=tarmac` is often incorrectly used for asphalt/concrete surfaces as actual tarmacadam is very unusual. --- .../heigit/ors/routing/graphhopper/extensions/SurfaceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4dd3ce9791..cb63c96e31 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 @@ -60,7 +60,7 @@ public static SurfaceType getFromString(String surface) { return switch (surface.toLowerCase()) { case "paved" -> SurfaceType.PAVED; case "unpaved", "woodchips", "rock", "rocks", "stone", "shells", "salt" -> SurfaceType.UNPAVED; - case "asphalt" -> SurfaceType.ASPHALT; + case "asphalt", "chipseal", "bitmac", "tarmac" -> SurfaceType.ASPHALT; case "concrete" -> SurfaceType.CONCRETE; case "paving_stones", "paved_stones", "sett", "cobblestone", "unhewn_cobblestone", "bricks", "brick" -> SurfaceType.PAVING_STONE; case "metal" -> SurfaceType.METAL; From ee86cd361e72922eae649b9dae30f205b0fa9ed0 Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 11:00:35 +0200 Subject: [PATCH 11/15] feat: add surface tag value "soil" Ways labelled with OSM tag `surface` set to "soil" are classified as surface type "Dirt" rather than "Unknown". --- .../heigit/ors/routing/graphhopper/extensions/SurfaceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cb63c96e31..bd96cd884b 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 @@ -67,7 +67,7 @@ public static SurfaceType getFromString(String surface) { case "wood" -> SurfaceType.WOOD; case "compacted", "pebblestone" -> SurfaceType.COMPACTED_GRAVEL; case "gravel", "fine_gravel" -> SurfaceType.GRAVEL; - case "dirt", "earth" -> SurfaceType.DIRT; + case "dirt", "earth", "soil" -> SurfaceType.DIRT; case "ground", "mud" -> SurfaceType.GROUND; case "ice", "snow" -> SurfaceType.ICE; case "sand" -> SurfaceType.SAND; From db68a9c4966861316498047520e3f44df2f0d504 Mon Sep 17 00:00:00 2001 From: aoles Date: Wed, 22 May 2024 13:17:33 +0200 Subject: [PATCH 12/15] feat: classify ways tagged with `surface=cement` as surface type "Concrete" According to OSM wiki `surface=cement` is often used, by mistake, instead of `surface=concrete`. --- .../heigit/ors/routing/graphhopper/extensions/SurfaceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 bd96cd884b..cb975f79d9 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 @@ -61,7 +61,7 @@ public static SurfaceType getFromString(String surface) { case "paved" -> SurfaceType.PAVED; case "unpaved", "woodchips", "rock", "rocks", "stone", "shells", "salt" -> SurfaceType.UNPAVED; case "asphalt", "chipseal", "bitmac", "tarmac" -> SurfaceType.ASPHALT; - case "concrete" -> SurfaceType.CONCRETE; + case "concrete", "cement" -> SurfaceType.CONCRETE; case "paving_stones", "paved_stones", "sett", "cobblestone", "unhewn_cobblestone", "bricks", "brick" -> SurfaceType.PAVING_STONE; case "metal" -> SurfaceType.METAL; case "wood" -> SurfaceType.WOOD; From 46c19a54ee1eda67f23472abffa34e86fecf03ed Mon Sep 17 00:00:00 2001 From: aoles Date: Thu, 23 May 2024 12:09:57 +0200 Subject: [PATCH 13/15] docs: list OSM tags corresponding to surface categories --- .../directions/extra-info/surface.md | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/api-reference/endpoints/directions/extra-info/surface.md b/docs/api-reference/endpoints/directions/extra-info/surface.md index b9f6bde0dc..d5bc0dfefd 100644 --- a/docs/api-reference/endpoints/directions/extra-info/surface.md +++ b/docs/api-reference/endpoints/directions/extra-info/surface.md @@ -9,26 +9,31 @@ $.routes[*].extras.surface.values This extra provides info about the [surface](https://wiki.openstreetmap.org/wiki/Key:surface) of the corresponding parts of the route. The strike-through values have been recently removed. -| Value | Name | -|:------:|:----------------:| -| 0 | Unknown | -| 1 | Paved | -| 2 | Unpaved | -| 3 | Asphalt | -| 4 | Concrete | -| ~~5~~ | ~~Cobblestone~~ | -| 6 | Metal | -| 7 | Wood | -| 8 | Compacted Gravel | -| ~~9~~ | ~~Fine Gravel~~ | -| 10 | Gravel | -| 11 | Dirt | -| 12 | Ground | -| 13 | Ice | -| 14 | Paving Stones | -| 15 | Sand | -| ~~16~~ | ~~Woodchips~~ | -| 17 | Grass | -| 18 | Grass Paver | +| Value | Name | Corresponding value* of [`surface`](https://wiki.openstreetmap.org/wiki/Key:surface)-tag(s) | +|:------:|:----------------:|:-----------------------------------------------------------------------------------------------:| +| 0 | Unknown | | +| 1 | Paved | `paved` | +| 2 | Unpaved | `unpaved`, `woodchips`, `rock`, `rocks`, `stone`, `shells`, `salt` | +| 3 | Asphalt | `asphalt`, `chipseal`, `bitmac`, `tarmac` | +| 4 | Concrete | `concrete`, `cement` | +| ~~5~~ | ~~Cobblestone~~ | | +| 6 | Metal | `metal` | +| 7 | Wood | `wood` | +| 8 | Compacted Gravel | `compacted`, `pebblestone` | +| ~~9~~ | ~~Fine Gravel~~ | | +| 10 | Gravel | `gravel`, `fine_gravel` | +| 11 | Dirt | `dirt`, `earth`, `soil` | +| 12 | Ground | `ground`, `mud` | +| 13 | Ice | `ice`, `snow` | +| 14 | Paving Stones | `paving_stones`, `paved_stones`, `sett`, `cobblestone`, `unhewn_cobblestone`, `bricks`, `brick` | +| 15 | Sand | `sand` | +| ~~16~~ | ~~Woodchips~~ | | +| 17 | Grass | `grass` | +| 18 | Grass Paver | `grass_paver` | + +*) For tags listing multiple values separated by a semicolon `;` only the first value is considered, and for a +given `value` all values of the form `value[:*]` are matched, where the part `[:*]` is optional. For example, all the +three ways tagged with `surface=concrete`, `surface=concrete:plates;asphalt` and `surface=cement`, respectively, would +be categorized as "Concrete". [//]: # (keep in sync with org.heigit.ors.routing.graphhopper.extensions.SurfaceType) \ No newline at end of file From 6dc1ab5b8e56f8bcf51fb519f635370edab0ee29 Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 24 May 2024 11:24:31 +0200 Subject: [PATCH 14/15] fix: do not infer surface type from road type Road classification doesn't necessarily imply surface. For example, driveways which are supposed to be tagged as `highway=service` + `service=driveway` are in many cases not paved. --- .../builders/WaySurfaceTypeGraphStorageBuilder.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java index f73c7b733a..ece53dda11 100644 --- a/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java +++ b/ors-engine/src/main/java/org/heigit/ors/routing/graphhopper/extensions/storages/builders/WaySurfaceTypeGraphStorageBuilder.java @@ -60,13 +60,6 @@ public void processWay(ReaderWay way) { waySurfaceDesc.setWayType(wayType); SurfaceType surfaceType = way.hasTag(TAG_SURFACE) ? SurfaceType.getFromString(way.getTag(TAG_SURFACE)) : SurfaceType.UNKNOWN; - if (surfaceType == SurfaceType.UNKNOWN) { - if (wayType == WayType.ROAD || wayType == WayType.STATE_ROAD || wayType == WayType.STREET) { - surfaceType = SurfaceType.PAVED; - } else if (wayType == WayType.PATH) { - surfaceType = SurfaceType.UNPAVED; - } - } waySurfaceDesc.setSurfaceType(surfaceType); } From c4ea21a3e4f5c85d2617597d5dd4f283054d63d4 Mon Sep 17 00:00:00 2001 From: aoles Date: Fri, 24 May 2024 11:35:42 +0200 Subject: [PATCH 15/15] test: reflect changes in the API test --- .../test/java/org/heigit/ors/apitests/routing/ResultTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 80d9fb699d..1aa769bf08 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 @@ -958,8 +958,8 @@ void testExtrasDetails() { .assertThat() .body("any { it.key == 'routes' }", is(true)) .body("routes[0].containsKey('extras')", is(true)) - .body("routes[0].extras.surface.values.size()", is(38)) - .body("routes[0].extras.surface.values[18][1]", is(181)) + .body("routes[0].extras.surface.values.size()", is(32)) + .body("routes[0].extras.surface.values[18][1]", is(237)) .body("routes[0].extras.suitability.values[18][0]", is(359)) .body("routes[0].extras.containsKey('steepness')", is(true)) .statusCode(200);