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