def set_gps_location(file_name, lat, lng): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) print(lat_deg) print(lng_deg) # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0]*60+lat_deg[1],60),pyexiv2.Rational(lat_deg[2]*100,6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0]*60+lng_deg[1],60),pyexiv2.Rational(lng_deg[2]*100,6000), pyexiv2.Rational(0, 1)) metadata = pyexiv2.ImageMetadata(file_name) metadata.read() ## exif_keys = metadata.exif_keys metadata["Exif.GPSInfo.GPSLatitude"] = exiv_lat metadata["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] metadata["Exif.GPSInfo.GPSLongitude"] = exiv_lng metadata["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] metadata["Exif.Image.GPSTag"] = 654 metadata["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" metadata["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' metadata.write()
def set_gps_location(self,file_name, lat, lng): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = self.to_deg(lat, ["S", "N"]) lng_deg = self.to_deg(lng, ["W", "E"]) print lat_deg print lng_deg # class pyexiv2.utils.Rational(numerator, denominator) => convert decimal coordinates into degrees, munutes and seconds exiv_lat = (ev.Rational(lat_deg[0]*60+lat_deg[1],60),ev.Rational(lat_deg[2]*100,6000), ev.Rational(0, 1)) exiv_lng = (ev.Rational(lng_deg[0]*60+lng_deg[1],60),ev.Rational(lng_deg[2]*100,6000), ev.Rational(0, 1)) exiv_image = ev.ImageMetadata(file_name) exiv_image.read() # modify GPSInfo of image exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 2 0 0' exiv_image.write()
def view_gps_location(file_name, lat, lng): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) print lat_deg print lng_deg # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000)) exiv_image = pyexiv2.Image(file_name) exiv_image.readMetadata() exif_keys = exiv_image.exifKeys() for key in exif_keys: print key, [exiv_image[key]]
def set_gps_location(self, file_name, lat, lng): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = self.to_deg(lat, ["S", "N"]) lng_deg = self.to_deg(lng, ["W", "E"]) print (lat_deg) print (lng_deg) # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0]*60+lat_deg[1],60),pyexiv2.Rational(lat_deg[2]*100,6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0]*60+lng_deg[1],60),pyexiv2.Rational(lng_deg[2]*100,6000), pyexiv2.Rational(0, 1)) exiv_image = pyexiv2.ImageMetadata("{}/{}".format(self.download_dir, file_name)) exiv_image.read() exif_keys = exiv_image.exif_keys exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write()
def get_metadata(dateString, timedict, timeshift, path, report=None): """get_metadata(float) - get a dictionary of changes to the metadata dateString - EXIF date format string /* in */ timeshift - delta between GMT and local time (seconds. Positive to West) path - path to the image (only for stdout reporting) report - log file """ if not pyexiv2: raise ImportError('pyexiv2 is not installed') stamp = str(get_xml_timez(dateString, timeshift)) timestamp = search(timedict, stamp) data = timedict[timestamp] ele = float(data[0]) lat = float(data[1]) lon = float(data[2]) latR = 'N' lonR = 'E' eleR = 0 if lat < 0: lat = -lat latR = 'S' if lon < 0: lon = -lon lonR = 'W' sele = "%6.1f" % (ele) if ele < 0: ele = -ele eleR = 1 slat = "%02d.%02d'" '%02d"%s' % (d(lat), m(lat), s(lat), latR) slon = "%02d.%02d'" '%02d"%s' % (d(lon), m(lon), s(lon), lonR) if report: report.write(",".join([stamp, timestamp, slat, slon, sele, path])\ + "\n") # get Rational number for ele # don't know why r(ele) is causing trouble! # it might be that the denominator is overflowing 32 bits! # and this would also import lat and lon rele = pyexiv2.Rational(int(ele * 10.0), 10) # create and return the dictionary of tags to be added to the image metadata = {} metadata['Exif_GPSInfo_GPSAltitude'] = rele metadata['Exif_GPSInfo_GPSAltitudeRef'] = eleR metadata['Exif_GPSInfo_GPSDateStamp'] = stamp metadata['Exif_GPSInfo_GPSLatitude'] = \ [r(d(lat)), r(m(lat)), r(s(lat))] metadata['Exif_GPSInfo_GPSLatitudeRef'] = latR metadata['Exif_GPSInfo_GPSLongitude'] = \ [r(d(lon)), r(m(lon)), r(s(lon))] metadata['Exif_GPSInfo_GPSLongitudeRef'] = lonR metadata['Exif_GPSInfo_GPSMapDatum'] = 'WGS-84' metadata['Exif_GPSInfo_GPSProcessingMethod'] = \ '65 83 67 73 73 0 0 0 72 89 66 82 73 68 45 70 73 88 ' metadata['Exif_GPSInfo_GPSTimeStamp'] = \ [r(10), r(20), r(30)] metadata['Exif_GPSInfo.GPSVersionID'] = '2 2 0 0' return metadata
def set_gps_location(self, file_name, tags): lat = tags.lat / 10000000.0 lng = tags.lng / 10000000.0 lat_deg = self.to_deg(lat, ["S", "N"]) lng_deg = self.to_deg(lng, ["W", "E"]) #conver decimal coordinates into degrees, minutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() exif_keys = exiv_image.exif_keys exiv_altitude = pyexiv2.Rational(tags.altitude, 1) print(exiv_lat, exiv_lng, lat_deg[3], lng_deg[3], exiv_altitude) if tags.altitude > 0: exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.GPSInfo.GPSAltitude"] = exiv_altitude exiv_image["Exif.GPSInfo.GPSAltitudeRef"] = '0' exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write()
def SetGpsLocation(file_name, lat, lng, alt): """ Adding GPS tag """ lat_deg = to_degree(lat, ["S", "N"]) lng_deg = to_degree(lng, ["W", "E"]) exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.GPSInfo.GPSAltitude"] = pyexiv2.Rational(alt, 1) exiv_image["Exif.GPSInfo.GPSAltitudeRef"] = '0' exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write(True)
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 # noqa 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 is 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 set_gps_location(file_name, lat, lng, overwrite=False, address=None): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() has_geotag = utils.get_exif_value(exiv_image, "Exif.GPSInfo.GPSLatitude") is not None and \ utils.get_exif_value(exiv_image, "Exif.GPSInfo.GPSLatitudeRef") is not None and \ utils.get_exif_value(exiv_image, "Exif.GPSInfo.GPSLongitude") is not None and \ utils.get_exif_value(exiv_image, "Exif.GPSInfo.GPSLongitudeRef") is not None if not overwrite and has_geotag: print file_name, "-> Already tagged" return GeotagStatus.already_tagged lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write(True) print file_name, "-> Tagged!", "(overwrited)" if overwrite and has_geotag else "", if address: print "(" + address + ")", print "http://maps.google.com/?ll=%(la)s,%(lo)s" % { "la": str(lat), "lo": str(lng) } return GeotagStatus.tagged
def set_gps_location(file_name, lat, lng): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ global attribute lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) #print lat_deg #print lng_deg # convert decimal coordinates into degrees, munutes and seconds if attribute == False: exiv_lat = (pyexiv2.Rational(lat_deg[0]*60+lat_deg[1],60),pyexiv2.Rational(lat_deg[2]*100,6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0]*60+lng_deg[1],60),pyexiv2.Rational(lng_deg[2]*100,6000), pyexiv2.Rational(0, 1)) else: exiv_lat = (pyexiv2.Rational(lat_deg[0]*60,60),pyexiv2.Rational(lat_deg[1]*100,100), pyexiv2.Rational(lat_deg[2]*10000, 10000)) exiv_lng = (pyexiv2.Rational(lng_deg[0]*60,60),pyexiv2.Rational(lng_deg[1]*100,100), pyexiv2.Rational(lng_deg[2]*10000, 10000)) exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() exif_keys = exiv_image.exif_keys exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write() exiv_image.write()
def SetGpsLocation(file_name, gps_datetime, lat, lng, alt): """ Adding GPS tag """ lat_deg = to_degree(lat, ["S", "N"]) lng_deg = to_degree(lng, ["W", "E"]) exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational( lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational( lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() date_tag = exiv_image['Exif.Image.DateTime'] date_max = max(date_tag.value, gps_datetime) date_min = min(date_tag.value, gps_datetime) time_diff = date_max - date_min if (time_diff > timedelta(seconds=5)): print( "WARNING, camera trigger and photo time different by {}".format(time_diff)) print(" Photo tag time: {}".format(date_tag.value)) print(" Camera trigger time: {}".format(gps_datetime)) exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.GPSInfo.GPSAltitude"] = pyexiv2.Rational(alt, 1) exiv_image["Exif.GPSInfo.GPSAltitudeRef"] = '0' exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write(True)
def set_gps_location(file_name, lat, lng, alt, t): """ see: http://stackoverflow.com/questions/453395/what-is-the-best-way-to-geotag-jpeg-images-with-python Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) m = pyexiv2.ImageMetadata(file_name) m.read() m["Exif.GPSInfo.GPSLatitude"] = exiv_lat m["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] m["Exif.GPSInfo.GPSLongitude"] = exiv_lng m["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] m["Exif.Image.GPSTag"] = 654 m["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" m["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' m["Exif.Image.DateTime"] = datetime.datetime.fromtimestamp(t) try: m["Exif.GPSInfo.GPSAltitude"] = mav_position.Fraction(alt) except Exception: pass m.write()
def set_gps_location(self, file_name, lat, lng, alt): """ Add the GPS tag and altitude to a image file :param file_name: :param lat: :param lng: :param alt: :return: """ lat_deg = self.to_degree(lat, ["S", "N"]) lng_deg = self.to_degree(lng, ["W", "E"]) exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) try: exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.GPSInfo.GPSAltitude"] = pyexiv2.Rational(alt, 1) exiv_image["Exif.GPSInfo.GPSAltitudeRef"] = '0' exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write(True) except Exception as e: print '[ERROR]', e
def set_gps_location(file_name, lat, lng): """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = to_deg(lat, ["S", "N"]) lng_deg = to_deg(lng, ["W", "E"]) print lat_deg print lng_deg lat_deg_sec = str(lat_deg[2]).split('.') print(lat_deg_sec[1] + "E") # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60, 60), pyexiv2.Rational(lat_deg[1] * 100, 100), pyexiv2.Rational(lat_deg[2] * 10000000, 10000000)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60, 60), pyexiv2.Rational(lng_deg[1] * 100, 100), pyexiv2.Rational(lng_deg[2] * 10000000, 10000000)) exiv_image = pyexiv2.ImageMetadata(file_name) exiv_image.read() exif_keys = exiv_image.exif_keys print(str(exiv_lat) + " H") exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] exiv_image["Exif.Image.GPSTag"] = 654 exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' exiv_image.write()
def set_gps_location(self, file_name, lat, lng, alt): #function to write gps data in image (geotagg) """Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) """ lat_deg = self.to_deg(lat, ["S", "N"]) lng_deg = self.to_deg(lng, ["W", "E"]) # convert decimal coordinates into degrees, munutes and seconds exiv_lat = (pyexiv2.Rational(lat_deg[0] * 60 + lat_deg[1], 60), pyexiv2.Rational(lat_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) exiv_lng = (pyexiv2.Rational(lng_deg[0] * 60 + lng_deg[1], 60), pyexiv2.Rational(lng_deg[2] * 100, 6000), pyexiv2.Rational(0, 1)) metadata = pyexiv2.ImageMetadata(file_name) metadata.read() # write value in tag metadata["Exif.GPSInfo.GPSLatitude"] = exiv_lat metadata["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3] metadata["Exif.GPSInfo.GPSLongitude"] = exiv_lng metadata["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3] metadata["Exif.GPSInfo.GPSAltitudeRef"] = '0' if alt >= 0 else '1' # metadata["Exif.GPSInfo.GPSAltitude"]=pyexiv2.Rational(alt,1) alt1 = Fraction(alt).limit_denominator() metadata["Exif.GPSInfo.GPSAltitude"] = alt1 metadata["Exif.Image.GPSTag"] = 654 metadata["Exif.GPSInfo.GPSMapDatum"] = "WGS-84" metadata["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0' metadata.write()
def mark_photo(self, file_name): metadata = pyexiv2.ImageMetadata(file_name) metadata.read() print file_name try: if len(metadata['Exif.GPSInfo.GPSLongitude'].value) > 0: return except KeyError: pass timedelta = datetime.datetime.now() - datetime.datetime.utcnow() # To UC datetime. try: date_time_original = metadata[ 'Exif.Photo.DateTimeOriginal'].value - timedelta index = self.find_point(date_time_original) except KeyError: index = -1 print 'find:', index if index < 0: return point = self._points[index] if point.longitude > 0: metadata['Exif.GPSInfo.GPSLongitudeRef'] = 'E' else: metadata['Exif.GPSInfo.GPSLongitudeRef'] = 'W' if point.latitude > 0: metadata['Exif.GPSInfo.GPSLatitudeRef'] = 'N' else: metadata['Exif.GPSInfo.GPSLatitudeRef'] = 'S' if point.elevation > 0: metadata['Exif.GPSInfo.GPSAltitudeRef'] = '0' else: metadata['Exif.GPSInfo.GPSAltitudeRef'] = '1' gps_altitude = pyexiv2.Rational(abs(point.elevation) * 1000, 1000) gps_longitude = pyexiv2.NotifyingList() gps_longitude.append(pyexiv2.Rational(point.longitude, 1)) minute = (point.longitude - int(point.longitude)) * 60 gps_longitude.append(pyexiv2.Rational(minute, 1)) second = (minute - int(minute)) * 60 gps_longitude.append(pyexiv2.Rational(minute * 10000, 10000)) gps_latitude = pyexiv2.NotifyingList() gps_latitude.append(pyexiv2.Rational(point.latitude, 1)) minute = (point.latitude - int(point.latitude)) * 60 gps_latitude.append(pyexiv2.Rational(minute, 1)) second = (minute - int(minute)) * 60 gps_latitude.append(pyexiv2.Rational(minute * 10000, 10000)) gps_time_stamp = pyexiv2.NotifyingList() gps_time_stamp.append(pyexiv2.Rational(point.time.hour, 1)) gps_time_stamp.append(pyexiv2.Rational(point.time.minute, 1)) gps_time_stamp.append( pyexiv2.Rational( point.time.second * 100 + point.time.microsecond / 10000, 100)) metadata['Exif.GPSInfo.GPSLongitude'] = gps_longitude metadata['Exif.GPSInfo.GPSLatitude'] = gps_latitude metadata['Exif.GPSInfo.GPSAltitude'] = gps_altitude metadata['Exif.GPSInfo.GPSDateStamp'] = point.time.strftime('%Y-%m-%d') metadata['Exif.GPSInfo.GPSTimeStamp'] = gps_time_stamp print metadata['Exif.GPSInfo.GPSLongitudeRef'].value, metadata[ 'Exif.GPSInfo.GPSLongitude'].value print metadata['Exif.GPSInfo.GPSLatitudeRef'].value, metadata[ 'Exif.GPSInfo.GPSLatitude'].value metadata.write()
def r(f): """r(float) - get a Rational number for a float""" s = surd.surd(float(f)) return pyexiv2.Rational(s.num, s.denom)
def float_to_rational(value): frac = fractions.Fraction(abs(value)).limit_denominator(99999) return pyexiv2.Rational(frac.numerator, frac.denominator)