Changeset 18384 in osm


Ignore:
Timestamp:
2009-10-31T02:26:30+01:00 (15 years ago)
Author:
daeron
Message:

Don't complain about unconnected coastline if the end of the way is outside the downloaded area

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/validator/src/org/openstreetmap/josm/plugins/validator/tests/Coastlines.java

    r18194 r18384  
    33import static org.openstreetmap.josm.tools.I18n.tr;
    44
     5import java.awt.geom.Area;
    56import java.awt.geom.Point2D;
    67import java.util.*;
    78
     9import org.openstreetmap.josm.Main;
    810import org.openstreetmap.josm.command.ChangeCommand;
    911import org.openstreetmap.josm.command.Command;
     
    1113import org.openstreetmap.josm.data.osm.Node;
    1214import org.openstreetmap.josm.data.osm.Way;
     15import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1316import org.openstreetmap.josm.plugins.validator.Severity;
    1417import org.openstreetmap.josm.plugins.validator.Test;
     
    2730
    2831    private boolean fixable = false;
    29    
     32
    3033    /**
    3134     * Constructor
     
    3841
    3942    @Override
    40     public void visit(Way w)
     43    public void visit(Way way)
    4144    {
    42         if(!w.isUsable() || w.isClosed())
     45        if(!way.isUsable() || way.isClosed())
    4346            return;
    4447
    45         String natural = w.get("natural");
     48        String natural = way.get("natural");
    4649        if(natural == null || !natural.equals("coastline"))
    4750            return;
    4851
    49         Node f = w.firstNode();
    50         Node l = w.lastNode();
    51         Way prev = null;
    52         Way next = null;
     52        Node firstNode = way.firstNode();
     53        Node lastNode = way.lastNode();
     54        Way previousWay = null;
     55        Way nextWay = null;
    5356
    54         for (OsmPrimitive parent: this.backreferenceDataSet.getParents(f)) {
     57        for (OsmPrimitive parent: this.backreferenceDataSet.getParents(firstNode)) {
    5558            natural = parent.get("natural");
    56             if (parent instanceof Way && !w.equals(parent) && (natural != null && "coastline".equals(natural))) {
    57                 prev = (Way)parent;
     59            if (parent instanceof Way && !way.equals(parent) && (natural != null && "coastline".equals(natural))) {
     60                previousWay = (Way)parent;
    5861                break;
    5962            }
    6063        }
    61         for (OsmPrimitive parent: this.backreferenceDataSet.getParents(l)) {
     64        for (OsmPrimitive parent: this.backreferenceDataSet.getParents(lastNode)) {
    6265            natural = parent.get("natural");
    63             if (parent instanceof Way && !w.equals(parent) && (natural != null && "coastline".equals(natural))) {
    64                 next = (Way)parent;
     66            if (parent instanceof Way && !way.equals(parent) && (natural != null && "coastline".equals(natural))) {
     67                nextWay = (Way)parent;
    6568                break;
    6669            }
     
    6972        List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>();
    7073        List<OsmPrimitive> highlight = new ArrayList<OsmPrimitive>();
    71         primitives.add(w);
     74        primitives.add(way);
    7275
    73         if (prev == null || next == null) {
    74             if (prev == null)
    75                 highlight.add(f);
    76             if (next == null)
    77                 highlight.add(l);
     76        OsmDataLayer layer = Main.map.mapView.getEditLayer();
     77        Area downloadedArea = null;
     78        if (layer != null)
     79            downloadedArea = layer.data.getDataSourceArea();
    7880
    79             errors.add(new TestError(this, Severity.ERROR, tr("Unconnected coastline"),
    80                                      UNCONNECTED_COASTLINE, primitives, highlight));
     81        if (previousWay == null || nextWay == null) {
     82            boolean firstNodeUnconnected = false;
     83            boolean lastNodeUnconnected = false;
     84
     85            if (previousWay == null && (downloadedArea == null || downloadedArea.contains(firstNode.getCoor()))) {
     86                firstNodeUnconnected = true;
     87                highlight.add(firstNode);
     88            }
     89            if (nextWay == null && (downloadedArea == null || downloadedArea.contains(lastNode.getCoor()))) {
     90                lastNodeUnconnected = true;
     91                highlight.add(lastNode);
     92            }
     93
     94            if (firstNodeUnconnected || lastNodeUnconnected)
     95                errors.add(new TestError(this, Severity.ERROR, tr("Unconnected coastline"),
     96                                         UNCONNECTED_COASTLINE, primitives, highlight));
    8197        }
    8298
    83         boolean fuo = (prev != null && !f.equals(prev.lastNode()));
    84         boolean luo = (next != null && !l.equals(next.firstNode()));
     99        boolean firstNodeUnordered = (previousWay != null && !firstNode.equals(previousWay.lastNode()));
     100        boolean lastNodeUnordered = (nextWay != null && !lastNode.equals(nextWay.firstNode()));
    85101
    86         if (fuo || luo) {
    87             if (fuo && luo) {
     102        if (firstNodeUnordered || lastNodeUnordered) {
     103            if (firstNodeUnordered && lastNodeUnordered && !previousWay.equals(nextWay)) {
    88104                errors.add(new TestError(this, Severity.ERROR, tr("Reversed coastline"),
    89105                                         REVERSED_COASTLINE, primitives));
    90106
    91107            } else {
    92                 if (fuo)
    93                     highlight.add(f);
    94                 if (luo)
    95                     highlight.add(l);
     108                if (firstNodeUnordered)
     109                    highlight.add(firstNode);
     110                if (lastNodeUnordered)
     111                    highlight.add(lastNode);
    96112
    97113                errors.add(new TestError(this, Severity.ERROR, tr("Unordered coastline"),
     
    104120    public Command fixError(TestError testError) {
    105121        if (isFixable(testError)) {
    106             Way w = (Way) testError.getPrimitives().iterator().next();
    107             Way wnew = new Way(w);
     122            Way way = (Way) testError.getPrimitives().iterator().next();
     123            Way newWay = new Way(way);
    108124
    109             List<Node> nodesCopy = wnew.getNodes();
     125            List<Node> nodesCopy = newWay.getNodes();
    110126            Collections.reverse(nodesCopy);
    111             wnew.setNodes(nodesCopy);
     127            newWay.setNodes(nodesCopy);
    112128
    113             return new ChangeCommand(w, wnew);
     129            return new ChangeCommand(way, newWay);
    114130        }
    115131
Note: See TracChangeset for help on using the changeset viewer.