Changeset 17185 in josm for trunk/src


Ignore:
Timestamp:
2020-10-13T11:57:39+02:00 (4 years ago)
Author:
GerdP
Message:

fix #19822: Inconsistent behavior with GeoJSON multipolygons
Handle care when one polygon is part of two(or more) multipolygons. e.g. serves as inner in relation A, but as a outer for relation B

File:
1 edited

Legend:

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

    r17131 r17185  
    433433        for (TestError e : test.getErrors()) {
    434434            if (e.getPrimitives().size() == 2 && !e.isFixable()) {
    435                 Way mpWay = null;
    436                 Way tagged = null;
     435                List<Way> mpWays = new ArrayList<>();
     436                Way replacement = null;
    437437                for (OsmPrimitive p : e.getPrimitives()) {
    438438                    if (p.isTagged() && p.referrers(Relation.class).count() == 0)
    439                         tagged = (Way) p;
     439                        replacement = (Way) p;
    440440                    else if (p.referrers(Relation.class).anyMatch(Relation::isMultipolygon))
    441                         mpWay = (Way) p;
    442                 }
    443                 if (mpWay != null && tagged != null) {
     441                        mpWays.add((Way) p);
     442                }
     443                if (replacement == null && mpWays.size() == 2) {
     444                    replacement = mpWays.remove(1);
     445                }
     446                if (replacement != null && mpWays.size() == 1) {
     447                    Way mpWay = mpWays.get(0);
    444448                    for (Relation r : mpWay.referrers(Relation.class).filter(Relation::isMultipolygon)
    445449                            .collect(Collectors.toList())) {
    446450                        for (int i = 0; i < r.getMembersCount(); i++) {
    447451                            if (r.getMember(i).getMember().equals(mpWay)) {
    448                                 r.setMember(i, new RelationMember(r.getRole(i), tagged));
     452                                r.setMember(i, new RelationMember(r.getRole(i), replacement));
    449453                            }
    450454                        }
Note: See TracChangeset for help on using the changeset viewer.