Changeset 5312 in josm


Ignore:
Timestamp:
Jul 1, 2012 2:27:30 PM (11 months ago)
Author:
Don-vip
Message:

fix #7812 - validator: power lines test improvements (no warning for start/end, node with power infrastructure tags, node inside power facilities)

File:
1 edited

Legend:

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

    r5300 r5312  
    44import static org.openstreetmap.josm.tools.I18n.tr; 
    55 
     6import java.util.ArrayList; 
     7import java.util.Arrays; 
     8import java.util.Collection; 
    69import java.util.HashMap; 
     10import java.util.List; 
    711import java.util.Map; 
    812 
     13import org.openstreetmap.josm.Main; 
    914import org.openstreetmap.josm.command.ChangePropertyCommand; 
    1015import org.openstreetmap.josm.command.Command; 
    1116import org.openstreetmap.josm.data.osm.Node; 
     17import org.openstreetmap.josm.data.osm.OsmPrimitive; 
     18import org.openstreetmap.josm.data.osm.Relation; 
    1219import org.openstreetmap.josm.data.osm.Way; 
     20import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon; 
     21import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay; 
     22import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache; 
    1323import org.openstreetmap.josm.data.validation.Severity; 
    1424import org.openstreetmap.josm.data.validation.Test; 
    1525import org.openstreetmap.josm.data.validation.TestError; 
     26import org.openstreetmap.josm.tools.Geometry; 
    1627 
    1728public class PowerLines extends Test { 
     
    1930    protected static final int POWER_LINES = 2501; 
    2031     
    21     protected Map<Way, String> towerPoleTagMap = new HashMap<Way, String>(); 
     32    public static final Collection<String> POWER_LINE_TAGS = Arrays.asList("line", "minor_line"); 
     33    public static final Collection<String> POWER_TOWER_TAGS = Arrays.asList("tower", "pole"); 
     34    public static final Collection<String> POWER_STATION_TAGS = Arrays.asList("station", "sub_station", "plant", "generator"); 
     35    public static final Collection<String> POWER_ALLOWED_TAGS = Arrays.asList("switch", "transformer", "busbar", "generator"); 
    2236     
     37    protected final Map<Way, String> towerPoleTagMap = new HashMap<Way, String>(); 
     38     
     39    protected final List<PowerLineError> potentialErrors = new ArrayList<PowerLineError>(); 
     40 
     41    protected final List<OsmPrimitive> powerStations = new ArrayList<OsmPrimitive>(); 
     42 
    2343    public PowerLines() { 
    2444        super(tr("Power lines"), tr("Checks for nodes in power lines that do not have a power=tower/pole tag.")); 
     
    2747    @Override 
    2848    public void visit(Way w) { 
    29         if (w.isUsable() && isPowerLine(w)) { 
    30             String fixValue = null; 
    31             boolean erroneous = false; 
    32             boolean canFix = false; 
    33             for (Node n : w.getNodes()) { 
    34                 if (!isPowerTower(n)) { 
    35                     errors.add(new PowerLineError(n, w)); 
    36                     erroneous = true; 
    37                 } else if (fixValue == null) { 
    38                     // First tower/pole tag found, remember it 
    39                     fixValue = n.get("power"); 
    40                     canFix = true; 
    41                 } else if (!fixValue.equals(n.get("power"))) { 
    42                     // The power line contains both "tower" and "pole" -> cannot fix this error 
    43                     canFix = false; 
     49        if (w.isUsable()) { 
     50            if (isPowerLine(w)) { 
     51                String fixValue = null; 
     52                boolean erroneous = false; 
     53                boolean canFix = false; 
     54                for (Node n : w.getNodes()) { 
     55                    if (!isPowerTower(n)) { 
     56                        if (!w.isFirstLastNode(n) && !isPowerAllowed(n)) { 
     57                            potentialErrors.add(new PowerLineError(n, w)); 
     58                            erroneous = true; 
     59                        } 
     60                    } else if (fixValue == null) { 
     61                        // First tower/pole tag found, remember it 
     62                        fixValue = n.get("power"); 
     63                        canFix = true; 
     64                    } else if (!fixValue.equals(n.get("power"))) { 
     65                        // The power line contains both "tower" and "pole" -> cannot fix this error 
     66                        canFix = false; 
     67                    } 
     68                } 
     69                if (erroneous && canFix) { 
     70                    towerPoleTagMap.put(w, fixValue); 
     71                } 
     72            } else if (w.isClosed() && isPowerStation(w)) { 
     73                powerStations.add(w); 
     74            } 
     75        } 
     76    } 
     77     
     78    @Override 
     79    public void visit(Relation r) { 
     80        if (r.isMultipolygon() && isPowerStation(r)) { 
     81            powerStations.add(r); 
     82        } 
     83    }     
     84 
     85    @Override 
     86    public void endTest() { 
     87        for (PowerLineError e : potentialErrors) { 
     88            if (!isInPowerStation(e.getNode())) { 
     89                errors.add(e); 
     90            } 
     91        } 
     92        super.endTest(); 
     93    } 
     94     
     95    protected final boolean isInPowerStation(Node n) { 
     96        for (OsmPrimitive station : powerStations) { 
     97            List<List<Node>> nodesLists = new ArrayList<List<Node>>(); 
     98            if (station instanceof Way) { 
     99                nodesLists.add(((Way)station).getNodes()); 
     100            } else if (station instanceof Relation) { 
     101                Multipolygon polygon = MultipolygonCache.getInstance().get(Main.map.mapView, (Relation) station); 
     102                if (polygon != null) { 
     103                    for (JoinedWay outer : Multipolygon.joinWays(polygon.getOuterWays())) { 
     104                        nodesLists.add(outer.getNodes()); 
     105                    } 
    44106                } 
    45107            } 
    46             if (erroneous && canFix) { 
    47                 towerPoleTagMap.put(w, fixValue); 
     108            for (List<Node> nodes : nodesLists) { 
     109                if (Geometry.nodeInsidePolygon(n, nodes)) { 
     110                    return true; 
     111                } 
    48112            } 
    49113        } 
     114        return false; 
    50115    } 
    51116 
     
    71136     */ 
    72137    protected static final boolean isPowerLine(Way w) { 
    73         String v = w.get("power"); 
    74         return v != null && (v.equals("line") || v.equals("minor_line")); 
     138        return isPowerIn(w, POWER_LINE_TAGS); 
     139    } 
     140 
     141    /** 
     142     * Determines if the specified primitive denotes a power station. 
     143     * @param w The way to be tested 
     144     * @return True if power key is set and equal to station/sub_station/plant 
     145     */ 
     146    protected static final boolean isPowerStation(OsmPrimitive p) { 
     147        return isPowerIn(p, POWER_STATION_TAGS); 
    75148    } 
    76149 
     
    81154     */ 
    82155    protected static final boolean isPowerTower(Node n) { 
    83         String v = n.get("power"); 
    84         return v != null && (v.equals("tower") || v.equals("pole")); 
     156        return isPowerIn(n, POWER_TOWER_TAGS); 
     157    } 
     158     
     159    /** 
     160     * Determines if the specified node denotes a power infrastructure allowed on a power line. 
     161     * @param w The node to be tested 
     162     * @return True if power key is set and equal to switch/tranformer/busbar/generator 
     163     */ 
     164    protected static final boolean isPowerAllowed(Node n) { 
     165        return isPowerIn(n, POWER_ALLOWED_TAGS); 
     166    } 
     167     
     168    private static final boolean isPowerIn(OsmPrimitive p, Collection<String> values) { 
     169        String v = p.get("power"); 
     170        return v != null && values != null && values.contains(v); 
    85171    } 
    86172     
     
    92178            this.line = line; 
    93179        } 
     180        public final Node getNode() { 
     181            return (Node) getPrimitives().iterator().next(); 
     182        } 
    94183    } 
    95184} 
Note: See TracChangeset for help on using the changeset viewer.