001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.io.session; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.io.File; 007import java.io.IOException; 008import java.util.ArrayList; 009import java.util.Date; 010import java.util.List; 011 012import org.openstreetmap.josm.Main; 013import org.openstreetmap.josm.data.coor.LatLon; 014import org.openstreetmap.josm.gui.layer.GpxLayer; 015import org.openstreetmap.josm.gui.layer.Layer; 016import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; 017import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry; 018import org.openstreetmap.josm.gui.progress.ProgressMonitor; 019import org.openstreetmap.josm.io.IllegalDataException; 020import org.w3c.dom.Element; 021import org.w3c.dom.Node; 022import org.w3c.dom.NodeList; 023 024/** 025 * Session importer for {@link GeoImageLayer}. 026 * @since 5505 027 */ 028public class GeoImageSessionImporter implements SessionLayerImporter { 029 030 @Override 031 public Layer load(Element elem, SessionReader.ImportSupport support, ProgressMonitor progressMonitor) 032 throws IOException, IllegalDataException { 033 String version = elem.getAttribute("version"); 034 if (!"0.1".equals(version)) { 035 throw new IllegalDataException(tr("Version ''{0}'' of meta data for geoimage layer is not supported. Expected: 0.1", version)); 036 } 037 038 List<ImageEntry> entries = new ArrayList<>(); 039 NodeList imgNodes = elem.getChildNodes(); 040 boolean useThumbs = false; 041 for (int i = 0; i < imgNodes.getLength(); ++i) { 042 Node imgNode = imgNodes.item(i); 043 if (imgNode.getNodeType() == Node.ELEMENT_NODE) { 044 Element imgElem = (Element) imgNode; 045 if ("geoimage".equals(imgElem.getTagName())) { 046 ImageEntry entry = new ImageEntry(); 047 NodeList attrNodes = imgElem.getChildNodes(); 048 for (int j = 0; j < attrNodes.getLength(); ++j) { 049 Node attrNode = attrNodes.item(j); 050 if (attrNode.getNodeType() == Node.ELEMENT_NODE) { 051 Element attrElem = (Element) attrNode; 052 try { 053 switch(attrElem.getTagName()) { 054 case "file": 055 entry.setFile(new File(attrElem.getTextContent())); 056 break; 057 case "position": 058 double lat = Double.parseDouble(attrElem.getAttribute("lat")); 059 double lon = Double.parseDouble(attrElem.getAttribute("lon")); 060 entry.setPos(new LatLon(lat, lon)); 061 break; 062 case "speed": 063 entry.setSpeed(Double.valueOf(attrElem.getTextContent())); 064 break; 065 case "elevation": 066 entry.setElevation(Double.valueOf(attrElem.getTextContent())); 067 break; 068 case "gps-time": 069 entry.setGpsTime(new Date(Long.parseLong(attrElem.getTextContent()))); 070 break; 071 case "exif-orientation": 072 entry.setExifOrientation(Integer.valueOf(attrElem.getTextContent())); 073 break; 074 case "exif-time": 075 entry.setExifTime(new Date(Long.parseLong(attrElem.getTextContent()))); 076 break; 077 case "exif-gps-time": 078 entry.setExifGpsTime(new Date(Long.parseLong(attrElem.getTextContent()))); 079 break; 080 case "exif-coordinates": 081 entry.setExifCoor(new LatLon( 082 Double.parseDouble(attrElem.getAttribute("lat")), 083 Double.parseDouble(attrElem.getAttribute("lon")))); 084 break; 085 case "exif-image-direction": 086 entry.setExifImgDir(Double.parseDouble(attrElem.getTextContent())); 087 break; 088 case "is-new-gps-data": 089 if (Boolean.parseBoolean(attrElem.getTextContent())) { 090 entry.flagNewGpsData(); 091 } 092 } 093 // TODO: handle thumbnail loading 094 } catch (NumberFormatException e) { 095 // do nothing 096 if (Main.isTraceEnabled()) { 097 Main.trace(e.getMessage()); 098 } 099 } 100 } 101 } 102 entries.add(entry); 103 } else if ("show-thumbnails".equals(imgElem.getTagName())) { 104 useThumbs = Boolean.parseBoolean(imgElem.getTextContent()); 105 } 106 } 107 } 108 109 GpxLayer gpxLayer = null; 110 List<SessionReader.LayerDependency> deps = support.getLayerDependencies(); 111 if (!deps.isEmpty()) { 112 Layer layer = deps.get(0).getLayer(); 113 if (layer instanceof GpxLayer) { 114 gpxLayer = (GpxLayer) layer; 115 } 116 } 117 118 return new GeoImageLayer(entries, gpxLayer, useThumbs); 119 } 120}