可是遇到兩個問題:
- 他的 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
沒有留言:
張貼留言