Ticket #19833: 19833.patch

File 19833.patch, 1.7 KB (added by GerdP, 6 years ago)

filter duplicated nodes before creating an OSM way

  • src/org/openstreetmap/josm/io/GeoJSONReader.java

     
    1010import java.io.InputStreamReader;
    1111import java.io.StringReader;
    1212import java.nio.charset.StandardCharsets;
     13import java.util.ArrayList;
    1314import java.util.List;
    1415import java.util.Map;
    1516import java.util.Objects;
     
    294295        final boolean doAutoclose;
    295296        if (size > 1) {
    296297            if (latlons.get(0).equals(latlons.get(size - 1))) {
    297                 // Remove last coordinate, but later add first node to the end
    298                 latlons.remove(size - 1);
    299                 doAutoclose = true;
     298                doAutoclose = false; // already closed
    300299            } else {
    301300                doAutoclose = autoClose;
    302301            }
     
    306305
    307306        final Way way = new Way();
    308307        getDataSet().addPrimitive(way);
    309         way.setNodes(latlons.stream().map(this::createNode).collect(Collectors.toList()));
     308        final List<Node> rawNodes = latlons.stream().map(this::createNode).collect(Collectors.toList());
    310309        if (doAutoclose) {
    311             way.addNode(way.getNode(0));
     310            rawNodes.add(rawNodes.get(0));
    312311        }
     312        // see #19833: remove duplicated references to the same node
     313        final List<Node> wayNodes = new ArrayList<>(rawNodes.size());
     314        Node last = null;
     315        for (Node curr : rawNodes) {
     316            if (last != curr)
     317                wayNodes.add(curr);
     318            last = curr;
     319        }
     320        way.setNodes(wayNodes);
    313321
    314322        return Optional.of(way);
    315323    }