From c9d7bc7102231fb0569bdd7561021cf78308ec5f Mon Sep 17 00:00:00 2001 From: Jaisen Mathai Date: Sun, 27 Dec 2015 00:10:19 -0800 Subject: [PATCH] Closes gh-50 Add unsigned option to `geolocation.decimal_to_dms` function and call with `False` from photo.py --- elodie/geolocation.py | 10 ++++++++-- elodie/media/photo.py | 4 ++-- elodie/tests/geolocation_test.py | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/elodie/geolocation.py b/elodie/geolocation.py index 6c80080..34b6819 100644 --- a/elodie/geolocation.py +++ b/elodie/geolocation.py @@ -44,18 +44,24 @@ def coordinates_by_name(name): return None -def decimal_to_dms(decimal): +def decimal_to_dms(decimal, signed=True): # if decimal is negative we need to make the degrees and minutes negative also sign = 1 if(decimal < 0): sign = -1 - + # http://anothergisblog.blogspot.com/2011/11/convert-decimal-degree-to-degrees.html degrees = int(decimal) subminutes = abs((decimal - int(decimal)) * 60) minutes = int(subminutes) * sign subseconds = abs((subminutes - int(subminutes)) * 60) * sign subseconds_fraction = Fraction(subseconds) + + if(signed == False): + degrees = abs(degrees) + minutes = abs(minutes) + subseconds_fraction = Fraction(abs(subseconds)) + return (pyexiv2.Rational(degrees, 1), pyexiv2.Rational(minutes, 1), pyexiv2.Rational(subseconds_fraction.numerator, subseconds_fraction.denominator)) def dms_to_decimal(degrees, minutes, seconds, sign=' '): diff --git a/elodie/media/photo.py b/elodie/media/photo.py index 9b10a75..e89d440 100644 --- a/elodie/media/photo.py +++ b/elodie/media/photo.py @@ -172,9 +172,9 @@ class Photo(Media): exif_metadata = pyexiv2.ImageMetadata(source) exif_metadata.read() - exif_metadata['Exif.GPSInfo.GPSLatitude'] = geolocation.decimal_to_dms(latitude) + exif_metadata['Exif.GPSInfo.GPSLatitude'] = geolocation.decimal_to_dms(latitude, False) exif_metadata['Exif.GPSInfo.GPSLatitudeRef'] = pyexiv2.ExifTag('Exif.GPSInfo.GPSLatitudeRef', 'N' if latitude >= 0 else 'S') - exif_metadata['Exif.GPSInfo.GPSLongitude'] = geolocation.decimal_to_dms(longitude) + exif_metadata['Exif.GPSInfo.GPSLongitude'] = geolocation.decimal_to_dms(longitude, False) exif_metadata['Exif.GPSInfo.GPSLongitudeRef'] = pyexiv2.ExifTag('Exif.GPSInfo.GPSLongitudeRef', 'E' if longitude >= 0 else 'W') exif_metadata.write() diff --git a/elodie/tests/geolocation_test.py b/elodie/tests/geolocation_test.py index 56fb25e..f55c1ef 100644 --- a/elodie/tests/geolocation_test.py +++ b/elodie/tests/geolocation_test.py @@ -25,3 +25,18 @@ def test_decimal_to_dms(): check_value = round(check_value, 8) assert target_decimal_value == check_value, '%s does not match %s' % (check_value, target_decimal_value) + +def test_decimal_to_dms_unsigned(): + + for x in range(0, 1000): + target_decimal_value = random.uniform(0.0, 180.0) * -1 + + dms = geolocation.decimal_to_dms(target_decimal_value, False) + check_value = dms[0].to_float() + dms[1].to_float() / 60 + dms[2].to_float() / 3600 + + target_decimal_value = round(target_decimal_value, 8) + check_value = round(check_value, 8) + + new_target_decimal_value = abs(target_decimal_value) + + assert new_target_decimal_value == check_value, '%s does not match %s' % (check_value, new_target_decimal_value)