日記に位置情報を追加する

GPSフォトサーチを使えば、Garminで取得した比較的精度のいい移動ログ情報から写真の撮影位置が割り出せます。
(スマホは、バッテリー節約のために位置情報の取得頻度を低くしてあることが多いので、スマホで撮った写真に埋め込まれている位置情報は実際とずれがちです。GPS精度が低いわけではないんですが。)

でもたとえば、音声レコーダーからの文字起こしで文字のメモを残せたとして、それがどの位置での話なのかをさくっと知る方法が今ないなあ・・・と思っていました。

とりあえずGarminからエクスポートしたGPX形式のログがCSV化できれば、

温湿度ログみたいに時刻でマッチングできそうかな。

GPXをCSV化する

GPXをCSVに変換するサービスってネットでちらほら見つかるんですが、どれも変換後のCSVには緯度と経度の2列しかなくて、時刻マッチングに使えませんでした。

そんなこまったときにはAI頼み。ChromeOSのLinux環境で動く変換スクリプトをまたClaudeに書いてもらいました。

#!/bin/bash

# 使用方法を表示する関数
show_usage() {
    echo "使用方法: $0 input.gpx output.csv"
    echo "必要なパッケージ: xmlstarlet"
    exit 1
}

# エラーハンドリング
set -e

# 引数チェック
if [ "$#" -ne 2 ]; then
    show_usage
fi

input_file="$1"
output_file="$2"

# xmlstarletがインストールされているか確認
if ! command -v xmlstarlet &> /dev/null; then
    echo "エラー: xmlstarletがインストールされていません"
    echo "Ubuntuの場合: sudo apt-get install xmlstarlet"
    echo "macOSの場合: brew install xmlstarlet"
    echo "ChromeOSの場合: sudo apt install xmlstarlet"
    exit 1
fi

# 入力ファイルの存在確認
if [ ! -f "$input_file" ]; then
    echo "エラー: 入力ファイル '$input_file' が見つかりません"
    exit 1
fi

# ヘッダー行を書き込む
echo "時刻,緯度,経度" > "$output_file"

# GPXファイルを解析してCSVに変換
xmlstarlet sel -N gpx="http://www.topografix.com/GPX/1/1" \
    -t -m "//gpx:trkpt" \
    -v "concat(
        translate(
            substring-before(gpx:time, '.000Z'),
            'T',
            ' '
        ),
        ',',
        @lat,
        ',',
        @lon
        )" \
    -n "$input_file" >> "$output_file"

echo "変換が完了しました: $output_file"

実際のGPXファイルの先頭部分を参考データとしてアップロードしてこのスクリプトを生成してもらったので、GPXのフォーマットによってはこれだと動かないこともあるかも?

スプレッドシートでの時刻マッチング

温湿度ログのときは、ロガーのタイムスタンプが分単位だったので、秒まである日記のタイムスタンプは秒部分をカットしてマッチングさせたんですが、今回はちょっとややこしいです。

GPSログのタイムスタンプは秒単位なんですが、毎秒の記録があるわけじゃなくてだいたい数秒空いているので、秒で厳密にマッチングさせるとなかなか当たりません。かといって、分でマッチングさせると最大1分間の移動分位置がずれてしまいます。

インラインスケートの路面状況記録とかはわりと精度がいるから、時刻は前後の近い秒とマッチングしてほしいなあ・・・

と思って調べてみると、

一致モード: [省略可 - デフォルトは 0] 検索キーの一致とみなす基準を指定します。

  • 0 は完全一致です。
  • 1 は完全一致、または検索キーより大きい次の値を一致とみなします。
  • -1 は完全一致、または検索キーより小さい次の値を一致とみなします。
  • 2 はワイルドカードの文字列に一致する値を一致とみなします。

XLOOKUPの一致モードを1とか-1で指定すれば、近い秒にヒットさせられるようです。

1か-1のどちらかに寄せればいいかとも思ったんですが、せっかくなので、等速直線運動をしてると仮定して1と-1の間のどの位置にいたかを比例配分で計算する式を書いて最終案としました。

2024年の保存版日記CSVに、この緯度経度から生成したGoogleマップのURLの列を追加してみたんですが、Journeyみたいにマップ上でメモを一覧表示するみたいなこともなんとかできひんかなあ。

コメント

読み込み中...