インターバル撮影したJPEGファイルからGPSログデータを抽出する方法

GPS付きアクションカムでインターバル撮影を行うと、位置情報付きのJPEGファイルがたくさん作成されます。 これを利用して、インターバル撮影中の行動ログをGPSデータとして利用できるようにします。

実行環境

Windows 10 Pro 64bit 日本語版を使用。下記のGPSBabelが実行できる環境なら、他のOSでも実行できると思います。

Linux, Macな環境ではバッチ動かないので、似たようなスクリプトを書いてください。

準備

GPSBabelを使用します。インストール方法などはサイトの説明に従って下さい。

http://www.gpsbabel.org/

変換方法

GPSBabelは、Exifデータ付きのJPEGファイルも入力ファイルにすることが出来ます。このため、JPEGファイルから直接、任意のログデータに変換することが可能です。

しかし、インターバル撮影したファイルは大量です。撮影間隔と時間によりますが、1000枚を超える場合もあります。 GPSBabelには複数JPEGファイルを入力することもできますが、コマンドライン引数の長さに制限がある環境だと、1000枚、2000枚といったJPEGファイルを扱うことができません。

これを解決するため、以下のように変換を行います。

  1. バッチファイルなどで、ディレクトリ内のファイルをリストアップする。このとき、ファイル名や撮影時間などでソートし、位置データの順序がおかしくならないようにする。
  2. 画像ファイルをひとつずつNMEAフォーマットデータに変換し、一時ファイルに追記していく。
  3. 一時ファイルを任意のファイルフォーマットに変換し、GPSデータとして利用できるようにする

追記に適しているため、中間フォーマットにNMEAを使用しています。

NMEAフォーマットのみが必要であれば、2. の手順まででOKです。今回はGoogle Earthで閲覧したいので、KMLに変換するところまでやります。

バッチファイル

以下のようなバッチファイルを用意して、実行します。Linux, Macな環境では動かないので、シェルスクリプトとかに書き換えてください。

@echo off
SET GPSBABEL="C:\Program Files (x86)\GPSBabel\gpsbabel.exe"
SET INPUT=%~f1
SET OUTPUT=%~f2
SET TEMPFILE=%~p2__temp__.txt

IF EXIST "%TEMPFILE%" (
    ECHO 前回の一時ファイルが残っています。
    DEL /P "%TEMPFILE%"
)
IF EXIST "%TEMPFILE%" (
    ECHO 一時ファイルを削除しませんでした。処理を終了します。
    GOTO :EOF
)

IF EXIST "%OUTPUT%" (
    ECHO 出力ファイルがすでに存在するため、処理を終了します。
    GOTO :EOF
)

ECHO 一時ファイルを作成しています...

FOR /f "eol=: delims=" %%F IN (
    'dir /b /a-d /one "%INPUT%\*.jpg"'
) DO (
    %GPSBABEL% -w -i exif -f "%INPUT%\%%F" -x transform,trk=wpt -o nmea -F - >> "%TEMPFILE%"
    ECHO %%F を変換しました
)

ECHO 一時ファイルをKML形式に変換しています...

%GPSBABEL% -t -i nmea -f "%TEMPFILE%" -x transform,trk=wpt,del -o kml -F "%OUTPUT%"

ECHO KMLファイルの作成を完了しました。(%OUTPUT%)

上記のバッチファイルをbabel_batch.batとして保存した場合、以下のように実行します。

babel_batch.bat (入力ディレクトリ) (出力ファイル名)

実行が完了したら、出力ファイル名として指定したパスにKML形式のファイルが作られます。