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 { |
135 | 135 | * in order to simplify the way. |
136 | 136 | */ |
137 | 137 | 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; |
139 | 143 | if (!isRequired) { |
140 | 144 | List<OsmPrimitive> parents = new LinkedList<>(); |
141 | 145 | parents.addAll(node.getReferrers()); |
… |
… |
public class SimplifyWayAction extends JosmAction { |
190 | 194 | i++; |
191 | 195 | } |
192 | 196 | |
| 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 | |
193 | 213 | Set<Node> delNodes = new HashSet<>(); |
194 | 214 | delNodes.addAll(w.getNodes()); |
195 | 215 | delNodes.removeAll(newNodes); |