見出し画像

Memo: AppleWatchのワークアウトののGPSログの整理について

散歩するときにAppleWatchでワークアウトの記録をしています。

ワークアウトのGPS記録

後で、これまでのログを地図と重ねてどこを歩いたのかを確認したり、歩いていない場所を探したりしています。今回は、AppleWatchのワークアウトのGPSログを抽出する方法を紹介したいと思います。地図と重ねる方法についてはGoogleMapやQGISなどを使っていますので機会があれば紹介したいと思います。

ワークアウトのデータからGPX形式のファイルでログを取り出す方法は、今の所2つ使っています。

①iPhoneのヘルスケアアプリで記録を全部ダウンロード
全データの一括ダウンロードしかできないので、ダウンロードしてから必要なデータを探し出す必要はあります。

ヘルスケアアプリ→ 概要 → 右上のアイコン(編集の上)→
下にスクロールして「すべてのヘルスケアデータを書き出す」を選択
書き出し中の表示(かなり長時間待って)→書き出したデータのダウンロード選択
となります。
データはZIPでまとめられていますので、パソコンで展開して必要な部分を取り出すことになります。
ZIPファイルを展開した apple_health_export/workout-routes 以下にGPXデータがあります。

②アプリGPSPickerを使って個別にダウンロード
ログ毎にダウンロードできるので便利です。メールやメッセージに添付したり、AirDropでMacに転送したりできます。
単機能のアプリですが便利に使わさせていただいています。(感謝)

この2つ以外にもワークアウトのGPSデータの抽出方法で良い方法があれば教えていただければと思います。

GPXデータの間引きについて
ワークアウトのGPSデータは1秒周期で収集されているので、4〜5kmぐらい散歩するだけで1MB程度の容量にもなります。散歩の経路がわかれば良いので、データを間引く方法を考えてみました。

ということで、
Pythonとgpxpyライブラリを使ってみたところ、10分の1以下のデータ量で経路を表現できることがわかりました。

ライブラリを見つけられればPythonの威力はすごい!!と思います。
(現役時代にはこんな便利なものはありませんでした。)

ご参考 サンプルコード
macOS にHomebrewでPyhton3をインストールして使ってます。gpx_reduce.py 使い方は下記を参照してください。

trackデータの許容距離は散歩で0.25ぐらいが良いかと思います。
間引きのアルゴリズムは「Douglas-Peuckerアルゴリズム」とのことです。(詳細を理解していないので詳細は調べていただければと思います。

Pythonの勉強ちゃんとしていないので醜いコードかと思います。ご容赦ください。

% gpx_reduce.py 入力ファイル名 出力先のディレクトリ trackデータを間引き指標
#!/opt/homebrew/bin/python3
#
import sys
import os
import gpxpy
from pytz import timezone

dt_tz = timezone('Asia/Tokyo')

argvs = sys.argv
argc = len(argvs)
if argc != 4 :
    print("引数が正しくない!")
    print('argc=', argc, 'argv=', argvs )
    exit()

dir = os.path.dirname(argvs[1])
file = os.path.basename(argvs[1])
outdir = os.path.dirname(argvs[2])

print(outdir) 
print(file)

mdist = float(argvs[3])


with open( argvs[1], 'r', encoding='utf-8') as r_fp:
    gpx = gpxpy.parse( r_fp )

    dt = gpx.tracks[0].segments[0].points[1].time.astimezone(dt_tz)
    strtime = dt.strftime('%Y%m%d%H%M%S')  

#
#  必要があれば
#  gpx.creator='クリエータ' と設定するとGPXデータのクリエータを指定できます。
#  指定しないとヘルスケアのGPSログからデータを抽出したアプリ名などが
#  GPXデータのクリエータとなります。座標や時刻には影響はありません
# 

    for track in gpx.tracks :
        track.name =  strtime

        track.simplify( max_distance=mdist ) # Ramer-Douglas-Peucker algorithmによりtrackデータを間引き
        for seg in track.segments :
            for pt in seg.points :
                pt.extensions = []

    dst = os.path.join( outdir, strtime ) + '.gpx' 
    print(dst)
    
    with open( dst , 'w', encoding='utf-8' ) as w_fp:
        w_fp.write( gpx.to_xml())

隠居の日課なので、ただ散歩すればいいのにとは思いますが、つい余分なことを考えてしまします。さらなる精進が必要と「ねこ師匠」に言われている気がします。

ねこ師匠1号


この記事が気に入ったらサポートをしてみませんか?