001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.layer.gpx; 003 004import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005import static org.openstreetmap.josm.tools.I18n.tr; 006 007import java.awt.GridBagLayout; 008import java.awt.event.ActionEvent; 009import java.util.ArrayList; 010import java.util.List; 011 012import javax.swing.AbstractAction; 013import javax.swing.JLabel; 014import javax.swing.JOptionPane; 015import javax.swing.JPanel; 016 017import org.openstreetmap.josm.Main; 018import org.openstreetmap.josm.data.gpx.GpxConstants; 019import org.openstreetmap.josm.data.gpx.GpxTrack; 020import org.openstreetmap.josm.data.gpx.GpxTrackSegment; 021import org.openstreetmap.josm.data.gpx.WayPoint; 022import org.openstreetmap.josm.data.osm.DataSet; 023import org.openstreetmap.josm.data.osm.Node; 024import org.openstreetmap.josm.data.osm.Way; 025import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil; 026import org.openstreetmap.josm.gui.layer.GpxLayer; 027import org.openstreetmap.josm.gui.layer.OsmDataLayer; 028import org.openstreetmap.josm.gui.widgets.UrlLabel; 029import org.openstreetmap.josm.tools.GBC; 030import org.openstreetmap.josm.tools.ImageProvider; 031import org.openstreetmap.josm.tools.date.DateUtils; 032 033public class ConvertToDataLayerAction extends AbstractAction { 034 private final GpxLayer layer; 035 036 public ConvertToDataLayerAction(final GpxLayer layer) { 037 super(tr("Convert to data layer"), ImageProvider.get("converttoosm")); 038 this.layer = layer; 039 putValue("help", ht("/Action/ConvertToDataLayer")); 040 } 041 042 @Override 043 public void actionPerformed(ActionEvent e) { 044 JPanel msg = new JPanel(new GridBagLayout()); 045 msg.add(new JLabel(tr("<html>Upload of unprocessed GPS data as map data is considered harmful.<br>If you want to upload traces, look here:</html>")), GBC.eol()); 046 msg.add(new UrlLabel(Main.getOSMWebsite() + "/traces", 2), GBC.eop()); 047 if (!ConditionalOptionPaneUtil.showConfirmationDialog("convert_to_data", Main.parent, msg, tr("Warning"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, JOptionPane.OK_OPTION)) { 048 return; 049 } 050 DataSet ds = new DataSet(); 051 for (GpxTrack trk : layer.data.tracks) { 052 for (GpxTrackSegment segment : trk.getSegments()) { 053 List<Node> nodes = new ArrayList<>(); 054 for (WayPoint p : segment.getWayPoints()) { 055 Node n = new Node(p.getCoor()); 056 String timestr = p.getString(GpxConstants.PT_TIME); 057 if (timestr != null) { 058 n.setTimestamp(DateUtils.fromString(timestr)); 059 } 060 ds.addPrimitive(n); 061 nodes.add(n); 062 } 063 Way w = new Way(); 064 w.setNodes(nodes); 065 ds.addPrimitive(w); 066 } 067 } 068 Main.main.addLayer(new OsmDataLayer(ds, tr("Converted from: {0}", layer.getName()), layer.getAssociatedFile())); 069 Main.main.removeLayer(layer); 070 } 071}