我的 Geotagging 方法
因為前幾天老爸問到如何在照片中標示 GPS 記錄下來的經緯度, 因此我決定把我現在用的方法寫下來.
定義: geotagging, 有時候又叫 geocoding, 是一種將地理資訊 (通常是經緯度或大地座標之類的資訊) 標示在照片或其它媒體上的程序, 以使媒體本身跟地理資訊產生實質上的關聯. 詳見 Wikipedia 的這一條.
現在很多 GPS 都有航跡記錄的功能, 我的 Garmin 全系列: eTrex, eTrex Vista TC, GPS V 跟 Edge 305, 以及 WBT-100, 都可以單機記錄航跡, 再用軟體下載航跡到電腦, 產生 GPX 檔. GPX 其實是 XML, 它算是 GPS 的標準交換格式, 裡面可以儲存航點, 航跡, 跟路徑.
中文不太容易區分 “航跡” (track) 跟 “路徑” (route) 的不同, 在英文裡的定義, 航跡是你走過所留下的痕跡, 而路徑是你還沒走就預先規劃要怎麼走的路線. 所以通常 track 是從 GPS 裡傳到電腦, 而 route 是在電腦上畫好後傳到 GPS 上.
Geotagging 做法很簡單, 出去玩的時候把相機的時間調成跟 GPS 一樣 (上次有個天才問我, 為什麼不能把 GPS 的時間調成跟相機一樣, 呃… 我叫他回去自己調調看), 一路拍照一路記錄航跡. 回來以後用軟體比對航跡裡的時間跟照片裡 EXIF 所記錄的拍攝時間, 就可以把那個時刻的經緯度寫到照片的 EXIF 裡.
做法很簡單, 但是我在找適當的軟體時還傷了不少腦筋.
最有名的軟體當然是 RoboGEO, 堪稱 geotagging 天字第一號軟體, 功能強大, 介面漂亮, 但是… 沒註冊的話, 它會在 geotagging 時引入隨機誤差, 讓你的照片偏離航道去撞山. 貴森森. 要價三十五塊美金就算了, 還鎖電腦的序號, 在一台機器上註冊的軟體還不能拿到另一台電腦上用. 所以我決定不甩它.
後來又找到另外一個: JetPhoto Studio. 它的網站上大剌辣地說它是免費的, 結果實際用下去發現沒有註冊的話, 它只讓你用 GPS 航跡標 100 張照片. 註冊要多少錢呢 ? 25 塊美金…
實在不知道這些 geotagging 軟體在跩什麼, 所有的功能都 free, 只要一牽涉到 geotagging 就要收錢. 不知道是這個功能真的很難做, 還是它的附加價值真的很高呢 ?
***
我後來用的是 WWMX: World Wide Medix Exchange 提供的工具. WWMX 是微軟支持的一個計劃, 它鼓勵大家將 geotagging 過的照片上傳給 WWMX, 它會以地理位置去管理這些照片, 目標是成為一個全世界最大的, 以地理位置為索引的照片資料庫. 看來有點跟 Flickr 對抗的味道.
WWMX 提供了幾個工具, 包含上傳照片用的 client 端和 GPS 管理的工具, 其中我用它的 WWMX Location Stamper (可以在這裡下載) 來將 GPX 檔裡的經緯度標到照片的 EXIF 中.
這個 Stamper 需要 .Net Framework 1.1 才能跑, 所以安裝前要先去微軟這裡抓 .NET Framework V.1.1 Redistributable Package 回來裝.
裝好 WWMX Location Stamper 後, 啟動它, 會看到它的主視窗:
畫面左半邊是用來顯示地圖的地方, 右半邊是顯示照片的地方.
接下來, 先把要 tagging 的照片統統丟到一個目錄. 我將上星期六攻五指山的照片放在 D:\temp\gtag 下, 然後在 Location Stamper 裡選 [Photos] -> [Add Photos], 把 D:\temp\gtag 裡的所有照片都加進去. 這個開啟檔案的對話框可以同時選取很多檔案, 所以可以用 Ctal-A 全選, 或是按住 Ctrl 鍵或 Shift 鍵再用滑鼠去點, 來選取多個檔案.
照片加進來後, 會出現在 Location Stamper 的右半邊. 視窗下面的 sliding bar 可以用來改變照片顯示的比例.
我在做 geotagging 拍照時, 一定會對著 GPS 的螢幕拍一張時間, 而且要顯示出秒. 這張照片等一下要來做時間校正. 畫面上這一張就是我那天騎車時, 對著 Edge 305 的螢幕拍的, 可以看到 GPS 當時的時間是下午兩點二十四分四十秒.
接著把滑鼠指標停在照片上一秒鐘, Location Stamper 會浮出一個泡泡視窗, 告訴你這張照片的幾項資訊: 拍攝相機, 拍攝的日期時間, 跟有沒有 geocode 標在上面. 以這張照片來說, 我是用 Minolta 的 X20 拍的, 時間是 11/18 下午兩點二十二分五十八秒, 而照片的 EXIF 資訊裡目前沒有 geocode.
重點來了, 我們發現相機的時間比照片中 GPS 的時間慢了一點點. 用另一個說法就是, 拍照的那一瞬間, GPS 的時間 (也就是地表上你能夠取得一致性同步的, 最準的時間) 是 2:24:40, 但相機的時鐘是 2:22:58. 所以我們要將照片的時間調快一點點, 調多少呢 ? 兩者的時間差是一分四十二秒, 就調這麼多.
因為 GPS 的時間跟相機的時間差了一分四十二秒, 所以所有的照片時間都跟 GPS 差了這麼多, 而我們是以這一張照片當作計算的基準. 因此要調整照片的時間時, 所有的照片都要一起調.
把右邊視窗的顯示比例縮小, 用滑鼠把所有的照片框起來, 變成選取的狀態.
按右鍵, 選 Adjust Timestamps, 來調整這批照片的拍攝時間.
接下來帶出的是 Timestamp Adjustment 對話框. Add 是把時間調晚, Substract 是把時間調早. 在我的例子裡, 因為相機的時間比 GPS 的時間早, 所以我們要用 Add, 加上一分四十二秒.
調完時間後, 可以再把滑鼠游標移到拍攝 GPS 畫面那一張上, 看看照片的拍攝時間是不是已經變成跟畫面中的 GPS 一樣, 兩點二十四分四十秒. 其它的照片應該也全部一起加上一分四十二秒了, 但是我們只能用這張拍攝 GPS 畫面的照片來確認, 因此剛剛那個全選的動作非常重要. 如果你調了某幾張, 事後除了有 GPS 畫面那張以外, 你根本不知道到底哪一張是調過的, 哪一張是沒調過的.
時間對了之後, 我們就可以來載入 GPX 檔了. 這個功能在 [Tracks] -> [Add Tracks]. 我用它載入了當天騎五指山的 GPS log 檔.
GPX 檔載入後, 航跡會顯示在 Location Stamper 左半邊, 如果電腦有連上網路的話, Location Stamper 也會去微軟的 MapPoint 伺服器下載航跡附近的地圖, 把航跡顯示在地圖上. 這是微軟的計劃, 所以就不用肖想它會去抓 Google Earth 的衛星影像來當底圖啦, 也許過一陣子它會有選項讓你去抓微軟的 Virtual Earth 吧.
接下來, 就要讓它幫照片標座標了. 很簡單, 按下畫面右下方 [Apply Tracks] 的按鈕, 會出現一個看起來很複雜的 Apply Tracks to Photos 對話框:
看起來很複雜, 不過其實只有一件事: 處理 Tricky Cases 的原則. 所謂 Tricky Cases 就是 “顯而易見的問題”, 根據 Location Stamper 的說法, 通常是照片的時間沒有對應到航跡上的任何點時, 或是對應到一個 GPS 收訊不良而定位明顯有問題的點. 四個選項分別是:
- 遇到這種狀況時, 不去動這張照片.
- 將有問題的照片移到一個叫 “Tricky Cases” 的分類, 但是不去設定它.
- 照著可能有問題的座標設定, 但是也將照片移到 “Tricky Cases” 分類下, 以便等一下再檢查.
- 不管它, 就照 GPS log 裡的座標設下去
通常 Trick Cases 會發生在 GPS 進入室內但沒有關機的狀況, 或是航跡沒有包括該張照片的時間. 我試著加了一張不同日期的照片進去, 再跑 Apply Tracks, 結果會顯示成這樣:
阿爽的這張照片被歸類到 Tricky Cases 下, 表示它的定位可能是有問題的.
另外 “Always prefer existing location information” 這個選項的意思是, 如果照片的 EXIF 裡已經有 GPS 資料了, 就不要動它. 因此如果是拿標錯的照片來重標的話, 這個勾勾不能打, 不然它怎麼樣都不會幫你重標.
跑完 Apply Tracks 後, 畫面長這樣:
如果畫面右半邊被選取的照片帶有 GPS 座標資訊, 左半邊地圖上就會出現對應的小圓點, 可以用來大致 check 一下位置是否正確. 可惜 Microsoft MapPoint 沒有五指山的地圖, 所以我這批照片標在這個航跡上沒辦法用地圖來 check. 不過看端點的位置, 應該是正確的.
此時 GPS 的經緯度已經寫到照片檔案的 EXIF 裡了, 由於 EXIF tag 跟 JPEG 編碼無關, 所以 Location Stamper 雖然動了圖檔, 但是不會影響到圖檔的品質.
照片的座標標完了, 接下來要幹嘛呢 ? 明天再說.
「上次有個天才問我, 為什麼不能把 GPS 的時間調成跟相機一樣, 呃… 我叫他回去自己調調看」這句經典。XD
我的神啊!我為了個XD 專門去看了篇報道。:-)
超汗啊!
I use digikam with suporting geotagging. You ca try it.