要存GPS的相關tag到圖片時,因為某些tag要求存Rational或GPSCoordinate,我不知道該怎麼轉換,所以花了不少功夫查。我基本上是參考 這個老先生的code,他主要是使用 GPS tracker,所以會要讀取 tracker 裡的紀錄,然後以時間跟照片做比對,再把 GPS 位置寫進圖片裡。
可是遇到兩個問題:
- 他的 code 是用 surd 處理 Rational,我找不到 surd 了。
- 算出來的度、分、秒不準確。
首先是解決Rational問題,python 2.6 已經有內置的 module – Fraction 可以解決了。
def R(f): """R(float) - get a Rational number for a float""" from fractions import Fraction from pyexiv2 import Rational r = Fraction.from_float( float(f) ) return Rational( r.numerator, r.denominator )
再來就是轉換的問題,從 Google gear 那邊拿到的經緯度,要轉換成度分秒,我後來是參考 上河文化網站-座標轉換程式與 Google Maps 地圖定位裡的 javascript 來改寫,這才得到正確的度、分、秒:
def d(angle): """d(any) - get degrees from a number :eg d(33.41) = 33""" return math.floor(angle) def m(angle): """m(any) - get minutes from a number :eg d(33.41) = 24""" return math.floor( (angle-d(angle))*60 ) def s(angle): """s(any) - get seconds from a number :eg s(33.41) = 36""" return round((angle-d(angle)-m(angle)/60)*3600) def degree2coordinate( lat, lon ): """Convert degree to coordinate string.""" latR = 'N' lonR = 'E' if lat < 0: lat = -lat latR= 'S' if lon < 0: lon = -lon lonR= 'W' slat = "%03d,%02d,%02d%s" % (d(lat),m(lat),s(lat),latR ) slon = "%03d,%02d,%02d%s" % (d(lon),m(lon),s(lon),lonR ) return (pyexiv2.GPSCoordinate.from_string( slat ), pyexiv2.GPSCoordinate.from_string( slon ) )
最後,記一下,Tag裡要存的資料型態:
- Xmp.exif.GPSLatitude、Xmp.exif.GPSLongitude 裡存的是 pyexiv2.GPSCoordinate
- Xmp.exif.GPSMapDatum、Exif.GPSInfo.GPSMapDatum裡存的是字串,我是用 WGS-84
- Exif.GPSInfo.GPSLatitude、Exif.GPSInfo.GPSLongitude 裡存的是度、分、秒的tuple,要注意,度、分、秒都要轉成 Rational
- Exif.GPSInfo.GPSLatitudeRef、Exif.GPSInfo.GPSLongitudeRef 裡存的是度、分、秒的表示字串,如:125.3,67.5,12E