Ignore:
Timestamp:
28.12.2011 22:51:11 (5 months ago)
Author:
Don-vip
Message:

see #7034 - building inside building false positives

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/validation/tests/BuildingInBuilding.java

    r4409 r4738  
    66import java.util.LinkedList; 
    77import java.util.List; 
     8 
     9import org.openstreetmap.josm.data.coor.LatLon; 
    810import org.openstreetmap.josm.data.osm.Node; 
    911import org.openstreetmap.josm.data.osm.OsmPrimitive; 
     
    4648    } 
    4749 
     50    /** 
     51     * Return true if w is in polygon. 
     52     */ 
    4853    private static boolean isInPolygon(Way w, List<Node> polygon) { 
     54        // Check that all nodes of w are in polygon 
    4955        for (Node n : w.getNodes()) { 
    5056            if (!isInPolygon(n, polygon)) { 
     57                return false; 
     58            } 
     59        } 
     60        // All nodes can be inside polygon and still, w outside: 
     61        //            +-------------+ 
     62        //           /|             | 
     63        //          / |             | 
     64        //         /  |             | 
     65        //        / w |             | 
     66        //  +----+----+             | 
     67        //  |       polygon         | 
     68        //  |_______________________| 
     69        // 
     70        for (int i=0; i<w.getNodesCount(); i++) { 
     71            LatLon center = null; 
     72            if (i > 0) { 
     73                center = w.getNode(i).getCoor().getCenter(w.getNode(i-1).getCoor()); 
     74            } else if (w.isClosed()) { 
     75                center = w.getNode(i).getCoor().getCenter(w.getNode(w.getNodesCount()-2).getCoor()); 
     76            } 
     77            if (center != null && !isInPolygon(new Node(center), polygon)) { 
    5178                return false; 
    5279            } 
     
    6693                        return false; 
    6794                    } else if (p instanceof Node) { 
    68                         return isInPolygon((Node) p, object.getNodes()) || object.getNodes().contains((Node) p); 
     95                        return isInPolygon((Node) p, object.getNodes()) || object.getNodes().contains(p); 
    6996                    } else if (p instanceof Way) { 
    7097                        return isInPolygon((Way) p, object.getNodes()); 
Note: See TracChangeset for help on using the changeset viewer.