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    }