add: transform coordinates to decimal form

pull/11/head
rrr-marble 4 years ago
parent 9dfacfd6c2
commit d18786b000

@ -6,9 +6,44 @@ import filetype
from os import path, walk from os import path, walk
from sys import argv, stderr from sys import argv, stderr
from shutil import move from shutil import move
from fractions import Fraction
import sqlite3 import sqlite3
def decimal_from_rational64u(dms: str):
"""Convert coordinates from rational64u EXIF uses to represent
degrees, minutes, and seconds of a point to decimal format
General formula is
dec_degree = degreesNumerator / degreesDenominator
+ minutesNumerator / minutesDenominator / 60
+ secondsNumerator / secondsDenominator / 3600
https://en.wikipedia.org/wiki/Geographic_coordinate_conversion
https://gis.stackexchange.com/questions/136925/how-to-parse-exif-gps-information-to-lat-lng-decimal-numbers
>>> decimal_from_rational64u(dms="42/1, 18/1, 2914/100")
42.30809
"""
# 1 split by comma
# 2 turn each into Fraction
# 3 zip fractions with their respective (degrees, minutes, seconds) denominator
# 4 divide the fraction
# 5 sum up the result
# 6 convert to decimal
# 7 round to 5th decimal point
return round(
float(
sum(
a / b
for (a, b) in zip((Fraction(f) for f in dms.split(",")), (1, 60, 3600))
)
),
5,
)
def process_pictures(source: str, dest_shrunk: str, dest_original: str): def process_pictures(source: str, dest_shrunk: str, dest_original: str):
"""Process images from the base directory in the first command line argument. """Process images from the base directory in the first command line argument.
Place the resized copies to dest_shrunk and Place the resized copies to dest_shrunk and
@ -53,9 +88,9 @@ def process_pictures(source: str, dest_shrunk: str, dest_original: str):
"ResizedImage": path.join(dest_shrunk, filename), "ResizedImage": path.join(dest_shrunk, filename),
"OriginalImage": path.join(dest_original, filename), "OriginalImage": path.join(dest_original, filename),
"DateTimeOriginal": exif["DateTimeOriginal"], # Q: normalize it? "DateTimeOriginal": exif["DateTimeOriginal"], # Q: normalize it?
"GPSLatitude": exif["GPSLatitude"], "GPSLatitude": decimal_from_rational64u(exif["GPSLatitude"]),
"GPSLatitudeRef": exif["GPSLatitudeRef"], "GPSLatitudeRef": exif["GPSLatitudeRef"],
"GPSLongitude": exif["GPSLongitude"], "GPSLongitude": decimal_from_rational64u(exif["GPSLongitude"]),
"GPSLongitudeRef": exif["GPSLongitudeRef"], "GPSLongitudeRef": exif["GPSLongitudeRef"],
} }
except KeyError as e: except KeyError as e:

Loading…
Cancel
Save