Ticket #19822: 19822.patch

File 19822.patch, 2.8 KB (added by GerdP, 14 months ago)

quick hack to replace untagged multipolygon member by tagged duplicate

  • src/org/openstreetmap/josm/io/GeoJSONReader.java

     
    4040import org.openstreetmap.josm.data.osm.Way;
    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;
    4547import org.openstreetmap.josm.tools.Logging;
     
    401403                    parse(parser);
    402404                }
    403405            }
     406            mergeEqualMultipolygonWays();
    404407        } catch (IOException | JsonParsingException e) {
    405408            throw new IllegalDataException(e);
    406409        }
     
    408411    }
    409412
    410413    /**
     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();
     452    }
     453
     454    /**
    411455     * Parse the given input source and return the dataset.
    412456     *
    413457     * @param source          the source input stream. Must not be null.