source: josm/trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java @ 12841

Last change on this file since 12841 was 12841, checked in by bastiK, 3 months ago

see #15229 - fix deprecations caused by [12840]

  • Property svn:eol-style set to native
File size: 6.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.gpx;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.GridBagLayout;
8import java.awt.event.ActionEvent;
9import java.io.File;
10import java.util.ArrayList;
11import java.util.Arrays;
12import java.util.Collection;
13import java.util.Iterator;
14import java.util.List;
15import java.util.Optional;
16
17import javax.swing.AbstractAction;
18import javax.swing.JLabel;
19import javax.swing.JOptionPane;
20import javax.swing.JPanel;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.data.gpx.GpxConstants;
24import org.openstreetmap.josm.data.gpx.GpxTrack;
25import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
26import org.openstreetmap.josm.data.gpx.WayPoint;
27import org.openstreetmap.josm.data.osm.DataSet;
28import org.openstreetmap.josm.data.osm.Node;
29import org.openstreetmap.josm.data.osm.Way;
30import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
31import org.openstreetmap.josm.gui.MainApplication;
32import org.openstreetmap.josm.gui.layer.GpxLayer;
33import org.openstreetmap.josm.gui.layer.Layer;
34import org.openstreetmap.josm.gui.layer.OsmDataLayer;
35import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
36import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
37import org.openstreetmap.josm.gui.widgets.UrlLabel;
38import org.openstreetmap.josm.tools.GBC;
39import org.openstreetmap.josm.tools.ImageProvider;
40import org.openstreetmap.josm.tools.Logging;
41import org.openstreetmap.josm.tools.UncheckedParseException;
42import org.openstreetmap.josm.tools.date.DateUtils;
43
44/**
45 * An abstract action for a conversion from a {@code T} {@link Layer} to a {@link OsmDataLayer}.
46 * @param <T> the source layer class
47 */
48public abstract class ConvertToDataLayerAction<T extends Layer> extends AbstractAction {
49    /** source layer */
50    protected final transient T layer;
51
52    /**
53     * Constructs a new {@code ConvertToDataLayerAction}
54     * @param layer source layer
55     */
56    protected ConvertToDataLayerAction(final T layer) {
57        super(tr("Convert to data layer"), ImageProvider.get("converttoosm"));
58        this.layer = layer;
59        putValue("help", ht("/Action/ConvertToDataLayer"));
60    }
61
62    /**
63     * Converts a {@link GpxLayer} to a {@link OsmDataLayer}.
64     */
65    public static class FromGpxLayer extends ConvertToDataLayerAction<GpxLayer> {
66
67        /**
68         * Creates a new {@code FromGpxLayer}.
69         * @param layer the source layer
70         */
71        public FromGpxLayer(GpxLayer layer) {
72            super(layer);
73        }
74
75        @Override
76        public DataSet convert() {
77            final DataSet ds = new DataSet();
78            for (GpxTrack trk : layer.data.getTracks()) {
79                for (GpxTrackSegment segment : trk.getSegments()) {
80                    List<Node> nodes = new ArrayList<>();
81                    for (WayPoint p : segment.getWayPoints()) {
82                        Node n = new Node(p.getCoor());
83                        String timestr = p.getString(GpxConstants.PT_TIME);
84                        if (timestr != null) {
85                            try {
86                                n.setTimestamp(DateUtils.fromString(timestr));
87                            } catch (UncheckedParseException e) {
88                                Logging.log(Logging.LEVEL_WARN, e);
89                            }
90                        }
91                        ds.addPrimitive(n);
92                        nodes.add(n);
93                    }
94                    Way w = new Way();
95                    w.setNodes(nodes);
96                    ds.addPrimitive(w);
97                }
98            }
99            return ds;
100        }
101    }
102
103    /**
104     * Converts a {@link MarkerLayer} to a {@link OsmDataLayer}.
105     */
106    public static class FromMarkerLayer extends ConvertToDataLayerAction<MarkerLayer> {
107
108        /**
109         * Converts a {@link MarkerLayer} to a {@link OsmDataLayer}.
110         * @param layer marker layer
111         */
112        public FromMarkerLayer(MarkerLayer layer) {
113            super(layer);
114        }
115
116        @Override
117        public DataSet convert() {
118            final DataSet ds = new DataSet();
119            for (Marker marker : layer.data) {
120                final Node node = new Node(marker.getCoor());
121                final Collection<String> mapping = Main.pref.getList("gpx.to-osm-mapping", Arrays.asList(
122                        GpxConstants.GPX_NAME, "name",
123                        GpxConstants.GPX_DESC, "description",
124                        GpxConstants.GPX_CMT, "note",
125                        GpxConstants.GPX_SRC, "source",
126                        GpxConstants.PT_SYM, "gpxicon"));
127                if (mapping.size() % 2 == 0) {
128                    final Iterator<String> it = mapping.iterator();
129                    while (it.hasNext()) {
130                        final String gpxKey = it.next();
131                        final String osmKey = it.next();
132                        Optional.ofNullable(marker.getTemplateValue(gpxKey, false))
133                                .map(String::valueOf)
134                                .ifPresent(s -> node.put(osmKey, s));
135                    }
136                } else {
137                    Logging.warn("Invalid gpx.to-osm-mapping Einstein setting: expecting even number of entries");
138                }
139                ds.addPrimitive(node);
140            }
141            return ds;
142        }
143    }
144
145    /**
146     * Performs the conversion to a {@link DataSet}.
147     * @return the resulting dataset
148     */
149    public abstract DataSet convert();
150
151    @Override
152    public void actionPerformed(ActionEvent e) {
153        JPanel msg = new JPanel(new GridBagLayout());
154        msg.add(new JLabel(
155                tr("<html>Upload of unprocessed GPS data as map data is considered harmful.<br>"
156                        + "If you want to upload traces, look here:</html>")),
157                GBC.eol());
158        msg.add(new UrlLabel(Main.getOSMWebsite() + "/traces", 2), GBC.eop());
159        if (!ConditionalOptionPaneUtil.showConfirmationDialog("convert_to_data", Main.parent, msg, tr("Warning"),
160                JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, JOptionPane.OK_OPTION)) {
161            return;
162        }
163        final DataSet ds = convert();
164        final OsmDataLayer osmLayer = new OsmDataLayer(ds, tr("Converted from: {0}", layer.getName()), null);
165        if (layer.getAssociatedFile() != null) {
166            osmLayer.setAssociatedFile(new File(layer.getAssociatedFile().getParentFile(), layer.getAssociatedFile().getName() + ".osm"));
167        }
168        osmLayer.setUploadDiscouraged(true);
169        MainApplication.getLayerManager().addLayer(osmLayer);
170        MainApplication.getLayerManager().removeLayer(layer);
171    }
172}
Note: See TracBrowser for help on using the repository browser.