Changeset 17107 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2020-10-08T07:01:06+02:00 (5 years ago)
Author:
GerdP
Message:

fix #19822: Inconsistent behavior with GeoJSON multipolygons

  • replace untagged multipolygon member by tagged duplicate
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/io/GeoJSONReader.java

    r17054 r17107  
    4141import org.openstreetmap.josm.data.projection.Projection;
    4242import org.openstreetmap.josm.data.projection.Projections;
     43import org.openstreetmap.josm.data.validation.TestError;
     44import org.openstreetmap.josm.data.validation.tests.DuplicateWay;
    4345import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    4446import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    402404                }
    403405            }
     406            mergeEqualMultipolygonWays();
    404407        } catch (IOException | JsonParsingException e) {
    405408            throw new IllegalDataException(e);
    406409        }
    407410        return getDataSet();
     411    }
     412
     413    /**
     414     * Import may create duplicate ways were one is member of a multipolygon and untagged and the other is tagged.
     415     * Try to merge them here.
     416     */
     417    private void mergeEqualMultipolygonWays() {
     418        DuplicateWay test = new DuplicateWay();
     419        test.startTest(null);
     420        for (Way w: getDataSet().getWays()) {
     421            test.visit(w);
     422        }
     423        test.endTest();
     424
     425        if (test.getErrors().isEmpty())
     426            return;
     427
     428        for (TestError e : test.getErrors()) {
     429            if (e.getPrimitives().size() == 2 && !e.isFixable()) {
     430                Way mpWay = null;
     431                Way tagged = null;
     432                for (OsmPrimitive p : e.getPrimitives()) {
     433                    if (p.isTagged() && p.referrers(Relation.class).count() == 0)
     434                        tagged = (Way) p;
     435                    else if (p.referrers(Relation.class).anyMatch(Relation::isMultipolygon))
     436                        mpWay = (Way) p;
     437                }
     438                if (mpWay != null && tagged != null) {
     439                    for (Relation r : mpWay.referrers(Relation.class).filter(Relation::isMultipolygon)
     440                            .collect(Collectors.toList())) {
     441                        for (int i = 0; i < r.getMembersCount(); i++) {
     442                            if (r.getMember(i).getMember().equals(mpWay)) {
     443                                r.setMember(i, new RelationMember(r.getRole(i), tagged));
     444                            }
     445                        }
     446                    }
     447                    mpWay.setDeleted(true);
     448                }
     449            }
     450        }
     451        ds.cleanupDeletedPrimitives();
    408452    }
    409453
Note: See TracChangeset for help on using the changeset viewer.