Ticket #4656: 4656.patch

File 4656.patch, 4.9 KB (added by simon04, 15 years ago)
  • new file src/org/openstreetmap/josm/data/validation/tests/BuildingInBuilding.java

    diff --git a/src/org/openstreetmap/josm/data/validation/tests/BuildingInBuilding.java b/src/org/openstreetmap/josm/data/validation/tests/BuildingInBuilding.java
    new file mode 100644
    index 0000000..9ff776a
    - +  
     1package org.openstreetmap.josm.data.validation.tests;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
     4
     5import java.util.Collection;
     6import java.util.LinkedList;
     7import java.util.List;
     8import org.openstreetmap.josm.data.osm.Node;
     9import org.openstreetmap.josm.data.osm.OsmPrimitive;
     10import org.openstreetmap.josm.data.osm.QuadBuckets;
     11import org.openstreetmap.josm.data.osm.Way;
     12import org.openstreetmap.josm.data.validation.Severity;
     13import org.openstreetmap.josm.data.validation.Test;
     14import org.openstreetmap.josm.data.validation.TestError;
     15import org.openstreetmap.josm.tools.FilteredCollection;
     16import org.openstreetmap.josm.tools.Geometry;
     17import org.openstreetmap.josm.tools.Predicate;
     18
     19public class BuildingInBuilding extends Test {
     20
     21    protected static int BUILDING_INSIDE_BUILDING = 2001;
     22    protected List<OsmPrimitive> primitivesToCheck = new LinkedList<OsmPrimitive>();
     23    protected QuadBuckets<Way> index = new QuadBuckets<Way>();
     24
     25    public BuildingInBuilding() {
     26        super(tr("Building inside building"));
     27    }
     28
     29    @Override
     30    public void visit(Node n) {
     31        if (n.isUsable() && isBuilding(n)) {
     32            primitivesToCheck.add(n);
     33        }
     34    }
     35
     36    @Override
     37    public void visit(Way w) {
     38        if (w.isUsable() && w.isClosed() && isBuilding(w)) {
     39            primitivesToCheck.add(w);
     40            index.add(w);
     41        }
     42    }
     43
     44    private static boolean isInPolygon(Node n, List<Node> polygon) {
     45        return Geometry.nodeInsidePolygon(n, polygon);
     46    }
     47
     48    private static boolean isInPolygon(Way w, List<Node> polygon) {
     49        for (Node n : w.getNodes()) {
     50            if (!isInPolygon(n, polygon)) {
     51                return false;
     52            }
     53        }
     54        return true;
     55    }
     56
     57    @Override
     58    public void endTest() {
     59        for (final OsmPrimitive p : primitivesToCheck) {
     60            Collection<Way> outer = index.search(p.getBBox());
     61            outer = new FilteredCollection<Way>(outer, new Predicate<Way>() {
     62
     63                @Override
     64                public boolean evaluate(Way object) {
     65                    if (p.equals(object)) {
     66                        return false;
     67                    } else if (p instanceof Node) {
     68                        return isInPolygon((Node) p, object.getNodes()) || object.getNodes().contains((Node) p);
     69                    } else if (p instanceof Way) {
     70                        return isInPolygon((Way) p, object.getNodes());
     71                    } else {
     72                        return false;
     73                    }
     74                }
     75            });
     76            if (!outer.isEmpty()) {
     77                errors.add(new TestError(this, Severity.WARNING,
     78                        tr("Building inside building"), BUILDING_INSIDE_BUILDING, p));
     79            }
     80        }
     81    }
     82
     83    private static boolean isBuilding(OsmPrimitive p) {
     84        return "yes".equals(p.get("building"));
     85    }
     86}
  • src/org/openstreetmap/josm/data/osm/QuadBuckets.java

    diff --git a/src/org/openstreetmap/josm/data/osm/QuadBuckets.java b/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
    index d9781c2..8ebcecf 100644
    a b public class QuadBuckets<T extends OsmPrimitive> implements Collection<T>  
    526526        return true;
    527527    }
    528528
    529     public void unsupported()
    530     {
    531         System.out.println("unsupported operation");
    532         throw new UnsupportedOperationException();
    533     }
    534529    public boolean retainAll(Collection<?> objects)
    535530    {
    536531        for (T o : this) {
  • src/org/openstreetmap/josm/data/validation/OsmValidator.java

    diff --git a/src/org/openstreetmap/josm/data/validation/OsmValidator.java b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
    index 7817efe..6c6885e 100644
    a b import org.openstreetmap.josm.actions.ValidateAction;  
    2525import org.openstreetmap.josm.data.projection.Epsg4326;
    2626import org.openstreetmap.josm.data.projection.Lambert;
    2727import org.openstreetmap.josm.data.projection.Mercator;
     28import org.openstreetmap.josm.data.validation.tests.BuildingInBuilding;
    2829import org.openstreetmap.josm.data.validation.tests.Coastlines;
    2930import org.openstreetmap.josm.data.validation.tests.CrossingWays;
    3031import org.openstreetmap.josm.data.validation.tests.DuplicateNode;
    public class OsmValidator implements LayerChangeListener {  
    9596        RelationChecker.class, // ID  1701 ..  1799
    9697        TurnrestrictionTest.class, // ID  1801 ..  1899
    9798        DuplicateRelation.class, // ID 1901 .. 1999
     99        BuildingInBuilding.class, // ID 2001 .. 2099
    98100    };
    99101
    100102    public OsmValidator() {