[gexiv2] Add gexiv2_metadata_update_gps_info
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gexiv2] Add gexiv2_metadata_update_gps_info
- Date: Sat, 23 May 2020 15:59:32 +0000 (UTC)
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]