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

Last change on this file since 12846 was 12846, checked in by bastiK, 7 years ago

see #15229 - use Config.getPref() wherever possible

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