Ticket #13094: SimplifyWayAction.patch

File SimplifyWayAction.patch, 1.9 KB (added by Tyndare, 8 years ago)
  • src/org/openstreetmap/josm/actions/SimplifyWayAction.java

    diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
    a b public class SimplifyWayAction extends JosmAction {  
    135135     * in order to simplify the way.
    136136     */
    137137    protected boolean isRequiredNode(Way way, Node node) {
    138         boolean isRequired = Collections.frequency(way.getNodes(), node) > 1;
     138        int frequency = Collections.frequency(way.getNodes(), node);
     139        if ((way.getNode(0) == node) && (way.getNode(way.getNodesCount()-1) == node)) {
     140            frequency = frequency - 1; // closed way closing node counted only once
     141        }
     142        boolean isRequired = frequency > 1;
    139143        if (!isRequired) {
    140144            List<OsmPrimitive> parents = new LinkedList<>();
    141145            parents.addAll(node.getReferrers());
    public class SimplifyWayAction extends JosmAction {  
    190194            i++;
    191195        }
    192196
     197        if ((newNodes.size() > 3) && (newNodes.get(0) == newNodes.get(newNodes.size()-1))) {
     198            // Closed way, check if the first node could also be simplified ...
     199            if ( ! isRequiredNode(w, newNodes.get(0))) {
     200                List<Node> l1 = new ArrayList<>(3);
     201                l1.add(newNodes.get(newNodes.size()-2));
     202                l1.add(newNodes.get(0));
     203                l1.add(newNodes.get(1));
     204                List<Node> l2 = new ArrayList<>(3);
     205                buildSimplifiedNodeList(l1, 0, 2, threshold, l2);
     206                if ( ! l2.contains(l1.get(1))) {
     207                    newNodes.remove(0); // remove the first node
     208                    newNodes.set(newNodes.size()-1, newNodes.get(0)); // close the way
     209                }
     210            }
     211        }
     212
    193213        Set<Node> delNodes = new HashSet<>();
    194214        delNodes.addAll(w.getNodes());
    195215        delNodes.removeAll(newNodes);