Ticket #11778: 11778-alpha.patch
| File 11778-alpha.patch, 6.6 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
33 33 import org.openstreetmap.josm.data.validation.TestError; 34 34 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 35 35 import org.openstreetmap.josm.spi.preferences.Config; 36 import org.openstreetmap.josm.tools.Geometry; 36 37 37 38 /** 38 39 * Checks if a way has an endpoint very near to another way. … … 49 50 50 51 protected abstract boolean isCandidate(OsmPrimitive p); 51 52 53 /** 54 * Check if unconnected end node should be ignored. 55 * @param n the node 56 * @return true if node should be ignored 57 */ 58 protected boolean ignoreUnconnectedEndNode(Node n) { 59 return false; 60 } 61 52 62 @Override 53 63 public boolean isPrimitiveUsable(OsmPrimitive p) { 54 64 return super.isPrimitiveUsable(p) && ((partialSelection && p instanceof Node) || isCandidate(p)); … … 71 81 protected boolean isCandidate(OsmPrimitive p) { 72 82 return p.hasKey(HIGHWAY); 73 83 } 84 85 @Override 86 protected boolean ignoreUnconnectedEndNode(Node n) { 87 return n.hasTag(HIGHWAY, "turning_circle", "bus_stop") 88 || n.hasTag("amenity", "parking_entrance") 89 || n.isKeyTrue("noexit") 90 || n.hasKey("entrance", "barrier") 91 || n.getParentWays().stream().anyMatch(Test::isBuilding); 92 } 74 93 } 75 94 76 95 /** … … 87 106 88 107 @Override 89 108 protected boolean isCandidate(OsmPrimitive p) { 90 return p.has Key(RAILWAY) && !p.hasTag(RAILWAY, "abandoned");109 return p.hasTagDifferent(RAILWAY, "abandoned"); 91 110 } 111 112 @Override 113 protected boolean ignoreUnconnectedEndNode(Node n) { 114 return n.hasTag(RAILWAY, "buffer_stop"); 115 } 92 116 } 93 117 94 118 /** … … 123 147 124 148 @Override 125 149 protected boolean isCandidate(OsmPrimitive p) { 126 return p.hasKey(" natural", "landuse") && !p.hasTag("natural", "tree_row", "cliff");150 return p.hasKey("landuse") || p.hasTagDifferent("natural", "tree_row", "cliff"); 127 151 } 128 152 } 129 153 … … 199 223 dsArea = ds == null ? null : ds.getDataSourceArea(); 200 224 } 201 225 226 private boolean isMuchNearerToBuilding(Node node, double distToHighway) { 227 double fudge = 0.33 * distToHighway * (360.0d / (Ellipsoid.WGS84.a * 2 * Math.PI)); 228 double x = node.getCoor().lon(); 229 double y = node.getCoor().lat(); 230 LatLon topLeft = new LatLon(y+fudge, x-fudge); 231 LatLon botRight = new LatLon(y-fudge, x+fudge); 232 BBox bbox = new BBox(topLeft, botRight); 233 for (Node n : ds.searchNodes(bbox)) { 234 if (isBuilding(n) && node.getCoor().greatCircleDistance(n.getCoor()) < distToHighway) return true; 235 } 236 for (Way w : ds.searchWays(bbox)) { 237 if (isBuilding(w) && Geometry.getDistanceWayNode(w, node) < distToHighway) return true; 238 } 239 return false; 240 } 241 202 242 protected Map<Node, MyWaySegment> getWayEndNodesNearOtherHighway() { 203 243 Map<Node, MyWaySegment> map = new HashMap<>(); 204 244 for (MyWaySegment s : waySegments) { … … 207 247 return map; 208 248 } 209 249 for (Node en : s.nearbyNodes(mindist)) { 210 if (en.hasTag(HIGHWAY, "turning_circle", "bus_stop")211 || en.hasTag("amenity", "parking_entrance")212 || en.hasTag(RAILWAY, "buffer_stop")213 || en.isKeyTrue("noexit")214 || en.hasKey("entrance", "barrier")) {215 continue;216 }217 250 // to handle intersections of 't' shapes and similar 218 if (!en.isConnectedTo(s.w.getNodes(), 3 /* hops */, null)) { 251 if (!en.isConnectedTo(s.w.getNodes(), 1 /* hops */, null)) { 252 if (isHighwayTest && s.w.hasTag(HIGHWAY, "service", "footway", "steps", "path") 253 && isMuchNearerToBuilding(en, s.getDist(en))) { 254 continue; 255 } 219 256 addIfNewOrCloser(map, en, s); 220 257 } 221 258 } … … 232 269 } 233 270 if (!s.concernsArea) { 234 271 for (Node en : s.nearbyNodes(mindist)) { 235 if (!en.isConnectedTo(s.w.getNodes(), 3/* hops */, null)) {272 if (!en.isConnectedTo(s.w.getNodes(), 1 /* hops */, null)) { 236 273 addIfNewOrCloser(map, en, s); 237 274 } 238 275 } … … 249 286 return map; 250 287 } 251 288 for (Node en : s.nearbyNodes(minmiddledist)) { 252 if (!en.isConnectedTo(s.w.getNodes(), 3/* hops */, null)) {289 if (!en.isConnectedTo(s.w.getNodes(), 1 /* hops */, null)) { 253 290 addIfNewOrCloser(map, en, s); 254 291 } 255 292 } … … 291 328 292 329 for (Way w : ds.getWays()) { 293 330 if (w.isUsable() && isCandidate(w) && w.getRealNodesCount() > 1 294 // don't complain about highways ending near platforms331 // don't complain about highways or railways ending near platforms 295 332 && !w.hasTag(HIGHWAY, "platform") && !w.hasTag(RAILWAY, "platform", "platform_edge") 296 333 ) { 297 334 waySegments.addAll(getWaySegments(w)); … … 299 336 addNode(w.lastNode(), endnodes); 300 337 } 301 338 } 302 searchNodes = new QuadBuckets<>(); 303 searchNodes.addAll(endnodes); 304 if (isHighwayTest) { 305 addErrors(Severity.WARNING, getWayEndNodesNearOtherHighway(), tr("Way end node near other highway")); 306 } else { 307 addErrors(Severity.WARNING, getWayEndNodesNearOtherWay(), tr("Way end node near other way")); 339 endnodes.removeIf(this::ignoreUnconnectedEndNode); 340 if (!endnodes.isEmpty()) { 341 searchNodes = new QuadBuckets<>(); 342 searchNodes.addAll(endnodes); 343 if (isHighwayTest) { 344 addErrors(Severity.WARNING, getWayEndNodesNearOtherHighway(), tr("Way end node near other highway")); 345 } else { 346 addErrors(Severity.WARNING, getWayEndNodesNearOtherWay(), tr("Way end node near other way")); 347 } 308 348 } 309 349 310 350 /* the following two use a shorter distance */
