commit 5065c677ef4cf89536e8be267de3c7fec279d863 Author: Kekskurse Date: Tue Dec 22 21:46:09 2020 +0100 GPS Data diff --git a/gps-data.py b/gps-data.py new file mode 100755 index 0000000..24ee5b4 --- /dev/null +++ b/gps-data.py @@ -0,0 +1,124 @@ +from exif import Image +import pyexiv2 +import math +import fractions +import datetime +import gpxpy +import gpxpy.gpx +import pytz +import os + +class Fraction(fractions.Fraction): + """Only create Fractions from floats. + + >>> Fraction(0.3) + Fraction(3, 10) + >>> Fraction(1.1) + Fraction(11, 10) + """ + + def __new__(cls, value, ignore=None): + """Should be compatible with Python 2.6, though untested.""" + return fractions.Fraction.from_float(value).limit_denominator(99999) + + +def dms_to_decimal(degrees, minutes, seconds, sign=' '): + """Convert degrees, minutes, seconds into decimal degrees. + + >>> dms_to_decimal(10, 10, 10) + 10.169444444444444 + >>> dms_to_decimal(8, 9, 10, 'S') + -8.152777777777779 + """ + return (-1 if sign[0] in 'SWsw' else 1) * ( + float(degrees) + + float(minutes) / 60 + + float(seconds) / 3600 + ) +def decimal_to_dms(decimal): + """Convert decimal degrees into degrees, minutes, seconds. + + >>> decimal_to_dms(50.445891) + [Fraction(50, 1), Fraction(26, 1), Fraction(113019, 2500)] + >>> decimal_to_dms(-125.976893) + [Fraction(125, 1), Fraction(58, 1), Fraction(92037, 2500)] + """ + remainder, degrees = math.modf(abs(decimal)) + remainder, minutes = math.modf(remainder * 60) + return [Fraction(n) for n in (degrees, minutes, remainder * 60)] + +def writeLatLonToImage(filename, lat, lon): + GPS = 'Exif.GPSInfo.GPS' + md = pyexiv2.ImageMetadata(filename) + md.read() + #md[GPS + 'AltitudeRef'] = '0' if self.altitude >= 0 else '1' + #md[GPS + 'Altitude'] = Fraction(self.altitude) + md[GPS + 'Latitude'] = decimal_to_dms(lat) + md[GPS + 'LatitudeRef'] = 'N' if lat >= 0 else 'S' + md[GPS + 'Longitude'] = decimal_to_dms(lon) + md[GPS + 'LongitudeRef'] = 'E' if lon >= 0 else 'W' + #md[GPS + 'MapDatum'] = 'WGS-84' + md.write() + +def getLatLonFromGPXFile(filename, datetime): + gpx_file = open(filename, 'r') + + gpx = gpxpy.parse(gpx_file) + + minDiffSecound = 600 + nearestpoint = None + + + for track in gpx.tracks: + for segment in track.segments: + for point in segment.points: + elapsedTime = datetime - point.time + seconds = elapsedTime.total_seconds() + #print(str(point.time) + ": " +str(seconds)) + if seconds < 0: + seconds = seconds * -1 + if seconds < minDiffSecound: + nearestpoint = point + minDiffSecound = seconds + + return nearestpoint + +errorCout = 0 +#53 minuten +def updateImage(filename): + global errorCout + global updated + md = pyexiv2.ImageMetadata(filename) + + md.read() + print(md.exif_keys) + sys.exit() + #for i in md: + # print(i) + tz = pytz.timezone('Europe/Berlin') + phototime = tz.localize((md["Exif.Image.DateTime"].value - datetime.timedelta(hours=0, minutes=54))) + print("Phototime: "+str(phototime)) + point = getLatLonFromGPXFile("track.gpx", phototime) + if point != None: + writeLatLonToImage(filename, point.latitude, point.longitude) + updated = updated + 1 + else: + errorCout = errorCout + 1 + print("Cant find location!!!!") + +updated = 0 + +#updateImage("DSC07296.JPG") + +for entry in os.scandir('.'): + print("> "+entry.name) + if entry.name.endswith(".JPG"): + updateImage(entry.name) + print(entry.name + " updated") + if entry.name.endswith(".ARW"): + updateImage(entry.name) + print(entry.name + " updated") + +print("Errors: "+str(errorCout)) +print("Updated: "+str(updated)) +