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<ImageEntry>(); 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 (imgElem.getTagName().equals("geoimage")) { 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 if (attrElem.getTagName().equals("file")) { 048 entry.setFile(new File(attrElem.getTextContent())); 049 } else if (attrElem.getTagName().equals("position")) { 050 double lat = Double.parseDouble(attrElem.getAttribute("lat")); 051 double lon = Double.parseDouble(attrElem.getAttribute("lon")); 052 entry.setPos(new LatLon(lat, lon)); 053 } else if (attrElem.getTagName().equals("speed")) { 054 entry.setSpeed(Double.parseDouble(attrElem.getTextContent())); 055 } else if (attrElem.getTagName().equals("elevation")) { 056 entry.setElevation(Double.parseDouble(attrElem.getTextContent())); 057 } else if (attrElem.getTagName().equals("gps-time")) { 058 entry.setGpsTime(new Date(Long.parseLong(attrElem.getTextContent()))); 059 } else if (attrElem.getTagName().equals("exif-orientation")) { 060 entry.setExifOrientation(Integer.parseInt(attrElem.getTextContent())); 061 } else if (attrElem.getTagName().equals("exif-time")) { 062 entry.setExifTime(new Date(Long.parseLong(attrElem.getTextContent()))); 063 } else if (attrElem.getTagName().equals("exif-gps-time")) { 064 entry.setExifGpsTime(new Date(Long.parseLong(attrElem.getTextContent()))); 065 } else if (attrElem.getTagName().equals("exif-coordinates")) { 066 double lat = Double.parseDouble(attrElem.getAttribute("lat")); 067 double lon = Double.parseDouble(attrElem.getAttribute("lon")); 068 entry.setExifCoor(new LatLon(lat, lon)); 069 } else if (attrElem.getTagName().equals("exif-image-direction")) { 070 entry.setExifImgDir(Double.parseDouble(attrElem.getTextContent())); 071 } else if (attrElem.getTagName().equals("is-new-gps-data") && Boolean.parseBoolean(attrElem.getTextContent())) { 072 entry.flagNewGpsData(); 073 } 074 // TODO: handle thumbnail loading 075 } catch (NumberFormatException e) { 076 // nothing 077 } 078 } 079 } 080 entries.add(entry); 081 } else if (imgElem.getTagName().equals("show-thumbnails")) { 082 useThumbs = Boolean.parseBoolean(imgElem.getTextContent()); 083 } 084 } 085 } 086 087 GpxLayer gpxLayer = null; 088 List<SessionReader.LayerDependency> deps = support.getLayerDependencies(); 089 if (!deps.isEmpty()) { 090 Layer layer = deps.iterator().next().getLayer(); 091 if (layer instanceof GpxLayer) { 092 gpxLayer = (GpxLayer) layer; 093 } 094 } 095 096 return new GeoImageLayer(entries, gpxLayer, useThumbs); 097 } 098 099}