source: josm/trunk/src/org/openstreetmap/josm/data/validation/tests/RightAngleBuildingTest.java@ 13721

Last change on this file since 13721 was 13721, checked in by Don-vip, 6 years ago

fix #16264, see #16188, see #16189 - reduce validator false positives:

  • increase tolerance of buildings with almost right angle to 1 degree
  • detect crossing residential areas only with themselves and buildings
  • fix crossing railways messages
  • Property svn:eol-style set to native
File size: 2.9 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.actions.OrthogonalizeAction;
10import org.openstreetmap.josm.actions.OrthogonalizeAction.InvalidUserInputException;
11import org.openstreetmap.josm.data.osm.Node;
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.progress.ProgressMonitor;
17import org.openstreetmap.josm.spi.preferences.Config;
18import org.openstreetmap.josm.tools.Logging;
19import org.openstreetmap.josm.tools.Pair;
20
21/**
22 * Checks for buildings with angles close to right angle.
23 *
24 * @author marxin
25 * @since 13670
26 */
27public class RightAngleBuildingTest extends Test {
28
29 /** Maximum angle difference from right angle that is considered as invalid. */
30 protected double maxAngleDelta;
31
32 /** Minimum angle difference from right angle that is considered as invalid. */
33 protected double minAngleDelta;
34
35 /**
36 * Constructs a new {@code RightAngleBuildingTest} test.
37 */
38 public RightAngleBuildingTest() {
39 super(tr("Almost right angle buildings"),
40 tr("Checks for buildings that have angles close to right angle and are not orthogonalized."));
41 }
42
43 @Override
44 public void visit(Way w) {
45 if (!w.isUsable() || !w.isClosed() || !isBuilding(w)) return;
46
47 List<Pair<Double, Node>> angles = w.getAngles();
48 for (Pair<Double, Node> pair: angles) {
49 if (checkAngle(pair.a)) {
50 TestError.Builder builder = TestError.builder(this, Severity.WARNING, 3701)
51 .message(tr("Building with an almost square angle"))
52 .primitives(w)
53 .highlight(pair.b);
54 builder.fix(() -> {
55 try {
56 return OrthogonalizeAction.orthogonalize(Arrays.asList(w, pair.b));
57 } catch (InvalidUserInputException e) {
58 Logging.warn(e);
59 return null;
60 }
61 });
62 errors.add(builder.build());
63 return;
64 }
65 }
66 }
67
68 @Override
69 public void startTest(ProgressMonitor monitor) {
70 super.startTest(monitor);
71 maxAngleDelta = Config.getPref().getDouble("validator.RightAngleBuilding.maximumDelta", 10.0);
72 minAngleDelta = Config.getPref().getDouble("validator.RightAngleBuilding.minimumDelta", 1.0);
73 }
74
75 private boolean checkAngle(double angle) {
76 double difference = Math.abs(angle - 90);
77 return difference > minAngleDelta && difference < maxAngleDelta;
78 }
79}
Note: See TracBrowser for help on using the repository browser.