On Sat, May 15, 2010 at 11:30:01PM +0200, Sebastian Klein wrote:
> Sure, if you donate a camera, I'll fully implement it. ;)
> 
> Seriously, there is a lot to do and we cannot add each extension that is 
> used by a single hardware model. But it's a damn cool feature. 
> Hopefully, there will be other vendors and models supporting this!

Don't tell anyone i touched java - I have something rudimentary working
which draws a little triangle arrow below the camera icon when activating it 
e.g. clicking on the picture icon - It does only so when there is a
GPS Image Direction tag in the exif header. I had no clue about java but
someone might hint me through some design/style issues ... Especially
i think there is some overhead in the exception reading the exif tags as
this 

        +            Metadata metadata = 
JpegMetadataReader.readMetadata(e.getFile());
        +            Directory directory = 
metadata.getDirectory(GpsDirectory.class);

is called twice ... Probably unnecessary ....

Here is a small screenshot how it will look:

http://silicon-verl.de/home/flo/tmp/screenshot-josm3260-imgdir1.png


diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java 
b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
index eb56404..28a06b3 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
@@ -467,9 +468,36 @@ public class GeoImageLayer extends Layer implements 
PropertyChangeListener {
                     g.setColor(new Color(128, 0, 0, 122));
                     g.fillRect(p.x - d.width / 2, p.y - d.height / 2, d.width, 
d.height);
                 } else {
+                       if (e.getExifImgDir() != null) {
+                               double arrowlength = 25;
+                               double arrowwidth = 18;
+
+                               double dir = e.getExifImgDir();
+                               // Rotate 90° CCW 
+                               double headdir = ( dir < 90 ) ? dir + 270 : dir 
- 90;
+                               double leftdir = ( headdir < 90 ) ? headdir + 
270 : headdir - 90;
+                               double rightdir = ( headdir > 270 ) ? headdir - 
270 : headdir + 90;
+
+                               double ptx = p.x + 
Math.cos(Math.toRadians(headdir)) * arrowlength;
+                               double pty = p.y + 
Math.sin(Math.toRadians(headdir)) * arrowlength;
+
+                               double ltx = p.x + 
Math.cos(Math.toRadians(leftdir)) * arrowwidth/2;
+                               double lty = p.y + 
Math.sin(Math.toRadians(leftdir)) * arrowwidth/2;
+
+                               double rtx = p.x + 
Math.cos(Math.toRadians(rightdir)) * arrowwidth/2;
+                               double rty = p.y + 
Math.sin(Math.toRadians(rightdir)) * arrowwidth/2;
+
+                               g.setColor(Color.white);
+                               int[] xar = {(int) ltx, (int) ptx, (int) rtx, 
(int) ltx};
+                               int[] yar = {(int) lty, (int) pty, (int) rty, 
(int) lty};
+                               g.fillPolygon(xar, yar, 4);
+                       }
+
                     selectedIcon.paintIcon(mv, g,
                             p.x - selectedIcon.getIconWidth() / 2,
                             p.y - selectedIcon.getIconHeight() / 2);
+
+                 
                 }
             }
         }
@@ -536,6 +564,15 @@ public class GeoImageLayer extends Layer implements 
PropertyChangeListener {
             e.setExifCoor(null);
             e.setPos(null);
         }
+
+       try {
+            Metadata metadata = JpegMetadataReader.readMetadata(e.getFile());
+            Directory directory = metadata.getDirectory(GpsDirectory.class);
+            Rational direction = 
directory.getRational(GpsDirectory.TAG_GPS_IMG_DIRECTION);
+
+           e.setExifImgDir(direction.doubleValue());
+       } catch (CompoundException p) {
+       }
     }
 
     public void showNextPhoto() {
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java 
b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
index 2b199e9..a73297a 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
@@ -19,6 +19,7 @@ import org.openstreetmap.josm.data.coor.LatLon;
 final public class ImageEntry implements Comparable<ImageEntry>, Cloneable {
     private File file;
     private LatLon exifCoor;
+    private Double exifImgDir;
     private Date exifTime;
     Image thumbnail;
 
@@ -77,6 +78,10 @@ final public class ImageEntry implements 
Comparable<ImageEntry>, Cloneable {
     LatLon getExifCoor() {
         return exifCoor;
     }
+    public Double getExifImgDir() {
+       return exifImgDir;
+    }
+
     /**
      * setter methods
      */
@@ -104,6 +109,9 @@ final public class ImageEntry implements 
Comparable<ImageEntry>, Cloneable {
     void setExifCoor(LatLon exifCoor) {
         this.exifCoor = exifCoor;
     }
+    void setExifImgDir(double exifDir) {
+        this.exifImgDir = exifDir;
+    } 
 
     @Override
     public ImageEntry clone() {
diff --git 
a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java 
b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
index 02db2d6..7d99186 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
@@ -238,6 +238,9 @@ public class ImageViewerDialog extends ToggleDialog {
             if (entry.getSpeed() != null) {
                 osd.append(tr("\n{0} km/h", Math.round(entry.getSpeed())));
             }
+           if (entry.getExifImgDir() != null) {
+                osd.append(tr("\nDirection {0}°", 
Math.round(entry.getExifImgDir())));
+           }
             //if (entry.getPos()  != null) {
             //    osd.append(tr("\nlat: {0}, lon: {1}", 
Double.toString(entry.getPos().lat()), Double.toString(entry.getPos().lon())));
             //}

Flo
-- 
Florian Lohoff                                                 f...@zz.de
"Es ist ein grobes Missverständnis und eine Fehlwahrnehmung, dem Staat
im Internet Zensur- und Überwachungsabsichten zu unterstellen."
- - Bundesminister Dr. Wolfgang Schäuble -- 10. Juli in Berlin 

Attachment: signature.asc
Description: Digital signature

_______________________________________________
josm-dev mailing list
josm-dev@openstreetmap.org
http://lists.openstreetmap.org/listinfo/josm-dev

Reply via email to