Skip to content

Commit 1a43e9c

Browse files
committed
fix crash while building geometry of multipolygon with zero-node way members
this happens when * a multipolygon refers to a member which at the given timestamp has zero nodes - example: https://www.openstreetmap.org/api/0.6/relation/22050/history at `2008-09-30T10:00:52Z` contains https://www.openstreetmap.org/api/0.6/way/25714579/6 which has zero nodes * the order of the relation members is such that the 0-node member's previous members do not form a closed loop
1 parent 48ccdec commit 1a43e9c

File tree

4 files changed

+27
-16
lines changed

4 files changed

+27
-16
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ Changelog
33

44
## 1.3.0-SNAPSHOT (current main)
55

6+
### bugfixes
7+
8+
* Fix crash while building geometry of multipolygon with zero-node way members under certain circumstances
9+
610

711
## 1.2.2
812

oshdb-util/src/main/java/org/heigit/ohsome/oshdb/util/geometry/OSHDBGeometryBuilderInternal.java

+3
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,9 @@ private static List<LinkedList<OSMNode>> buildRings(
876876
joinable = false;
877877
for (var waysIterator = ways.iterator(); waysIterator.hasNext();) {
878878
LinkedList<OSMNode> what = waysIterator.next();
879+
if (what.isEmpty()) {
880+
continue;
881+
}
879882
if (lastId == what.getFirst().getId()) {
880883
// end of partial ring matches to start of current line
881884
what.removeFirst();

oshdb-util/src/test/java/org/heigit/ohsome/oshdb/util/geometry/incomplete/OSHDBGeometryBuilderTestPolygonIncompleteDataTest.java

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static org.junit.jupiter.api.Assertions.assertTrue;
66

77
import org.heigit.ohsome.oshdb.OSHDBTimestamp;
8+
import org.heigit.ohsome.oshdb.osm.OSMRelation;
89
import org.heigit.ohsome.oshdb.util.geometry.OSHDBGeometryBuilder;
910
import org.heigit.ohsome.oshdb.util.geometry.OSHDBGeometryTest;
1011
import org.heigit.ohsome.oshdb.util.geometry.helpers.TimestampParser;
@@ -69,4 +70,14 @@ void testAllNodesOfWayNotExistent() {
6970
Geometry result = buildGeometry(relations(502L, 0), timestamp);
7071
assertNotNull(result);
7172
}
73+
74+
@Test
75+
void testRelationMemberWayWithoutNodes() {
76+
// ways without nodes references (=invalid OSM data) can occur in old OSM data
77+
// example: https://www.openstreetmap.org/api/0.6/way/25714579/6
78+
OSMRelation rel = relations(503L, 0);
79+
Geometry result = buildGeometry(rel);
80+
// no exception should have been thrown at this point
81+
assertTrue(result.isValid());
82+
}
7283
}

oshdb-util/src/test/resources/incomplete-osm/polygon.osm

+9-16
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,15 @@
99
<node id="21" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.34" lat="1.05"/>
1010
<node id="22" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.32" lat="1.05"/>
1111
<node id="23" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.32" lat="1.04"/>
12-
1312
<node id="24" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.31" lat="1.04"/>
1413
<node id="25" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.33" lat="1.05"/>
1514
<node id="26" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.33" lat="1.04"/>
1615
<node id="27" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.32" lat="1.04"/>
17-
1816
<node id="28" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1" lon="7.31" lat="1.01"/>
1917
<way id="102" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
2018
<nd ref="11"/>
2119
<nd ref="12"/>
2220
<nd ref="13"/>
23-
<tag k="test:section" v="mp-geom"/>
24-
<tag k="test:id" v="703"/>
2521
</way>
2622
<way id="103" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
2723
<nd ref="13"/>
@@ -31,8 +27,6 @@
3127
<nd ref="17"/>
3228
<nd ref="18"/>
3329
<nd ref="11"/>
34-
<tag k="test:section" v="mp-geom"/>
35-
<tag k="test:id" v="703"/>
3630
</way>
3731
<way id="105" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
3832
<nd ref="24"/>
@@ -41,36 +35,35 @@
4135
<nd ref="27"/>
4236
<nd ref="28"/>
4337
<nd ref="24"/>
44-
<tag k="test:section" v="mp-geom"/>
45-
<tag k="test:id" v="703"/>
4638
</way>
4739
<way id="106" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
4840
<nd ref="1"/>
4941
<nd ref="2"/>
50-
<tag k="test:section" v="mp-geom"/>
51-
<tag k="test:id" v="731"/>
42+
</way>
43+
<way id="107" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
5244
</way>
5345
<relation id="500" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
5446
<member type="way" ref="102" role="outer"/>
5547
<member type="way" ref="103" role="outer"/>
5648
<tag k="type" v="multipolygon"/>
57-
<tag k="test:section" v="mp-geom"/>
58-
<tag k="test:id" v="703"/>
5949
<tag k="landuse" v="forest"/>
6050
</relation>
6151
<relation id="501" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
6252
<member type="way" ref="104" role="outer"/>
6353
<member type="way" ref="105" role="outer"/>
6454
<tag k="type" v="multipolygon"/>
65-
<tag k="test:section" v="mp-geom"/>
66-
<tag k="test:id" v="703"/>
6755
<tag k="landuse" v="forest"/>
6856
</relation>
6957
<relation id="502" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
7058
<member type="way" ref="106" role="outer"/>
7159
<tag k="type" v="multipolygon"/>
72-
<tag k="test:section" v="mp-geom"/>
73-
<tag k="test:id" v="703"/>
60+
<tag k="landuse" v="forest"/>
61+
</relation>
62+
<relation id="503" version="1" timestamp="2014-01-01T00:00:00Z" uid="1" user="test" changeset="1">
63+
<member type="way" ref="102" role="outer"/>
64+
<member type="way" ref="107" role="outer"/>
65+
<member type="way" ref="103" role="outer"/>
66+
<tag k="type" v="multipolygon"/>
7467
<tag k="landuse" v="forest"/>
7568
</relation>
7669
</osm>

0 commit comments

Comments
 (0)