Changeset 15873 in josm


Ignore:
Timestamp:
2020-02-17T11:39:42+01:00 (5 years ago)
Author:
GerdP
Message:

fix #9911: Join areas internal error

  • Correct detection and deduplication of nodes with same position
  • Add command to remove the detected duplicated nodes if they have no tags and no referrers
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java

    r15854 r15873  
    2020import java.util.Set;
    2121import java.util.TreeMap;
     22import java.util.stream.Collectors;
    2223
    2324import javax.swing.JOptionPane;
     
    641642        if (removedDuplicates) {
    642643            hasChanges = true;
     644            Set<Node> oldNodes = new LinkedHashSet<>();
     645            allStartingWays.forEach(w -> oldNodes.addAll(w.getNodes()));
    643646            commitCommands(marktr("Removed duplicate nodes"));
     647            // remove now unconnected nodes without tags
     648            List<Node> toRemove = oldNodes.stream().filter(
     649                    n -> (n.isNew() || !n.isOutsideDownloadArea()) && !n.hasKeys() && n.getReferrers().isEmpty())
     650                    .collect(Collectors.toList());
     651            if (!toRemove.isEmpty()) {
     652                cmds.add(new DeleteCommand(toRemove));
     653                commitCommands("Removed  nodes");
     654            }
    644655        }
    645656
     
    761772
    762773    /**
    763      * This method removes duplicate points (if any) from the input way.
     774     * This method removes duplicate points (if any) from the input ways.
    764775     * @param ways the ways to process
    765776     * @return {@code true} if any changes where made
    766777     */
    767778    private boolean removeDuplicateNodes(List<Way> ways) {
    768         //TODO: maybe join nodes with JoinNodesAction, rather than reconnect the ways.
    769 
    770779        Map<Node, Node> nodeMap = new TreeMap<>(new NodePositionComparator());
    771         int totalNodesRemoved = 0;
     780        int totalWaysModified = 0;
    772781
    773782        for (Way way : ways) {
     
    776785            }
    777786
    778             int nodesRemoved = 0;
    779787            List<Node> newNodes = new ArrayList<>();
    780788            Node prevNode = null;
     789            boolean modifyWay = false;
    781790
    782791            for (Node node : way.getNodes()) {
    783                 if (!nodeMap.containsKey(node)) {
     792                Node representator = nodeMap.get(node);
     793                if (representator == null) {
    784794                    //new node
    785795                    nodeMap.put(node, node);
    786 
    787                     //avoid duplicate nodes
    788                     if (prevNode != node) {
    789                         newNodes.add(node);
    790                     } else {
    791                         nodesRemoved++;
    792                     }
     796                    representator = node;
    793797                } else {
    794798                    //node with same coordinates already exists, substitute with existing node
    795                     Node representator = nodeMap.get(node);
    796 
    797799                    if (representator != node) {
    798                         nodesRemoved++;
     800                        modifyWay = true;
    799801                    }
    800 
    801                     //avoid duplicate node
    802                     if (prevNode != representator) {
    803                         newNodes.add(representator);
    804                     }
    805                 }
    806                 prevNode = node;
    807             }
    808 
    809             if (nodesRemoved > 0) {
     802                }
     803                //avoid duplicate node
     804                if (prevNode != representator) {
     805                    newNodes.add(representator);
     806                    prevNode = representator;
     807                } else {
     808                    modifyWay = true;
     809                }
     810            }
     811
     812            if (modifyWay) {
    810813
    811814                if (newNodes.size() == 1) { //all nodes in the same coordinate - add one more node, to have closed way.
     
    816819                newWay.setNodes(newNodes);
    817820                cmds.add(new ChangeCommand(way, newWay));
    818                 totalNodesRemoved += nodesRemoved;
    819             }
    820         }
    821 
    822         return totalNodesRemoved > 0;
     821                ++totalWaysModified;
     822            }
     823        }
     824        return totalWaysModified > 0;
    823825    }
    824826
Note: See TracChangeset for help on using the changeset viewer.