[gexiv2] Add gexiv2_metadata_update_gps_info



commit 525602bce050abde3f43247244ca57506b2e489e
Author: Jens Georg <mail jensge org>
Date:   Sat May 23 17:15:49 2020 +0200

    Add gexiv2_metadata_update_gps_info
    
    set_gps_info will remove all other GPS information. This is slightly
    misleading. This function tries to only update lat, lon and alt while
    leaving all other data alone.
    
    Fixes #53

 gexiv2/gexiv2-metadata-gps.cpp | 29 ++++++++++++++++++++++++-----
 gexiv2/gexiv2-metadata.h       | 18 +++++++++++++++++-
 test/python/test_metadata.py   | 38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 79 insertions(+), 6 deletions(-)
---
diff --git a/gexiv2/gexiv2-metadata-gps.cpp b/gexiv2/gexiv2-metadata-gps.cpp
index 4fb99a7..dd44755 100644
--- a/gexiv2/gexiv2-metadata-gps.cpp
+++ b/gexiv2/gexiv2-metadata-gps.cpp
@@ -216,18 +216,36 @@ gboolean gexiv2_metadata_set_gps_info (GExiv2Metadata *self, gdouble longitude,
 
     try {
         gexiv2_metadata_delete_gps_info (self);
-        
+
+        return gexiv2_metadata_update_gps_info (self, longitude, latitude, altitude);
+    } catch (Exiv2::Error &e) {
+        LOG_ERROR(e);
+    }
+
+    return FALSE;
+}
+
+gboolean gexiv2_metadata_update_gps_info (GExiv2Metadata *self, gdouble longitude, gdouble latitude,
+    gdouble altitude) {
+    g_return_val_if_fail (GEXIV2_IS_METADATA (self), FALSE);
+    g_return_val_if_fail(self->priv->image.get() != NULL, FALSE);
+
+    try {
         Exiv2::ExifData& exif_data = self->priv->image->exifData();
-        
+
         gchar buffer [100];
         gint deg, min, sec;
         gdouble remainder, whole;
         
         const gint denom = 1000000;
         
-        /* set GPS Info Version */
-        exif_data ["Exif.GPSInfo.GPSVersionID"] = "2 0 0 0";
-        
+        Exiv2::ExifKey key ("Exif.GPSInfo.GPSVersionID");
+        Exiv2::ExifData::iterator it = exif_data.findKey (key);
+        if (it == exif_data.end()) {
+            /* set GPS Info Version */
+            exif_data ["Exif.GPSInfo.GPSVersionID"] = "2 0 0 0";
+        }
+
         /* set GPS Info format */
         exif_data ["Exif.GPSInfo.GPSMapDatum"] = "WGS-84";
         
@@ -281,6 +299,7 @@ gboolean gexiv2_metadata_set_gps_info (GExiv2Metadata *self, gdouble longitude,
     return FALSE;
 }
 
+
 void gexiv2_metadata_delete_gps_info (GExiv2Metadata *self) {
     g_return_if_fail(GEXIV2_IS_METADATA (self));
     g_return_if_fail(self->priv->image.get() != NULL);
diff --git a/gexiv2/gexiv2-metadata.h b/gexiv2/gexiv2-metadata.h
index 4404fab..620d25d 100644
--- a/gexiv2/gexiv2-metadata.h
+++ b/gexiv2/gexiv2-metadata.h
@@ -1001,12 +1001,28 @@ gboolean                gexiv2_metadata_get_gps_info                            
(GExiv2Metadata *self, gdouble *longit
  * @latitude: Latitude value to set or replace current value
  * @altitude: Altitude value to set or replace current value
  *
- * Convenience function to query all available GPS information at once.
+ * Convenience function to create a new set of simple GPS data. Warning: Will remove any other
+ * GPS information that is currently set. See gexiv2_metadata_update_gps_info() for
+ * just modifying the GPS data.
  *
  * Returns: (skip): Boolean success value.
  */
 gboolean               gexiv2_metadata_set_gps_info                            (GExiv2Metadata *self, 
gdouble longitude, gdouble latitude, gdouble altitude);
 
+/**
+ * gexiv2_metadata_update_gps_info:
+ * @self: An instance of #GExiv2Metadata
+ * @longitude: Longitude value to set or replace current value
+ * @latitude: Latitude value to set or replace current value
+ * @altitude: Altitude value to set or replace current value
+ *
+ * Convenience function to update longitute, latitude and altitude at once.
+ *
+ * Returns: (skip): Boolean success value.
+ * Since: 0.12.1
+ */
+gboolean               gexiv2_metadata_update_gps_info                         (GExiv2Metadata *self, 
gdouble longitude, gdouble latitude, gdouble altitude);
+
 /**
  * gexiv2_metadata_delete_gps_info:
  * @self: An instance of #GExiv2Metadata
diff --git a/test/python/test_metadata.py b/test/python/test_metadata.py
index 776ab03..8230201 100644
--- a/test/python/test_metadata.py
+++ b/test/python/test_metadata.py
@@ -761,6 +761,44 @@ generated the image. When the field is left blank, it is treated as unknown.""")
         self.metadata.set_tag_string('Exif.GPSInfo.GPSAltitude', '1/0')
         self.assertAlmostEqual(self.metadata.get_gps_altitude(), 0.0)
 
+    def test_overwrite_gps_info(self):
+        self.metadata.set_tag_string('Exif.GPSInfo.GPSDateStamp', '2019:04:25')
+        self.metadata.set_tag_string('Exif.GPSInfo.GPSTimeStamp', '10/1 11/1 50/1')
+        self.metadata.set_tag_string('Exif.GPSInfo.GPSVersionID', '2 2 0 0')
+        self.metadata.set_gps_info(-123.35, 48.43, 10)
+        self.assertEqual(
+            [(tag, self.metadata.get_tag_string(tag))
+             for tag in self.metadata.get_exif_tags()
+             if 'GPS' in tag],
+            [('Exif.GPSInfo.GPSAltitude', '10/1'),
+             ('Exif.GPSInfo.GPSAltitudeRef', '0'),
+             ('Exif.GPSInfo.GPSLatitude', '48/1 25/1 47999999/1000000'),
+             ('Exif.GPSInfo.GPSLatitudeRef', 'N'),
+             ('Exif.GPSInfo.GPSLongitude', '123/1 20/1 59999999/1000000'),
+             ('Exif.GPSInfo.GPSLongitudeRef', 'W'),
+             ('Exif.GPSInfo.GPSMapDatum', 'WGS-84'),
+             ('Exif.GPSInfo.GPSVersionID', '2 0 0 0')])
+
+    def test_update_gps_info(self):
+        self.metadata.set_tag_string('Exif.GPSInfo.GPSDateStamp', '2019:04:25')
+        self.metadata.set_tag_string('Exif.GPSInfo.GPSTimeStamp', '10/1 11/1 50/1')
+        self.metadata.set_tag_string('Exif.GPSInfo.GPSVersionID', '2 2 0 0')
+        self.metadata.update_gps_info(-123.35, 48.43, 10)
+        self.assertEqual(
+            [(tag, self.metadata.get_tag_string(tag))
+             for tag in self.metadata.get_exif_tags()
+             if 'GPS' in tag],
+            [('Exif.GPSInfo.GPSAltitude', '10/1'),
+             ('Exif.GPSInfo.GPSAltitudeRef', '0'),
+             ('Exif.GPSInfo.GPSDateStamp', '2019:04:25'),
+             ('Exif.GPSInfo.GPSLatitude', '48/1 25/1 47999999/1000000'),
+             ('Exif.GPSInfo.GPSLatitudeRef', 'N'),
+             ('Exif.GPSInfo.GPSLongitude', '123/1 20/1 59999999/1000000'),
+             ('Exif.GPSInfo.GPSLongitudeRef', 'W'),
+             ('Exif.GPSInfo.GPSMapDatum', 'WGS-84'),
+             ('Exif.GPSInfo.GPSTimeStamp', '10/1 11/1 50/1'),
+             ('Exif.GPSInfo.GPSVersionID', '2 2 0 0')])
+
     def test_get_preview_properties(self):
         previews = self.metadata.get_preview_properties()
         self.assertEqual(len(previews), 2)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]