ignore duplicate relation members (#876)

pull/877/head
Michael Barry 2024-05-02 06:21:01 -04:00 zatwierdzone przez GitHub
rodzic 85324e7f65
commit ef1702ec73
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
2 zmienionych plików z 8 dodań i 1 usunięć

Wyświetl plik

@ -35,8 +35,10 @@ import java.io.Closeable;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
@ -788,11 +790,15 @@ public class OsmReader implements Closeable, MemoryEstimator.HasEstimate {
@Override
protected Geometry computeWorldGeometry() throws GeometryException {
List<LongArrayList> rings = new ArrayList<>(relation.members().size());
Set<Long> added = new HashSet<>();
for (OsmElement.Relation.Member member : relation.members()) {
String role = member.role();
LongArrayList poly = multipolygonWayGeometries.get(member.ref());
if (member.type() == OsmElement.Type.WAY) {
if (poly != null && !poly.isEmpty()) {
if (!added.add(member.ref())) {
// ignore duplicate relation members
stats.dataError("osm_" + relation.getTag("type") + "_duplicate_member");
} else if (poly != null && !poly.isEmpty()) {
rings.add(poly);
} else {
// boundary and land_area relations might not be complete for extracts, but multipolygons should be

Wyświetl plik

@ -1053,6 +1053,7 @@ class PlanetilerTests {
rel.members().add(new OsmElement.Relation.Member(OsmElement.Type.WAY, 14, "outer"));
rel.members().add(new OsmElement.Relation.Member(OsmElement.Type.WAY, 15, null)); // missing
rel.members().add(new OsmElement.Relation.Member(OsmElement.Type.WAY, 16, "inner")); // incorrect
rel.members().add(new OsmElement.Relation.Member(OsmElement.Type.WAY, 14, "outer")); // duplicate
}),
with(new OsmElement.Relation(18), rel -> {
rel.setTag("type", "relation");