source: josm/trunk/src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java@ 7937

Last change on this file since 7937 was 7937, checked in by bastiK, 9 years ago

add subversion property svn:eol=native

  • Property svn:eol-style set to native
File size: 3.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.validation.tests;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.util.Arrays;
7import java.util.List;
8
9import org.openstreetmap.josm.data.osm.Node;
10import org.openstreetmap.josm.data.osm.OsmPrimitive;
11import org.openstreetmap.josm.data.osm.Relation;
12import org.openstreetmap.josm.data.osm.Way;
13import org.openstreetmap.josm.data.validation.Severity;
14import org.openstreetmap.josm.data.validation.Test;
15import org.openstreetmap.josm.data.validation.TestError;
16import org.openstreetmap.josm.gui.mappaint.ElemStyles;
17import org.openstreetmap.josm.tools.Predicates;
18import org.openstreetmap.josm.tools.Utils;
19
20/**
21 * Checks for ways connected to areas.
22 * @since 4682
23 */
24public class WayConnectedToArea extends Test {
25
26 /**
27 * Constructs a new {@code WayConnectedToArea} test.
28 */
29 public WayConnectedToArea() {
30 super(tr("Way connected to Area"), tr("Checks for ways connected to areas."));
31 }
32
33 @Override
34 public void visit(Way w) {
35 if (!w.isUsable() || w.isClosed() || !w.hasKey("highway")) {
36 return;
37 }
38
39 boolean hasway = false;
40 List<OsmPrimitive> r = w.firstNode().getReferrers();
41 for (OsmPrimitive p : r) {
42 if(p != w && p.hasKey("highway")) {
43 hasway = true;
44 break;
45 }
46 }
47 if (!hasway) {
48 for (OsmPrimitive p : r) {
49 testForError(w, w.firstNode(), p);
50 }
51 }
52 hasway = false;
53 r = w.lastNode().getReferrers();
54 for (OsmPrimitive p : r) {
55 if(p != w && p.hasKey("highway")) {
56 hasway = true;
57 break;
58 }
59 }
60 if (!hasway) {
61 for (OsmPrimitive p : r) {
62 testForError(w, w.lastNode(), p);
63 }
64 }
65 }
66
67 private void testForError(Way w, Node wayNode, OsmPrimitive p) {
68 if (wayNode.isOutsideDownloadArea()) {
69 return;
70 } else if (Utils.exists(wayNode.getReferrers(), Predicates.hasTag("route", "ferry"))) {
71 return;
72 } else if (isArea(p)) {
73 addPossibleError(w, wayNode, p, p);
74 } else {
75 for (OsmPrimitive r : p.getReferrers()) {
76 if (r instanceof Relation
77 && r.hasTag("type", "multipolygon")
78 && isArea(r)) {
79 addPossibleError(w, wayNode, p, r);
80 break;
81 }
82 }
83 }
84 }
85
86 private boolean isArea(OsmPrimitive p) {
87 return (p.hasKey("landuse") || p.hasKey("natural"))
88 && ElemStyles.hasAreaElemStyle(p, false);
89 }
90
91 private void addPossibleError(Way w, Node wayNode, OsmPrimitive p, OsmPrimitive area) {
92 // Avoid "legal" cases (see #10655)
93 if (w.hasKey("highway") && wayNode.hasTag("leisure", "slipway") && area.hasTag("natural", "water")) {
94 return;
95 }
96 errors.add(new TestError(this, Severity.WARNING,
97 tr("Way terminates on Area"), 2301,
98 Arrays.asList(w, p),
99 Arrays.asList(wayNode)));
100 }
101}
Note: See TracBrowser for help on using the repository browser.