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