source: josm/trunk/src/org/openstreetmap/josm/io/session/GeoImageSessionImporter.java@ 19050

Last change on this file since 19050 was 19050, checked in by taylor.smock, 4 weeks ago

Revert most var changes from r19048, fix most new compile warnings and checkstyle issues

Also, document why various ErrorProne checks were originally disabled and fix
generic SonarLint issues.

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io.session;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.File;
7import java.io.IOException;
8import java.time.Instant;
9import java.util.ArrayList;
10import java.util.List;
11
12import org.openstreetmap.josm.data.coor.LatLon;
13import org.openstreetmap.josm.data.gpx.GpxImageEntry;
14import org.openstreetmap.josm.gui.layer.GpxLayer;
15import org.openstreetmap.josm.gui.layer.Layer;
16import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
17import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry;
18import org.openstreetmap.josm.gui.progress.ProgressMonitor;
19import org.openstreetmap.josm.io.IllegalDataException;
20import org.openstreetmap.josm.tools.Logging;
21import org.w3c.dom.Element;
22import org.w3c.dom.Node;
23import org.w3c.dom.NodeList;
24
25/**
26 * Session importer for {@link GeoImageLayer}.
27 * @since 5505
28 */
29public class GeoImageSessionImporter implements SessionLayerImporter {
30
31 @Override
32 public Layer load(Element elem, SessionReader.ImportSupport support, ProgressMonitor progressMonitor)
33 throws IOException, IllegalDataException {
34 String version = elem.getAttribute("version");
35 if (!"0.1".equals(version)) {
36 throw new IllegalDataException(tr("Version ''{0}'' of meta data for geoimage layer is not supported. Expected: 0.1", version));
37 }
38
39 List<ImageEntry> entries = new ArrayList<>();
40 NodeList imgNodes = elem.getChildNodes();
41 boolean useThumbs = false;
42 for (int i = 0; i < imgNodes.getLength(); ++i) {
43 Node imgNode = imgNodes.item(i);
44 if (imgNode.getNodeType() == Node.ELEMENT_NODE) {
45 Element imgElem = (Element) imgNode;
46 if ("geoimage".equals(imgElem.getTagName())) {
47 ImageEntry entry = new ImageEntry();
48 NodeList attrNodes = imgElem.getChildNodes();
49 for (int j = 0; j < attrNodes.getLength(); ++j) {
50 Node attrNode = attrNodes.item(j);
51 if (attrNode.getNodeType() == Node.ELEMENT_NODE) {
52 handleElement(entry, (Element) attrNode);
53 }
54 }
55 entries.add(entry);
56 } else if ("show-thumbnails".equals(imgElem.getTagName())) {
57 useThumbs = Boolean.parseBoolean(imgElem.getTextContent());
58 }
59 }
60 }
61
62 GpxLayer gpxLayer = null;
63 List<SessionReader.LayerDependency> deps = support.getLayerDependencies();
64 if (!deps.isEmpty()) {
65 Layer layer = deps.get(0).getLayer();
66 if (layer instanceof GpxLayer) {
67 gpxLayer = (GpxLayer) layer;
68 }
69 }
70
71 return new GeoImageLayer(entries, gpxLayer, useThumbs);
72 }
73
74 private static void handleElement(GpxImageEntry entry, Element attrElem) {
75 try {
76 switch (attrElem.getTagName()) {
77 case "file":
78 entry.setFile(new File(attrElem.getTextContent()));
79 break;
80 case "position":
81 double lat = Double.parseDouble(attrElem.getAttribute("lat"));
82 double lon = Double.parseDouble(attrElem.getAttribute("lon"));
83 entry.setPos(new LatLon(lat, lon));
84 break;
85 case "speed":
86 entry.setSpeed(Double.valueOf(attrElem.getTextContent()));
87 break;
88 case "elevation":
89 entry.setElevation(Double.valueOf(attrElem.getTextContent()));
90 break;
91 case "gps-time":
92 entry.setGpsTime(Instant.ofEpochMilli(Long.parseLong(attrElem.getTextContent())));
93 break;
94 case "exif-orientation":
95 entry.setExifOrientation(Integer.valueOf(attrElem.getTextContent()));
96 break;
97 case "exif-time":
98 entry.setExifTime(Instant.ofEpochMilli(Long.parseLong(attrElem.getTextContent())));
99 break;
100 case "exif-gps-time":
101 entry.setExifGpsTime(Instant.ofEpochMilli(Long.parseLong(attrElem.getTextContent())));
102 break;
103 case "exif-coordinates":
104 entry.setExifCoor(new LatLon(
105 Double.parseDouble(attrElem.getAttribute("lat")),
106 Double.parseDouble(attrElem.getAttribute("lon"))));
107 break;
108 case "exif-image-direction":
109 entry.setExifImgDir(Double.valueOf(attrElem.getTextContent()));
110 break;
111 case "is-new-gps-data":
112 if (Boolean.parseBoolean(attrElem.getTextContent())) {
113 entry.flagNewGpsData();
114 }
115 break;
116 default: // Do nothing
117 }
118 // TODO: handle thumbnail loading
119 } catch (NumberFormatException e) {
120 Logging.trace(e);
121 }
122 }
123}
Note: See TracBrowser for help on using the repository browser.