2021-12-18

Emacs Lispでgpxを解析して過去に自分がいた位置を求める

前回、JPEG画像のExif情報から撮影日時と撮影場所(GPS情報)を取得する方法について書きました。

しかしスマホのカメラなら良いのですが私が持っている普通のカメラではGPS情報は記録されません。何とかならないものでしょうか。

撮影日時は記録されているので、別途時刻と位置を記録したリストがあればそこから割り出すことが可能です。幸い登山中はGeographicaのようなGPSアプリで位置を記録しています。この手のソフトはGPXという形式で位置情報を出力できます。なので、GPXファイルを読み込んで指定した日時の緯度と経度を割り出すものを作成しました。

misohena/my-location: Emacs Lisp code that finds where you were in the past from GPX files.

また、Googleのロケーション履歴にも常に位置情報が記録されています。こちらは端末が発した全位置情報がJSON形式でダウンロード可能です。非常にサイズが大きいのですが、Node.jsを使って1日分ごとにGPXファイルへ変換しました。

求めたい日付に対応するGPXファイル名の検索パターンを作成し、検索し、マッチしたGPXファイルを読み込む仕組みになっています。登山等で作成した 20120304_丸丸岳.gpx のようなファイルも先頭の日付部分にマッチするので2012年3月4日の位置を調べるときには読み込まれます。

GPXはXMLなので、Emacsの libxml-parse-xml-region 関数で簡単にリストへ変換できました。後は記録されている点と点の間を球面で補間するだけでした。

前回のものと合わせると、任意の写真の撮影位置を推定できます。

(let* (;; FILEからExifを読み込む。
       (exif (or (my-exif-parse-file file)
                 (error "No Exif Data")))
       ;; 撮影日時を取得する。
       (time (or (my-exif-date-time-original exif)
                 (error "No Exif.DateTimeOriginal")))
       ;; 撮影位置を取得する。
       (latlng (or (my-exif-latlng exif) ;;From GPS Info
                   (my-location-latlng-at-time time)))) ;From GPX File
  latlng)

Pingback / Trackback