Memo: AppleWatchのワークアウトののGPSログの整理について
散歩するときにAppleWatchでワークアウトの記録をしています。
後で、これまでのログを地図と重ねてどこを歩いたのかを確認したり、歩いていない場所を探したりしています。今回は、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())
隠居の日課なので、ただ散歩すればいいのにとは思いますが、つい余分なことを考えてしまします。さらなる精進が必要と「ねこ師匠」に言われている気がします。
この記事が気に入ったらサポートをしてみませんか?