Ticket #16247: 16247.patch
File 16247.patch, 5.3 KB (added by , 5 years ago) |
---|
-
src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
6 6 import java.util.ArrayList; 7 7 import java.util.Arrays; 8 8 import java.util.Collection; 9 import java.util.LinkedHashSet; 9 10 import java.util.List; 11 import java.util.Set; 10 12 11 13 import org.openstreetmap.josm.data.osm.Node; 12 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; 13 15 import org.openstreetmap.josm.data.osm.Relation; 16 import org.openstreetmap.josm.data.osm.RelationMember; 14 17 import org.openstreetmap.josm.data.osm.Way; 15 18 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon; 16 19 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay; … … 29 32 30 33 /** Test identifier */ 31 34 protected static final int POWER_LINES = 2501; 35 protected static final int POWER_CONNECTION = 2502; 32 36 33 37 /** Values for {@code power} key interpreted as power lines */ 34 38 static final Collection<String> POWER_LINE_TAGS = Arrays.asList("line", "minor_line"); … … 42 46 static final Collection<String> POWER_ALLOWED_TAGS = Arrays.asList("switch", "transformer", "busbar", "generator", "switchgear", 43 47 "portal", "terminal", "insulator"); 44 48 45 private final List<TestError> potentialErrors = new ArrayList<>(); 49 private final Set<Node> badConnections = new LinkedHashSet<>(); 50 private final Set<Node> missingTowerOrPole = new LinkedHashSet<>(); 46 51 47 52 private final List<OsmPrimitive> powerStations = new ArrayList<>(); 48 53 … … 60 65 for (Node n : w.getNodes()) { 61 66 if (!isPowerTower(n) && !isPowerAllowed(n) && IN_DOWNLOADED_AREA.test(n) 62 67 && (!w.isFirstLastNode(n) || !isPowerStation(n))) { 63 potentialErrors.add(TestError.builder(this, Severity.WARNING, POWER_LINES) 64 .message(tr("Missing power tower/pole within power line")) 65 .primitives(n) 66 .build()); 68 missingTowerOrPole.add(n); 67 69 } 68 70 } 69 71 } else if (w.isClosed() && isPowerStation(w)) { … … 73 75 } 74 76 75 77 @Override 78 public void visit(Node n) { 79 boolean nodeInLineOrCable = false; 80 boolean connectedToUnrelated = false; 81 for (Way parent : n.getParentWays()) { 82 if (parent.hasTag("power", "line", "minor_line", "cable")) 83 nodeInLineOrCable = true; 84 else if (!isRelatedToPower(parent)) { 85 connectedToUnrelated = true; 86 } 87 } 88 if (nodeInLineOrCable && connectedToUnrelated) 89 badConnections.add(n); 90 } 91 92 private static boolean isRelatedToPower(Way way) { 93 if (way.hasTag("power") || way.hasTag("building")) 94 return true; 95 for (OsmPrimitive ref : way.getReferrers()) { 96 if (ref instanceof Relation && ref.isMultipolygon() && (ref.hasTag("power") || ref.hasTag("building"))) { 97 for (RelationMember rm : ((Relation) ref).getMembers()) { 98 if (way == rm.getMember() && !"inner".equals(rm.getRole())) 99 return true; 100 } 101 } 102 } 103 return false; 104 } 105 106 @Override 76 107 public void visit(Relation r) { 77 108 if (r.isMultipolygon() && isPowerStation(r)) { 78 109 powerStations.add(r); … … 82 113 @Override 83 114 public void startTest(ProgressMonitor progressMonitor) { 84 115 super.startTest(progressMonitor); 85 powerStations.clear(); 86 potentialErrors.clear(); 116 clearCollections(); 87 117 } 88 118 89 119 @Override 90 120 public void endTest() { 91 for (TestError e : potentialErrors) { 92 e.primitives(Node.class) 93 .filter(n -> !isInPowerStation(n)) 94 .findAny() 95 .ifPresent(ignore -> errors.add(e)); 121 for (Node n : missingTowerOrPole) { 122 if (!isInPowerStation(n)) { 123 errors.add(TestError.builder(this, Severity.WARNING, POWER_LINES) 124 .message(tr("Missing power tower/pole within power line")) 125 .primitives(n) 126 .build()); 127 } 96 128 } 97 potentialErrors.clear(); 98 powerStations.clear(); 129 130 for (Node n : badConnections) { 131 errors.add(TestError.builder(this, Severity.WARNING, POWER_CONNECTION) 132 .message(tr("Node connects a power line or cable with an object " 133 + "which is not related to the power infrastructure (java).")) 134 .primitives(n).build()); 135 } 136 clearCollections(); 99 137 super.endTest(); 100 138 } 101 139 … … 176 214 private static boolean isBuildingIn(OsmPrimitive p, Collection<String> values) { 177 215 return p.hasTag("building", values); 178 216 } 217 218 private void clearCollections() { 219 powerStations.clear(); 220 badConnections.clear(); 221 missingTowerOrPole.clear(); 222 } 179 223 }