Hello all,

I have created a new button in the relation editor to download incomplete members of a relation from server.
It is useful to edit big relations and find holes in relations.

In the attachment you find the diff for RelationEditor.java and a new class.
OsmServerObjectReader.java downloads single objects from osm server

Best regards
Christian Malolepszy

Index: org/openstreetmap/josm/gui/dialogs/RelationEditor.java
===================================================================
--- org/openstreetmap/josm/gui/dialogs/RelationEditor.java      (revision 645)
+++ org/openstreetmap/josm/gui/dialogs/RelationEditor.java      (working copy)
@@ -12,6 +12,7 @@
 import java.awt.event.KeyEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Map.Entry;
 
@@ -31,12 +32,16 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.io.OsmServerObjectReader;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.xml.sax.SAXException;
 
 /**
  * This dialog is for editing relations.
@@ -237,6 +242,14 @@
                                Main.ds.setSelected(sel);
                        }
                }));
+               buttonPanel.add(createButton(marktr("Download Members"),"down", 
tr("Download all incomplete ways and nodes in relation"), KeyEvent.VK_L, new 
ActionListener() {
+                       public void actionPerformed(ActionEvent e) {
+                               downloadRelationMembers();
+                               refreshTables();
+                       }                       
+               }));
+               
+               
                bothTables.add(buttonPanel, GBC.eop().fill(GBC.HORIZONTAL));
 
                tabPane.add(bothTables, "Basic");
@@ -284,4 +297,27 @@
                }
                refreshTables();
        }
+       private void downloadRelationMembers() {
+               OsmServerObjectReader reader = new OsmServerObjectReader();
+               OsmDataLayer layer = null;
+        for (RelationMember member : clone.members)
+        {
+               if (member.member.incomplete){          
+                       try {
+                               DataSet dataSet = 
reader.parseOsm(member.member.id, OsmServerObjectReader.TYPE_WAY, true);
+                               if (dataSet != null)
+                               {
+                                       layer = new OsmDataLayer(dataSet, 
tr("Data Layer"), null);
+                                       Main.main.editLayer().mergeFrom(layer);
+                               }
+                       } catch (SAXException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       } catch (IOException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       }
+               }
+        }
+    }
 }
// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.io;

import static org.openstreetmap.josm.tools.I18n.tr;

import java.io.IOException;
import java.io.InputStream;

import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.DataSet;
import org.xml.sax.SAXException;

public class OsmServerObjectReader extends OsmServerReader {
        
         public final static  String TYPE_WAY = "way";
         public final static  String TYPE_REL = "relation";
         public final static  String TYPE_NODE = "node";
         
         /**
          * Method to download single Objects from OSM server. ways, relations, 
nodes
          * @param id  Object ID
          * @param type  way node relation
          * @param full download with or without child objects
          * @return
          * @throws SAXException
          * @throws IOException
          */
         public DataSet parseOsm(long id,String type, boolean full ) throws 
SAXException, IOException {
                try {
                        
                                Main.pleaseWaitDlg.progress.setValue(0);
                        Main.pleaseWaitDlg.currentAction.setText(tr("Contacting 
OSM Server..."));
                        StringBuffer sb = new StringBuffer();
                        sb.append(type);
                        sb.append("/");
                        sb.append(id);
                        if (full)
                        {
                                sb.append("/full");
                        }
                        
                        final InputStream in = getInputStream(sb.toString(), 
Main.pleaseWaitDlg);
                        if (in == null)
                                return null;
                        
Main.pleaseWaitDlg.currentAction.setText(tr("Downloading OSM data..."));
                        final DataSet data = OsmReader.parseDataSet(in, null, 
Main.pleaseWaitDlg);
//                      String origin = 
Main.pref.get("osm-server.url")+"/"+Main.pref.get("osm-server.version", "0.5");
//                      Bounds bounds = new Bounds(new LatLon(lat1, lon1), new 
LatLon(lat2, lon2));
//                              DataSource src = new DataSource(bounds, origin);
//                      data.dataSources.add(src);
                        in.close();
                        activeConnection = null;
                        return data;
                } catch (IOException e) {
                        if (cancel)
                                return null;
                        throw e;
                } catch (SAXException e) {
                        throw e;
                } catch (Exception e) {
                        if (cancel)
                                return null;
                        if (e instanceof RuntimeException)
                                throw (RuntimeException)e;
                        throw new RuntimeException(e);
                }
            }

}
_______________________________________________
josm-dev mailing list
[email protected]
http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/josm-dev

Reply via email to