Ticket #20680: 20680-4.patch

File 20680-4.patch, 5.2 KB (added by GerdP, 3 years ago)
  • src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java

     
    88import java.util.Arrays;
    99import java.util.HashMap;
    1010import java.util.HashSet;
     11import java.util.LinkedHashSet;
    1112import java.util.List;
    1213import java.util.Map;
    1314import java.util.Objects;
     
    1516import java.util.stream.Collectors;
    1617
    1718import org.openstreetmap.josm.data.coor.EastNorth;
     19import org.openstreetmap.josm.data.osm.DataSet;
     20import org.openstreetmap.josm.data.osm.Node;
     21import org.openstreetmap.josm.data.osm.OsmDataManager;
    1822import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1923import org.openstreetmap.josm.data.osm.OsmUtils;
    2024import org.openstreetmap.josm.data.osm.Relation;
     
    8084    private final Map<Point2D, List<WaySegment>> cellSegments = new HashMap<>(1000);
    8185    /** The already detected ways in error */
    8286    private final Map<List<Way>, List<WaySegment>> seenWays = new HashMap<>(50);
     87    /** collection of ways which refer to modified nodes */
     88    private final Set<Way> possiblyModifiedWays = new LinkedHashSet<>();
     89    private final Set<Way> visitedWays = new HashSet<>();
     90    protected boolean isSurroundingTest;
    8391
    8492    protected final int code;
    8593
     
    98106        }
    99107
    100108        @Override
    101         public boolean isPrimitiveUsable(OsmPrimitive w) {
    102             return super.isPrimitiveUsable(w)
    103                     && !isProposedOrAbandoned(w)
    104                     && (isHighway(w)
    105                     || w.hasKey(WATERWAY)
    106                     || isRailway(w)
    107                     || isCoastline(w)
    108                     || isBuilding(w)
    109                     || w.hasKey(BARRIER)
    110                     || isResidentialArea(w));
     109        public boolean isPrimitiveUsable(OsmPrimitive p) {
     110            if (partialSelection && p instanceof Node)
     111                return p.isModified();
     112            return super.isPrimitiveUsable(p)
     113                    && !isProposedOrAbandoned(p)
     114                    && (isHighway(p)
     115                    || p.hasKey(WATERWAY)
     116                    || isRailway(p)
     117                    || isCoastline(p)
     118                    || isBuilding(p)
     119                    || p.hasKey(BARRIER)
     120                    || isResidentialArea(p));
    111121        }
    112122
    113123        @Override
     
    226236
    227237        @Override
    228238        public boolean isPrimitiveUsable(OsmPrimitive p) {
     239            if (partialSelection && p instanceof Node)
     240                return p.isModified();
    229241            return super.isPrimitiveUsable(p) && p.hasKey("boundary") && !p.hasTag("boundary", "protected_area")
    230242                    && (!(p instanceof Relation) || p.isMultipolygon());
    231243        }
     
    278290        }
    279291
    280292        @Override
     293        public boolean isPrimitiveUsable(OsmPrimitive p) {
     294            if (partialSelection && p instanceof Node)
     295                return p.isModified();
     296            return super.isPrimitiveUsable(p);
     297        }
     298
     299        @Override
    281300        boolean ignoreWaySegmentCombination(Way w1, Way w2) {
    282301            return false; // we should not get here
    283302        }
     
    298317    @Override
    299318    public void startTest(ProgressMonitor monitor) {
    300319        super.startTest(monitor);
     320        isSurroundingTest = false;
    301321        cellSegments.clear();
    302322        seenWays.clear();
     323        possiblyModifiedWays.clear();
     324        visitedWays.clear();
    303325    }
    304326
    305327    @Override
    306328    public void endTest() {
     329        if (partialSelection) {
     330            possiblyModifiedWays.stream().filter(w -> !visitedWays.contains(w)).forEach(this::visit);
     331            // see #20680: if only a selection was tested, test it also against the other suitable ways
     332            if (!cellSegments.isEmpty() && !(this instanceof SelfCrossing)) {
     333                isSurroundingTest = true; // don't add more ways to the spatial index
     334                DataSet ds = OsmDataManager.getInstance().getActiveDataSet();
     335                for (Way w : ds.getWays()) {
     336                    if (isPrimitiveUsable(w) && !visitedWays.contains(w))
     337                        visit(w);
     338                }
     339            }
     340        }
    307341        super.endTest();
    308342        cellSegments.clear();
    309343        seenWays.clear();
     344        possiblyModifiedWays.clear();
     345        visitedWays.clear();
    310346    }
    311347
    312348    static boolean isCoastline(OsmPrimitive w) {
     
    342378    }
    343379
    344380    @Override
     381    public void visit(Node n) {
     382        if (partialSelection && n.isModified()) {
     383            possiblyModifiedWays.addAll(n.getParentWays());
     384        }
     385    }
     386
     387    @Override
    345388    public void visit(Way w) {
     389        visitedWays.add(w);
    346390        boolean findSelfCrossingOnly = this instanceof SelfCrossing;
    347391        if (findSelfCrossingOnly) {
    348392            // free memory, we are not interested in previous ways
     
    390434                        highlight.add(es2);
    391435                    }
    392436                }
    393                 segments.add(es1);
     437                if (!isSurroundingTest)
     438                    segments.add(es1);
    394439            }
    395440        }
    396441    }