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