diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b463ef2c..4d312c6d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ Changelog ## 1.3.0-SNAPSHOT (current main) +### bugfixes + +* Fix crash while building geometry of multipolygon with zero-node way members under certain circumstances + ## 1.2.2 diff --git a/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/geometry/OSHDBGeometryBuilderInternal.java b/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/geometry/OSHDBGeometryBuilderInternal.java index 465545814..bff35894a 100644 --- a/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/geometry/OSHDBGeometryBuilderInternal.java +++ b/oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/geometry/OSHDBGeometryBuilderInternal.java @@ -543,7 +543,7 @@ private static List> waysToLines( .filter(Objects::nonNull) .filter(OSMEntity::isVisible) .collect(Collectors.toCollection(LinkedList::new)) - ) + ) .collect(Collectors.toCollection(LinkedList::new)); } @@ -876,6 +876,9 @@ private static List> buildRings( joinable = false; for (var waysIterator = ways.iterator(); waysIterator.hasNext();) { LinkedList what = waysIterator.next(); + if (what.isEmpty()) { + continue; + } if (lastId == what.getFirst().getId()) { // end of partial ring matches to start of current line what.removeFirst(); diff --git a/oshdb-util/src/test/java/org/heigit/ohsome/oshdb/util/geometry/incomplete/OSHDBGeometryBuilderTestPolygonIncompleteDataTest.java b/oshdb-util/src/test/java/org/heigit/ohsome/oshdb/util/geometry/incomplete/OSHDBGeometryBuilderTestPolygonIncompleteDataTest.java index 75b91ca68..f9875d205 100644 --- a/oshdb-util/src/test/java/org/heigit/ohsome/oshdb/util/geometry/incomplete/OSHDBGeometryBuilderTestPolygonIncompleteDataTest.java +++ b/oshdb-util/src/test/java/org/heigit/ohsome/oshdb/util/geometry/incomplete/OSHDBGeometryBuilderTestPolygonIncompleteDataTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.heigit.ohsome.oshdb.OSHDBTimestamp; +import org.heigit.ohsome.oshdb.osm.OSMRelation; import org.heigit.ohsome.oshdb.util.geometry.OSHDBGeometryBuilder; import org.heigit.ohsome.oshdb.util.geometry.OSHDBGeometryTest; import org.heigit.ohsome.oshdb.util.geometry.helpers.TimestampParser; @@ -69,4 +70,14 @@ void testAllNodesOfWayNotExistent() { Geometry result = buildGeometry(relations(502L, 0), timestamp); assertNotNull(result); } + + @Test + void testRelationMemberWayWithoutNodes() { + // ways without nodes references (=invalid OSM data) can occur in old OSM data + // example: https://www.openstreetmap.org/api/0.6/way/25714579/6 + OSMRelation rel = relations(503L, 0); + Geometry result = buildGeometry(rel); + // no exception should have been thrown at this point + assertTrue(result.isValid()); + } } diff --git a/oshdb-util/src/test/resources/incomplete-osm/polygon.osm b/oshdb-util/src/test/resources/incomplete-osm/polygon.osm index 0d6067fcb..4d9f43e7d 100644 --- a/oshdb-util/src/test/resources/incomplete-osm/polygon.osm +++ b/oshdb-util/src/test/resources/incomplete-osm/polygon.osm @@ -9,19 +9,15 @@ - - - - @@ -31,8 +27,6 @@ - - @@ -41,36 +35,35 @@ - - - - + + - - - - - - + + + + + + +