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

Android 檔案系統用哪個好? ext3 或 ext4?

因為看到有人說 ext4 在 Android 裡的表現比 ext3 好,就想說來試試看。

本來是打算用 Quadrant 來評測,可是跑完以後,他會要上傳數據到網站上才能得到結果,我的 device 沒辦法連上網,所以只能放棄。後來改用 Linux 傳統的 iozone 來做,下載、解開 iozone tarball 以後,用

make CC=/opt/arm-2009q1/bin/arm-none-linux-gnueabi-gcc GCC=/opt/arm-2009q1/bin/arm-none-linux-gnueabi-gcc LDFLAGS=-static linux-arm

就可以編譯出來了。(我的ARM toolchain 放在 /opt/arm-2009q1 下)

丟到 device 上執行的時候跑了好幾次,都沒成功,只能降低最大 record size 跟最大 file size,然後就行了。我用的指令如下:

/bin/iozone -R -a -q 2048 -g 4096

從最後得到的報告看起來 ext4 是略優於 ext3 的,但是使用上的感覺並不是很明顯,可能是因為沒有用大檔案的關係吧,以後再仔細試試看。