Bug#4724; fixed processing of GPS Latitude/ Longitude with help from Helge.Privat...
svn: r16784
This commit is contained in:
@@ -213,12 +213,14 @@ class MediaMetadata(Gramplet):
|
|||||||
|
|
||||||
# Media image Artist
|
# Media image Artist
|
||||||
if KeyTag == ImageArtist:
|
if KeyTag == ImageArtist:
|
||||||
self.exif_widgets["Artist"].set_text(_get_value(KeyTag, self.plugin_image)
|
self.exif_widgets["Artist"].set_text(
|
||||||
|
self._get_value(KeyTag)
|
||||||
)
|
)
|
||||||
|
|
||||||
# media image Copyright
|
# media image Copyright
|
||||||
elif KeyTag == ImageCopyright:
|
elif KeyTag == ImageCopyright:
|
||||||
self.exif_widgets["Copyright"].set_text(_get_value(KeyTag, self.plugin_image)
|
self.exif_widgets["Copyright"].set_text(
|
||||||
|
self._get_value(KeyTag)
|
||||||
)
|
)
|
||||||
|
|
||||||
# media image DateTime
|
# media image DateTime
|
||||||
@@ -226,7 +228,7 @@ class MediaMetadata(Gramplet):
|
|||||||
|
|
||||||
# date1 may come from the image metadata
|
# date1 may come from the image metadata
|
||||||
# date2 may come from the Gramps database
|
# date2 may come from the Gramps database
|
||||||
date1 = _get_value( KeyTag, self.plugin_image )
|
date1 = self._get_value(KeyTag)
|
||||||
date2 = active_media.get_date_object()
|
date2 = active_media.get_date_object()
|
||||||
|
|
||||||
use_date = date1 or date2
|
use_date = date1 or date2
|
||||||
@@ -239,41 +241,45 @@ class MediaMetadata(Gramplet):
|
|||||||
# Latitude and Latitude Reference
|
# Latitude and Latitude Reference
|
||||||
elif KeyTag == ImageLatitude:
|
elif KeyTag == ImageLatitude:
|
||||||
|
|
||||||
latitude = _get_value(ImageLatitude, self.plugin_image)
|
latitude = self._get_value(ImageLatitude)
|
||||||
longitude = _get_value(ImageLongitude, self.plugin_image)
|
longitude = self._get_value(ImageLongitude)
|
||||||
|
|
||||||
# if latitude and longitude exist, display them...
|
# if latitude and longitude exist, display them...
|
||||||
if (latitude and longitude):
|
if (latitude and longitude):
|
||||||
|
|
||||||
# split latitude metadata into (degrees, minutes, and seconds) from Rational
|
# split latitude metadata into (degrees, minutes, and seconds) from Rational
|
||||||
deg, min, sec = rational_to_dms(latitude)
|
latdeg, latmin, latsec = rational_to_dms(latitude, self.ValueType)
|
||||||
|
|
||||||
# Latitude Direction Reference
|
|
||||||
LatitudeRef = _get_value(ImageLatitudeRef, self.plugin_image)
|
|
||||||
|
|
||||||
self.exif_widgets["Latitude"].set_text(
|
|
||||||
"""%s° %s′ %s″ %s""" % (deg, min, sec, LatitudeRef)
|
|
||||||
)
|
|
||||||
|
|
||||||
# split longitude metadata into degrees, minutes, and seconds
|
# split longitude metadata into degrees, minutes, and seconds
|
||||||
deg, min, sec = rational_to_dms(longitude)
|
longdeg, longmin, longsec = rational_to_dms(longitude, self.ValueType)
|
||||||
|
|
||||||
# Longitude Direction Reference
|
latfail = any(value == False for value in [latdeg, latmin, latsec])
|
||||||
LongitudeRef = _get_value(ImageLongitudeRef, self.plugin_image)
|
longfail = any(value == False for value in [longdeg, longmin, longsec])
|
||||||
|
if not latfail and not longfail:
|
||||||
|
|
||||||
self.exif_widgets["Longitude"].set_text(
|
# Latitude Direction Reference
|
||||||
"""%s° %s′ %s″ %s""" % (deg, min, sec, LongitudeRef)
|
LatitudeRef = self._get_value(ImageLatitudeRef)
|
||||||
)
|
|
||||||
|
self.exif_widgets["Latitude"].set_text(
|
||||||
|
"""%s° %s′ %s″ %s""" % (latdeg, latmin, latsec, LatitudeRef)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Longitude Direction Reference
|
||||||
|
LongitudeRef = self._get_value(ImageLongitudeRef)
|
||||||
|
|
||||||
|
self.exif_widgets["Longitude"].set_text(
|
||||||
|
"""%s° %s′ %s″ %s""" % (longdeg, longmin, longsec, LongitudeRef)
|
||||||
|
)
|
||||||
|
|
||||||
# Image Description Field
|
# Image Description Field
|
||||||
elif KeyTag == ImageDescription:
|
elif KeyTag == ImageDescription:
|
||||||
self.exif_widgets["Description"].set_text(
|
self.exif_widgets["Description"].set_text(
|
||||||
_get_value(ImageDescription, self.plugin_image)
|
self._get_value(ImageDescription)
|
||||||
)
|
)
|
||||||
|
|
||||||
# image Keywords
|
# image Keywords
|
||||||
words = ""
|
words = ""
|
||||||
keyWords = _get_value(IptcKeywords, self.plugin_image)
|
keyWords = self._get_value(IptcKeywords)
|
||||||
if keyWords:
|
if keyWords:
|
||||||
index = 1
|
index = 1
|
||||||
for word in keyWords:
|
for word in keyWords:
|
||||||
@@ -285,7 +291,7 @@ class MediaMetadata(Gramplet):
|
|||||||
|
|
||||||
def make_row(self, pos, text, choices=None, readonly=False, callback_list=[],
|
def make_row(self, pos, text, choices=None, readonly=False, callback_list=[],
|
||||||
mark_dirty=False, default=0, source=None):
|
mark_dirty=False, default=0, source=None):
|
||||||
import gtk
|
|
||||||
# Data Entry: Active Person
|
# Data Entry: Active Person
|
||||||
row = gtk.HBox()
|
row = gtk.HBox()
|
||||||
label = gtk.Label()
|
label = gtk.Label()
|
||||||
@@ -433,39 +439,49 @@ class MediaMetadata(Gramplet):
|
|||||||
|
|
||||||
return rdate, rtime
|
return rdate, rtime
|
||||||
|
|
||||||
|
def _get_value(self, KeyTag):
|
||||||
|
"""
|
||||||
|
gets the value from the Exif Key, and returns it...
|
||||||
|
|
||||||
|
@param: KeyTag -- image metadata key
|
||||||
|
@param: image -- pyexiv2 ImageMetadata instance
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.ValueType = None
|
||||||
|
if "Exif" in KeyTag:
|
||||||
|
try:
|
||||||
|
KeyValue = self.plugin_image[KeyTag].value
|
||||||
|
self.ValueType = 0
|
||||||
|
|
||||||
|
except KeyError:
|
||||||
|
KeyValue = self.plugin_image[KeyTag].raw_value
|
||||||
|
self.ValueType = 1
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
KeyValue = ""
|
||||||
|
|
||||||
|
except AttributeError:
|
||||||
|
KeyValue = ""
|
||||||
|
|
||||||
|
# Iptc KeyTag
|
||||||
|
elif "Iptc" in KeyTag:
|
||||||
|
try:
|
||||||
|
KeyValue = self.plugin_image[KeyTag].value
|
||||||
|
|
||||||
|
except KeyError:
|
||||||
|
KeyValue = "[not set]"
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
KeyValue = ""
|
||||||
|
|
||||||
|
except AttributeError:
|
||||||
|
KeyValue = ""
|
||||||
|
|
||||||
|
return KeyValue
|
||||||
|
|
||||||
#------------------------------------------------
|
#------------------------------------------------
|
||||||
# Retrieve metadata from image
|
# Retrieve metadata from image
|
||||||
#------------------------------------------------
|
#------------------------------------------------
|
||||||
def _get_value(KeyTag, image):
|
|
||||||
"""
|
|
||||||
gets the value from the Exif Key, and returns it...
|
|
||||||
|
|
||||||
@param: KeyTag -- image metadata key
|
|
||||||
@param: image -- pyexiv2 ImageMetadata instance
|
|
||||||
"""
|
|
||||||
|
|
||||||
if "Exif" in KeyTag:
|
|
||||||
try:
|
|
||||||
KeyValue = image[KeyTag].value
|
|
||||||
|
|
||||||
except KeyError:
|
|
||||||
KeyValue = image[KeyTag].raw_value
|
|
||||||
|
|
||||||
except ValueError:
|
|
||||||
KeyValue = ""
|
|
||||||
|
|
||||||
# Iptc KeyTag
|
|
||||||
elif "Iptc" in KeyTag:
|
|
||||||
try:
|
|
||||||
KeyValue = image[KeyTag].value
|
|
||||||
|
|
||||||
except KeyError:
|
|
||||||
KeyValye = "[tag not set]"
|
|
||||||
|
|
||||||
except ValueError:
|
|
||||||
KeyValue = ""
|
|
||||||
return KeyValue
|
|
||||||
|
|
||||||
def convert_value(value):
|
def convert_value(value):
|
||||||
"""
|
"""
|
||||||
will take a value from the coordinates and return its value
|
will take a value from the coordinates and return its value
|
||||||
@@ -477,11 +493,33 @@ def convert_value(value):
|
|||||||
value = (value.numerator / value.denominator)
|
value = (value.numerator / value.denominator)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
def rational_to_dms(coords):
|
def rational_to_dms(coords, ValueType):
|
||||||
"""
|
"""
|
||||||
will return a rational set of coordinates to degrees, minutes, seconds
|
takes a rational set of coordinates and returns (degrees, minutes, seconds)
|
||||||
"""
|
"""
|
||||||
return convert_value(coords[0]), convert_value(coords[1]), convert_value(coords[2])
|
|
||||||
|
deg, min, sec = False, False, False
|
||||||
|
if ValueType is not None:
|
||||||
|
|
||||||
|
if ValueType == 1:
|
||||||
|
|
||||||
|
deg, min, sec = coords.split(" ")
|
||||||
|
deg, rest = deg.split("/")
|
||||||
|
min, rest = min.split("/")
|
||||||
|
sec, rest = sec.split("/")
|
||||||
|
sec, rest = int(sec), int(rest)
|
||||||
|
|
||||||
|
if rest > 1:
|
||||||
|
sec = str( (sec/ rest) )
|
||||||
|
|
||||||
|
elif (ValueType == 0 and isinstance(coords, list) ):
|
||||||
|
|
||||||
|
if len(coords) == 3:
|
||||||
|
deg, min, sec = coords[0], coords[1], coords[2]
|
||||||
|
deg = convert_value(deg)
|
||||||
|
min = convert_value(min)
|
||||||
|
sec = convert_value(sec)
|
||||||
|
return deg, min, sec
|
||||||
|
|
||||||
#------------------------------------------------
|
#------------------------------------------------
|
||||||
# Support functions
|
# Support functions
|
||||||
|
Reference in New Issue
Block a user