Ticket #19600: 19600.patch
File 19600.patch, 4.8 KB (added by , 5 years ago) |
---|
-
src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java
4 4 import static org.openstreetmap.josm.data.validation.tests.CrossingWays.HIGHWAY; 5 5 import static org.openstreetmap.josm.tools.I18n.tr; 6 6 7 import java.util.ArrayList; 8 import java.util.Arrays; 7 9 import java.util.List; 10 import java.util.stream.Collectors; 8 11 9 12 import org.openstreetmap.josm.data.osm.Node; 10 13 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 13 16 import org.openstreetmap.josm.data.validation.Severity; 14 17 import org.openstreetmap.josm.data.validation.Test; 15 18 import org.openstreetmap.josm.data.validation.TestError; 16 import org.openstreetmap.josm.gui.mappaint.ElemStyles;17 19 18 20 /** 19 * Checks for ways connected to areas.21 * Checks for highways connected to areas. 20 22 * @since 4682 21 23 */ 22 24 public class WayConnectedToArea extends Test { … … 34 36 return; 35 37 } 36 38 37 List<OsmPrimitive> r = w.firstNode().getReferrers(); 38 boolean hasway = r.stream().anyMatch(p -> p != w && p.hasKey(HIGHWAY)); 39 if (!hasway) { 40 for (OsmPrimitive p : r) { 41 testForError(w, w.firstNode(), p); 39 for (Node node : Arrays.asList(w.firstNode(), w.lastNode())) { 40 if (node.isOutsideDownloadArea()) { 41 continue; 42 42 } 43 } 44 r = w.lastNode().getReferrers(); 45 hasway = r.stream().anyMatch(p -> p != w && p.hasKey(HIGHWAY)); 46 if (!hasway) { 47 for (OsmPrimitive p : r) { 48 testForError(w, w.lastNode(), p); 43 if (node.hasTag("noexit", "yes")) { 44 // Avoid "legal" case (see #17036) 45 continue; 49 46 } 50 }51 }52 47 53 private void testForError(Way w, Node wayNode, OsmPrimitive p) { 54 if (wayNode.isOutsideDownloadArea() 55 || wayNode.getReferrers().stream().anyMatch(p1 -> p1.hasTag("route", "ferry"))) { 56 return; 57 } else if (isArea(p)) { 58 addPossibleError(w, wayNode, p, p); 59 } else { 60 p.referrers(Relation.class) 61 .filter(r -> r.isMultipolygon() && isArea(r)) 62 .findFirst() 63 .ifPresent(r -> addPossibleError(w, wayNode, p, r)); 48 // get other parent ways 49 List<Way> parentWays = node.referrers(Way.class).filter(p -> w != p).collect(Collectors.toList()); 50 List<OsmPrimitive> badAreas = new ArrayList<>(); 51 boolean hasValidTarget = false; 52 for (Way other : parentWays) { 53 hasValidTarget |= wayIsHighwayTarget(other) || isSlipway(w, node); 54 if (hasValidTarget) 55 break; 56 else if (other.concernsArea()) { 57 badAreas.add(other); 58 } 59 } 60 if (!hasValidTarget && !badAreas.isEmpty()) { 61 List<OsmPrimitive> primitives = new ArrayList<>(); 62 primitives.add(w); 63 primitives.addAll(badAreas); 64 errors.add(TestError.builder(this, Severity.WARNING, 2301) 65 .message(tr("Way terminates on Area")) 66 .primitives(primitives) 67 .highlight(node) 68 .build()); 69 } 64 70 } 65 71 } 66 72 67 private static boolean isArea(OsmPrimitive p) {68 return p.hasKey("landuse", "natural") && ElemStyles.hasAreaElemStyle(p, false);73 private static boolean wayIsHighwayTarget(Way w) { 74 return w.hasKey(HIGHWAY) || isBuilding(w) || w.hasTag("route", "ferry") || w.hasTag("railway", "platform"); 69 75 } 70 76 71 private void addPossibleError(Way w, Node wayNode, OsmPrimitive p, OsmPrimitive area) { 72 // Avoid "legal" cases (see #10655) 73 if (w.hasKey(HIGHWAY) && wayNode.hasTag("leisure", "slipway") && area.hasTag("natural", "water")) { 74 return; 75 } 76 if (wayNode.hasTag("noexit", "yes")) { 77 // Avoid "legal" case (see #17036) 78 return; 79 } 80 errors.add(TestError.builder(this, Severity.WARNING, 2301) 81 .message(tr("Way terminates on Area")) 82 .primitives(w, p) 83 .highlight(wayNode) 84 .build()); 77 // Avoid "legal" cases (see #10655) 78 private static boolean isSlipway(Way w, Node node) { 79 return node.hasTag("leisure", "slipway") && (w.hasTag("natural", "water") || 80 w.referrers(Relation.class) 81 .anyMatch(r -> r.isMultipolygon() && r.hasTag("natural", "water"))); 85 82 } 86 83 }