デジカメで撮ったファイルに位置情報(ジオタグ)を付けたい

以前ネコの写真を整理したときに

すべての写真に位置情報がついていれば!!

と強く思ったので、手軽に位置情報を付ける方法を探していた。

Googleフォトに写真をアップロードすると、ロケーション履歴に基づいた「撮影場所(推定)」が表示されて非常に便利。

f:id:gae:20201114081051p:plain

これと同じことができないかと調べてみたが、ロケーション履歴のデータをエクスポートしてみると、経路がパスになっていて、地点ごとの時間情報が入ってなかった。

↓この図の黒い点の部分の時間情報がない
f:id:gae:20201113201813p:plain

Googleは保存しているんだろうけど、それを取得する方法がないのでどうにもならない。(たぶん)
仮に可能だったとしても、ロケーション履歴の取得は手作業でやるのがちょっとだるいという問題もある。

いったんロケーション履歴のデータは諦めて、素直にスマホで位置情報を記録してみることに。
位置情報の記録はこのアプリを使ってみた。

ちょっと動きがわかりにくいアプリだけど、慣れれば使えそう。
エクスポートは、txt、gpx、kml の3種類のフォーマットをサポートしている。
このなかの gpx が私の欲しかったデータだった。

gpx ファイルがあれば、exiftool を使って簡単に位置情報を付加できる。

exiftool.exe -geotag history.gpx "-geotime<${DateTimeOriginal}+09:00" -api GeoMaxIntSecs=1800 image1.jpg image2.orf image3.dng image4.arw image5.cr3 video1.mpg video2.mov

以下、個人的な使い方。
c:\app などに geotagging.bat と geotagging.py を作成。
geotagging.bat の中身は python を呼び出すだけ。

pushd %~dp0
python geotagging.py %*
pause

shell:sendto (送る)に、geotagging.bat へのショートカットを設置。
geotagging.py は渡されたファイルをより分けて gpx ファイルを -geotag パラメータにして exiftool を呼び出す。

import sys
import subprocess


def main():
    gpx_files: [str] = []
    image_files: [str] = []

    for f in sys.argv[1:]:
        if f.lower().endswith(".gpx"):
            gpx_files.append(f)
        else:
            image_files.append(f)

    if len(gpx_files) != 1:
        print("gpxファイルが指定されていません\n", sys.stderr)

    cmd = f'exiftool -geotag {gpx_files[0]} ' \
          + '"-geotime<${DateTimeOriginal}+09:00"' \
          + f' -api GeoMaxIntSecs=1800 ' + ' '.join(image_files)
    print(f"{cmd}\n")
    subprocess.call(cmd)


if __name__ == '__main__':
    main()

スマホのアプリでログをGmailにシェア。Gmailはすぐ終了する。(ログが付いた下書きが保存される)
PCでGmailの下書きを開いてログを取得し、画像ファイルと同じ場所にコピー。
Explorer で画像ファイルとgpxをまとめて選択して、sendtoからgeotagging.batを起動すれば完了。

まあまあ手間はかかるけど、あまり作り込み過ぎてもあれなのでこれくらいに。