Ticket #16261: 0001-Implement-check-for-buildings-sharing-nodes-with-res.patch

File 0001-Implement-check-for-buildings-sharing-nodes-with-res.patch, 4.8 KB (added by anonymous, 8 years ago)
  • src/org/openstreetmap/josm/data/validation/OsmValidator.java

    From a26a0c0074b79aed918678be8cd09691fc2206ab Mon Sep 17 00:00:00 2001
    From: marxin <mliska@suse.cz>
    Date: Sun, 4 Mar 2018 14:14:31 +0100
    Subject: [PATCH] Implement check for buildings sharing nodes with res. area or
     ways.
    
    ---
     .../josm/data/validation/OsmValidator.java         |  2 +
     .../validation/tests/BuildingSharingPointWith.java | 91 ++++++++++++++++++++++
     2 files changed, 93 insertions(+)
     create mode 100644 src/org/openstreetmap/josm/data/validation/tests/BuildingSharingPointWith.java
    
    diff --git a/src/org/openstreetmap/josm/data/validation/OsmValidator.java b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
    index 4cf70c621..4c1def5ff 100644
    a b import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;  
    3333import org.openstreetmap.josm.data.validation.tests.Addresses;
    3434import org.openstreetmap.josm.data.validation.tests.ApiCapabilitiesTest;
    3535import org.openstreetmap.josm.data.validation.tests.BarriersEntrances;
     36import org.openstreetmap.josm.data.validation.tests.BuildingSharingPointWith;
    3637import org.openstreetmap.josm.data.validation.tests.Coastlines;
    3738import org.openstreetmap.josm.data.validation.tests.ConditionalKeys;
    3839import org.openstreetmap.josm.data.validation.tests.CrossingWays;
    public final class OsmValidator {  
    141142        LongSegment.class, // 3500 .. 3599
    142143        PublicTransportRouteTest.class, // 3600 .. 3699
    143144        RightAngleBuildingTest.class, // 3700 .. 3799
     145        BuildingSharingPointWith.class, // 3800 .. 3899
    144146    };
    145147
    146148    /**
  • new file src/org/openstreetmap/josm/data/validation/tests/BuildingSharingPointWith.java

    diff --git a/src/org/openstreetmap/josm/data/validation/tests/BuildingSharingPointWith.java b/src/org/openstreetmap/josm/data/validation/tests/BuildingSharingPointWith.java
    new file mode 100644
    index 000000000..f4c0bb821
    - +  
     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.HashSet;
     7import java.util.List;
     8import java.util.Set;
     9
     10import org.openstreetmap.josm.data.osm.Node;
     11import org.openstreetmap.josm.data.osm.OsmPrimitive;
     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;
     17
     18/**
     19 * Checks for buildings that have a points shared with a different objec
     20 */
     21public class BuildingSharingPointWith extends Test {
     22    static final String HIGHWAY = "highway";
     23
     24    private Set<Way> visitedWays;
     25
     26    /**
     27     * Constructs a new {@code BuildingSharingPointWith} test.
     28     */
     29    public BuildingSharingPointWith() {
     30        super(tr("Building sharing points"), tr("Checks for building nodes being shared."));
     31    }
     32
     33    @Override
     34    public void visit(Way w) {
     35        if (!w.isUsable() || !w.isClosed() || !isBuilding(w)) return;
     36
     37        visitedWays.add(w);
     38
     39        Set<OsmPrimitive> visitedPrimitives = new HashSet<>();
     40        for (Node n: w.getNodes()) {
     41            List<OsmPrimitive> r = n.getReferrers();
     42
     43            for (OsmPrimitive p : r) {
     44                if (p != w && !visitedWays.contains(p)
     45                        && !visitedPrimitives.contains(p)
     46                        && isConflictCandidate(p))
     47                {
     48                    addError(w, p, n);
     49                    visitedPrimitives.add(p);
     50                }
     51            }
     52        }
     53    }
     54
     55    @Override
     56    public void startTest(ProgressMonitor monitor) {
     57        super.startTest(monitor);
     58
     59        visitedWays = new HashSet<>();
     60    }
     61
     62    @Override
     63    public void endTest() {
     64        super.endTest();
     65
     66        visitedWays = null;
     67    }
     68
     69    private boolean isConflictCandidate(OsmPrimitive p) {
     70      return isBuilding(p) || isResidentialArea(p) || p.hasTag(HIGHWAY);
     71    }
     72
     73    private String getMessage(OsmPrimitive p) {
     74      if (isBuilding(p))
     75        return tr("Building sharing point with a building");
     76      else if(isResidentialArea(p))
     77        return tr("Building sharing point with a residential area");
     78      else if (p.hasTag(HIGHWAY))
     79        return tr("Building sharing point with a highway");
     80      else
     81        throw new IllegalArgumentException();
     82    }
     83
     84    private void addError(Way building, OsmPrimitive conflicting, Node sharedPoint) {
     85        errors.add(TestError.builder(this, Severity.WARNING, 3801)
     86                .message(getMessage(conflicting))
     87                .primitives(building, sharedPoint)
     88                .highlight(building)
     89                .build());
     90    }
     91}