星期五, 8月 13, 2010

pyexiv2 裡的 Rational 與 GPSCoordinate

要存GPS的相關tag到圖片時,因為某些tag要求存Rational或GPSCoordinate,我不知道該怎麼轉換,所以花了不少功夫查。我基本上是參考 這個老先生的code,他主要是使用 GPS tracker,所以會要讀取 tracker 裡的紀錄,然後以時間跟照片做比對,再把 GPS 位置寫進圖片裡。

可是遇到兩個問題:
  1. 他的 code 是用 surd 處理 Rational,我找不到 surd 了。
  2. 算出來的度、分、秒不準確。


首先是解決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

沒有留言: