Changeset 5312 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2012-07-01T14:27:30+02:00 (12 years 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.