Ticket #20680: 20680-4.patch
File 20680-4.patch, 5.2 KB (added by , 3 years ago) |
---|
-
src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
8 8 import java.util.Arrays; 9 9 import java.util.HashMap; 10 10 import java.util.HashSet; 11 import java.util.LinkedHashSet; 11 12 import java.util.List; 12 13 import java.util.Map; 13 14 import java.util.Objects; … … 15 16 import java.util.stream.Collectors; 16 17 17 18 import org.openstreetmap.josm.data.coor.EastNorth; 19 import org.openstreetmap.josm.data.osm.DataSet; 20 import org.openstreetmap.josm.data.osm.Node; 21 import org.openstreetmap.josm.data.osm.OsmDataManager; 18 22 import org.openstreetmap.josm.data.osm.OsmPrimitive; 19 23 import org.openstreetmap.josm.data.osm.OsmUtils; 20 24 import org.openstreetmap.josm.data.osm.Relation; … … 80 84 private final Map<Point2D, List<WaySegment>> cellSegments = new HashMap<>(1000); 81 85 /** The already detected ways in error */ 82 86 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; 83 91 84 92 protected final int code; 85 93 … … 98 106 } 99 107 100 108 @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)); 111 121 } 112 122 113 123 @Override … … 226 236 227 237 @Override 228 238 public boolean isPrimitiveUsable(OsmPrimitive p) { 239 if (partialSelection && p instanceof Node) 240 return p.isModified(); 229 241 return super.isPrimitiveUsable(p) && p.hasKey("boundary") && !p.hasTag("boundary", "protected_area") 230 242 && (!(p instanceof Relation) || p.isMultipolygon()); 231 243 } … … 278 290 } 279 291 280 292 @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 281 300 boolean ignoreWaySegmentCombination(Way w1, Way w2) { 282 301 return false; // we should not get here 283 302 } … … 298 317 @Override 299 318 public void startTest(ProgressMonitor monitor) { 300 319 super.startTest(monitor); 320 isSurroundingTest = false; 301 321 cellSegments.clear(); 302 322 seenWays.clear(); 323 possiblyModifiedWays.clear(); 324 visitedWays.clear(); 303 325 } 304 326 305 327 @Override 306 328 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 } 307 341 super.endTest(); 308 342 cellSegments.clear(); 309 343 seenWays.clear(); 344 possiblyModifiedWays.clear(); 345 visitedWays.clear(); 310 346 } 311 347 312 348 static boolean isCoastline(OsmPrimitive w) { … … 342 378 } 343 379 344 380 @Override 381 public void visit(Node n) { 382 if (partialSelection && n.isModified()) { 383 possiblyModifiedWays.addAll(n.getParentWays()); 384 } 385 } 386 387 @Override 345 388 public void visit(Way w) { 389 visitedWays.add(w); 346 390 boolean findSelfCrossingOnly = this instanceof SelfCrossing; 347 391 if (findSelfCrossingOnly) { 348 392 // free memory, we are not interested in previous ways … … 390 434 highlight.add(es2); 391 435 } 392 436 } 393 segments.add(es1); 437 if (!isSurroundingTest) 438 segments.add(es1); 394 439 } 395 440 } 396 441 }