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 }