Exclude relations with invalid multipolygon geometry (#564)

pull/567/head
Erik Price 2023-04-26 01:16:01 +02:00 zatwierdzone przez GitHub
rodzic 9b76c849e0
commit 2450c9d9f7
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
2 zmienionych plików z 49 dodań i 5 usunięć

Wyświetl plik

@ -293,7 +293,8 @@ public class OsmReader implements Closeable, MemoryEstimator.HasEstimate {
}
private static boolean isMultipolygon(OsmElement.Relation relation) {
return relation.hasTag("type", "multipolygon", "boundary", "land_area");
return relation.hasTag("type", "multipolygon", "boundary", "land_area") &&
relation.members().stream().anyMatch(m -> m.type() == OsmElement.Type.WAY);
}
/**

Wyświetl plik

@ -1,10 +1,7 @@
package com.onthegomap.planetiler.reader.osm;
import static com.onthegomap.planetiler.TestUtils.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;
import com.onthegomap.planetiler.Profile;
import com.onthegomap.planetiler.TestUtils;
@ -542,6 +539,52 @@ class OsmReaderTest {
);
}
@Test
void testMultipolygonInvalidMembers() {
OsmReader reader = newOsmReader();
var relation = new OsmElement.Relation(16);
var childRelation = new OsmElement.Relation(17);
var childNode = new OsmElement.Node(17, 0.0, 0.0);
relation.setTag("type", "multipolygon");
relation.members().add(new OsmElement.Relation.Member(OsmElement.Type.RELATION, childRelation.id(), "outer"));
relation.members().add(new OsmElement.Relation.Member(OsmElement.Type.NODE, childNode.id(), "inner"));
List<OsmElement> elements = List.of(
node(1, 0.1, 0.1),
node(2, 0.9, 0.1),
node(3, 0.9, 0.9),
node(4, 0.1, 0.9),
node(5, 0.2, 0.3),
node(6, 0.8, 0.3),
node(7, 0.8, 0.8),
node(8, 0.2, 0.8),
node(9, 0.2, 0.2),
node(10, 0.8, 0.2),
node(11, 0.8, 0.7),
node(12, 0.2, 0.7),
childNode,
childRelation,
relation
);
processPass1Block(reader, elements);
elements.stream().flatMap(nodes).forEach(reader::processNodePass2);
var nodeCache = reader.newNodeLocationProvider();
elements.stream().flatMap(ways).forEach(way -> reader.processWayPass2(way, nodeCache));
var feature = reader.processRelationPass2(relation, nodeCache);
assertNull(feature);
}
@Test
void testMultiPolygonRefersToNonexistentNode() {
OsmReader reader = newOsmReader();