Changeset 6574 in josm


Ignore:
Timestamp:
2013-12-31T11:34:53+01:00 (6 years ago)
Author:
simon04
Message:

fix #4959 - Validator: check and fix ways with duplicate way segments

For instance, a way with nodes 0 2 4 2 4 6 is fixed to 0 2 4 6.

File:
1 edited

Legend:

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

    r6494 r6574  
    66import java.util.ArrayList;
    77import java.util.Collection;
     8import java.util.Collections;
     9import java.util.Comparator;
    810import java.util.HashMap;
    911import java.util.List;
    1012import java.util.Map;
    1113import java.util.Set;
    12 
     14import java.util.TreeSet;
     15
     16import org.openstreetmap.josm.command.ChangeNodesCommand;
     17import org.openstreetmap.josm.command.Command;
    1318import org.openstreetmap.josm.data.osm.Node;
    1419import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    1722import org.openstreetmap.josm.data.osm.Way;
    1823import org.openstreetmap.josm.data.osm.WaySegment;
     24import org.openstreetmap.josm.data.validation.FixableTestError;
    1925import org.openstreetmap.josm.data.validation.Severity;
    2026import org.openstreetmap.josm.data.validation.Test;
     
    4147    protected static final int OVERLAPPING_WAY_AREA = 113;
    4248    protected static final int OVERLAPPING_AREA = 120;
     49    protected static final int DUPLICATE_WAY_SEGMENT = 121;
    4350
    4451    /** Constructor */
     
    146153    }
    147154
     155    public static Command fixDuplicateWaySegment(Way w) {
     156        // test for ticket #4959
     157        Set<WaySegment> segments = new TreeSet<WaySegment>(new Comparator<WaySegment>() {
     158            @Override
     159            public int compare(WaySegment o1, WaySegment o2) {
     160                return o1.way.getNode(o1.lowerIndex).compareTo(o2.way.getNode(o2.lowerIndex));
     161            }
     162        });
     163        final Set<Integer> wayNodesToFix = new TreeSet<Integer>(Collections.reverseOrder());
     164        for (int i = 0; i < w.getNodesCount() - 1; i++) {
     165            final boolean wasInSet = !segments.add(new WaySegment(w, i));
     166            if (wasInSet) {
     167                wayNodesToFix.add(i);
     168            }
     169        }
     170        if (!wayNodesToFix.isEmpty()) {
     171            final List<Node> newNodes = new ArrayList<Node>(w.getNodes());
     172            for (final int i : wayNodesToFix) {
     173                newNodes.remove(i);
     174            }
     175            return new ChangeNodesCommand(w, newNodes);
     176        } else {
     177            return null;
     178        }
     179    }
     180
    148181    @Override
    149182    public void visit(Way w) {
     183
     184        final Command duplicateWaySegmentFix = fixDuplicateWaySegment(w);
     185        if (duplicateWaySegmentFix != null) {
     186            errors.add(new FixableTestError(this, Severity.ERROR, tr("Way contains segment twice"),
     187                    DUPLICATE_WAY_SEGMENT, w, duplicateWaySegmentFix));
     188            return;
     189        }
     190
    150191        Node lastN = null;
    151192        int i = -2;
Note: See TracChangeset for help on using the changeset viewer.