6a7
> import java.util.Collection;
151a153
>         List<Node> nodePool = null;
164c166
<             //Main.main.getCurrentDataSet().setSelected(m_wayOld);
---
>                         tempWay = new Way(s_oWayOld);
166c168
<             tempWay = new Way(s_oWayOld);
---
>             //The following code fragment is based on the utilsplugin2 plugin code  (ReplaceGeometryUtils.java)
168,169c170,178
<             for (i = 0; i < newWay.getNodesCount(); i++) {
<                 tempWay.addNode(tempWay.getNodesCount(), newWay.getNode(i));
---
>             nodePool = getUnimportantNodes(tempWay);
> 
>             System.out.println("nodePool: "+nodePool.size());
> 
>             List<Node> geometryPool = new LinkedList<>();
>             for (Node node : newWay.getNodes()) {
>                 if(!geometryPool.contains(node)) {
>                     geometryPool.add(node);
>                 }
171c180,181
<             i++;
---
>             
>             // We remove all old nodes
175,180c185,215
<             //cmds.add(new ChangeCommand(m_wayOld, tempWay));
<             for (i = 0; i < s_oWayOld.getNodesCount() - 1; i++) {
<                 Node n = s_oWayOld.getNode(i);
<                 List<Way> ways = getWaysOfNode(n);
<                 if (ways.size() <= 1) {
<                     cmds2.add(new DeleteCommand(s_oWayOld.getNode(i)));
---
> 
>             Map<Node, Node> nodeAssoc = new HashMap<>();
>             if (geometryPool.size() > 0 && nodePool.size() > 0) {
>                 for (Node n : geometryPool) {
>                     Node nearest = findNearestNode(n, nodePool);
>                     if (nearest != null) {
>                         nodeAssoc.put(n, nearest);
>                         nodePool.remove(nearest);
>                     }
>                 }
>             }
> 
>             // And prepare a list of nodes with all the replacements
>             List<Node> geometryNodes = newWay.getNodes();
>             for (i = 0; i < geometryNodes.size(); i++) {
>                 if (nodeAssoc.containsKey(geometryNodes.get(i)))
>                     geometryNodes.set(i, nodeAssoc.get(geometryNodes.get(i)));
>             }
>             
>             // Move old nodes to new positions
>             for (Node node : nodeAssoc.keySet()) {
>                 cmds.add(new MoveCommand(nodeAssoc.get(node), node.getCoor()));
>             }
> 
>             tempWay.setNodes(geometryNodes);
> 
>             // our new way has less nodes than old way
>             if (!nodePool.isEmpty()){
>                 for(Node d: nodePool){
>                     // don't use nodePool nodes in connectTo(), mergeNodes(), trySplitWayByAnyNodes() etc.
>                     d.setDeleted(true);
182d216
<                 s_oNodes.remove(s_oWayOld.getNode(i));
183a218
> 
188c223
<         DataSet ds = MainApplication.getLayerManager().getEditDataSet();
---
>         DataSet ds = MainApplication.getLayerManager().getEditDataSet();        
217a253,261
> 
>         // our new way has less nodes than old way
>         if (nodePool != null && !nodePool.isEmpty()){
>             for(Node nd: nodePool){
>                 nd.setDeleted(false);
>             }
>             cmds2.add(new DeleteCommand(nodePool));
>         }
> 
221c265
<         oTracerDebug.OutputCommands(cmds);
---
>         //oTracerDebug.OutputCommands(cmds);
495c539,586
< }
\ Brak znaku nowej linii na końcu pliku
---
>     /**
>      * Create a list of nodes that are not used anywhere except in the way.
>      */
>     // plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java
>     protected static List<Node> getUnimportantNodes(Way way) {
>         List<Node> nodePool = new LinkedList<>();
>         for (Node n : way.getNodes()) {
>             List<OsmPrimitive> referrers = n.getReferrers();
>             if (!n.isDeleted() && referrers.size() == 1 && referrers.get(0).equals(way)
>                     && !hasInterestingKey(n) && !nodePool.contains(n)) {
>                 nodePool.add(n);
>             }
>         }
>         return nodePool;
>     }
> 
>     // plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java
>     protected static boolean hasInterestingKey(OsmPrimitive object) {
>         for (String key : object.getKeys().keySet()) {
>             if (!OsmPrimitive.isUninterestingKey(key)) {
>                 return true;
>             }
>         }
>         return false;
>     }
> 
>     // plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java
>     protected static Node findNearestNode(Node node, Collection<Node> nodes) {
>         if (nodes.contains(node))
>             return node;
> 
>         Node nearest = null;
>         // TODO: use meters instead of degrees, but do it fast
>         double distance = 1;
>         LatLon coor = node.getCoor();
> 
>         for (Node n : nodes) {
>             double d = n.getCoor().distance(coor);
>             if (d < distance) {
>                 distance = d;
>                 nearest = n;
>             }
>         }
>         return nearest;
>     }
> 
> 
> }
