写真に位置情報を記録する

半年程前にハンディ GPSGarmin eTrex Vista HCx (英語版) を購入しました。元々は山登りの為に買ったんですが、最近は写真に位置情報を追加するために使うことが多いです。今回は、Linux で写真に位置情報を記録する方法について説明します。

自分が買った eTrex シリーズは、最近の Linux カーネルにはドライバが収録されていて、USB ケーブルで繋ぐと USB/シリアル変換デバイスとして認識されます。

以下は、GPS を繋いだときの /var/log/messages です。GPS が /dev/ttyUSB0 として認識されたことが分かります。

May 31 18:46:17 galeon kernel: usb 1-3: new full speed USB device using ohci_hcd and address 4
May 31 18:46:17 galeon kernel: usb 1-3: configuration #1 chosen from 1 choice
May 31 18:46:18 galeon kernel: usbcore: registered new interface driver usbserial
May 31 18:46:18 galeon kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
May 31 18:46:18 galeon kernel: usbcore: registered new interface driver usbserial_generic
May 31 18:46:18 galeon kernel: drivers/usb/serial/usb-serial.c: USB Serial Driver core
May 31 18:46:18 galeon kernel: drivers/usb/serial/usb-serial.c: USB Serial support registered for Garmin GPS usb/tty
May 31 18:46:18 galeon kernel: garmin_gps 1-3:1.0: Garmin GPS usb/tty converter detected
May 31 18:46:18 galeon kernel: usb 1-3: Garmin GPS usb/tty converter now attached to ttyUSB0
May 31 18:46:18 galeon kernel: usbcore: registered new interface driver garmin_gps
May 31 18:46:18 galeon kernel: drivers/usb/serial/garmin_gps.c: garmin gps driver v0.31

この /dev/ttyUSB0 は、Debian では dialout グループのデバイスとして認識されます。

$ ls -la /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 2008-05-31 19:16 /dev/ttyUSB0

そのため、一般ユーザで GPS を使用するには、使用するユーザを dialout グループに加えておきます。

# usermod -a -G dialout h2onda

GPS から移動経路の情報(トラック)を抽出するには、GPSBabel を使用します。

GPSBabel 自体は WindowsMac にも対応した OSS で、GPS データ形式の変換や GPS からの情報の読み書きを行うソフトです。

トラックの抽出は、以下のコマンドで実行します。

$ gpsbabel -t -i garmin -f /dev/ttyUSB0 -o gpx -F track.gpx
オプション 説明
-t トラックの抽出を行う。他にはルート(-r)、ウェイポイント(-w)などが指定可能。
-i 入力ファイルタイプを指定。今回は Garmin GPS を入力として使用するので garmin を指定。
-f 入力ファイル名。今回は /dev/ttyUSB0 を指定。
-o 出力ファイルタイプを指定。今回は gpx を指定。
-F 出力ファイル名。

これで track.gpx として、トラック情報を取り出せます。GPSBabel は Google Earth で使われている KML 形式など、色々などファイルフォーマットを使用できますが、今回、位置情報を写真に記録する際に使用する gpscorrelate が gpx のみに対応しているので、gpx 形式を使用します。

gpscorrelate は、位置情報記録のための Linux 用プログラムです。debian testing だと、aptitude コマンドでインストールできますが、他のディストリビューションだとソースコードからインストールする必要があるでしょう。

gpscorrelate コマンドを実行する際は、先ほど取り出したトラックファイルや、UTC からの時差*1などのオプションを指定して実行します。

$ gpscorrelate -g track.gpx -M -z +9 *.jpg
オプション 説明
-g 使用するトラックファイル(GPX形式)を指定する。
-M 画像の変更日時(mtime)を修正しない。
-z GPSデータの時刻がUTCで記録されている場合に時間を修正する。日本では+9。
-t 位置情報が記録できなかった期間についても補完を行う。
-r 位置情報を削除する。

gpscorrelate は gpscorrelate-gui という GUI プログラムも同梱されているので、そちらを使用することも可能です。

さて、これで位置情報が記録されるわけですが、GPS が衛星を捕捉できなかった期間に撮られた写真については、位置情報は記録されません。もし、捕捉できていない期間の写真にも位置情報を追加する場合は、-t オプションを追加します。

$ gpscorrelate -g track.gpx -t -M -z +9 *.jpg

これでGPSが位置を記録していない期間についても位置情報を追加してくれますが、単純に線形補完で位置を決定しているため、かなり誤差の大きい位置情報が記録されることがあるので注意しましょう。

誤差が大きい場合等、写真についた位置情報を削除したい場合は -r オプションで gpscorrelate を使用します。

$ gpscorrelate -M -r *.jpg

こうして位置情報を追加した写真は、Panoramioなどの位置情報に関連したサービスを使う際に便利です。

*1:eTrexUTCで時刻を記録しています。