MATLAB のR2021b が9/23にリリースされました
1年に2回のアップデートがあるMATLAB の最新バージョンR2021b が日本時間の9月23日にリリースされました。
毎回、どんな新しいツールや新機能、機能強化があるのかなとリリースノートを眺めるのが楽しみなのですが、今日R2021b のリリースノートを眺めていると、Mapping Toolbox に魅力的な新機能が。
readgeotable という関数が登場して、位置情報を含むテーブルを直接読み込めるようになり、GPX ファイルにも対応しているのです。
【MathWorks】MATLAB のreadgeotableのドキュメント
こちらの記事で紹介しましたが、GPX ファイルはApple Watch でエクササイズするときに使うApple のアプリ「ワークアウト」のデータを「ヘルスケア」アプリからエクスポートすると登場するファイルフォーマットです。
ウォーキング、ランニング、サイクリングなどをしたときのワークアウトデータが1つ1つGPX ファイルとして保存されています。
R2021a まではgpxread かreadstruct で
Mapping Toolbox にはR2012a から使える gpxファイル読み取りのための関数gpxread があります。
【MathWorks】MATLAB のgpxreadのドキュメント
ただ、ワークアウトのGPX ファイルに使ってみると、位置情報(Lat、Lon、Elev)は読み込まれますが、ランニングやウォーキングに記録される速度の情報が含まれていません。GPX ファイルには含まれているので、gpxread で読み込むときにデータが無視されてしまっているようです。
p = gpxread(fullfile('workout-routes', 'route_2021-08-16_6.09pm.gpx'));
disp(p)
Code language: Matlab (matlab)
実行結果
いくら.gpx のファイル拡張子になっていても、gpxread ではワークアウトのGPX ファイルを完全に読み込めません。
そこでgpx ファイルをテキストエディターで開いて閃いたのですが、拡張子こそ違えど、XML 形式のファイルなので、R2020b にMATLAB 本体に導入されたreadstruct が使えると思いつきました。
【MathWorks】MATLAB のreadstruct のドキュメント
サンプルは下記のとおりです。
% GPX ファイルをXML として読み込み
xmlObj = readstruct(fullfile('workout-routes', 'route_2021-08-16_6.16pm.gpx'), 'FileType', 'xml');
% 構造体からテーブルに変換
tbl = struct2table(xmlObj.trk.trkseg.trkpt);
% extensions カラムを展開
tbl2 = struct2table(tbl.extensions);
for n=1:length(tbl2.Properties.VariableNames)
varname = tbl2.Properties.VariableNames{n};
tbl.(varname) = tbl2.(varname);
end
% 展開し終えたextensions カラムを空にする
tbl.extensions = [];
% 地図にランニングの速度のヒートマップをプロット
geoscatter(tbl.latAttribute, tbl.lonAttribute, 36, ...
[tbl.speed/max(tbl.speed) zeros(length(tbl.speed), 1), 1-tbl.speed/max(tbl.speed)], 'filled')
Code language: Matlab (matlab)
実行結果
この方法でしばらく解析していたのですが、構造体で読み込んだ後にテーブルに変換して、入れ子になってしまうextensions というカラムをfor 文で展開するのが面倒だなぁとは思っていました。
R2021b ではreadgeotable で一発で
それが、R2021b に登場したreadgeotable 関数を使うと劇的に楽になります。
早速ワークアウトのGPX ファイルに使ってみましょう。テーブルなのでhead 関数で先頭8行のプレビューもできます。
tbl = readgeotable(fullfile('workout-routes', 'route_2021-08-16_6.16pm.gpx'));
head(tbl)
Code language: Matlab (matlab)
実行結果
緯度経度がShape というカラムにgeopointshape という形式で保存されています。ちゃんとランニングの速度データもSpeed カラムに入りましたね。GPX ファイルのデータを完全にテーブルとして取り込めています。
地図への速度データのヒートマッププロットは先ほどと同じgeoscatter でできます。
tbl というテーブルに入れていますが、カラムの名前が変わっているのでそこだけが違いですね。
geoscatter(tbl.Shape.Latitude, tbl.Shape.Longitude, 36, ...
[tbl.Speed/max(tbl.Speed) zeros(length(tbl.Speed), 1), 1-tbl.Speed/max(tbl.Speed)], 'filled')
Code language: Matlab (matlab)
本来はhead 関数でのプレビューは無くて良いので、ワークアウトのGPX ファイルをreadgeotable で読み込んで、geoscatter で可視化するまでたったの2行でできます。実行時間もtic とtoc で計測したら手元のノートパソコンでは0.2秒以内で済みました。実行時間も速いですね。
MATLAB のR2021b のMapping Toolbox の新機能readgeotable を使って、Apple Watchのヘルスデータ解析がますます楽しくなってきました。
さらにカラーマップやカラーバーを出すには
上記では速度の速いものが赤、遅いものが青でプロットしていますが、予め定義されたカラーマップを使って楽しちゃいましょう。さらにカラーバーを付けてみます。
<meta charset="utf-8">tbl = readgeotable(fullfile('workout-routes', 'route_2021-08-16_6.16pm.gpx'));
geoscatter(tbl.Shape.Latitude, tbl.Shape.Longitude, [], tbl.Speed, 'filled')
c = colorbar;
c.Label.String = 'Speed [m/s]'; % カラーバーのラベルを設定
c.Limits = [0 5]; % カラーバーの上下限を設定
Code language: Matlab (matlab)
実行結果
これでどこで走る速度が上がったり下がったりしているのか見やすくなりましたね。
ただ、一番速いのが黄色っていうのは直感と合わないので、カラーマップをデフォルトのparula から変えてみましょう。
青→黄緑→黄→オレンジ→赤と滑らかに変わっていくturbo にしてみます。
先ほどのコードの最後に以下を追加します。
colormap turbo
Code language: Matlab (matlab)
実行結果
これなら速いところが赤くて直感に近くなった気がします。
視覚的な印象を変えるカラーバーとカラーマップ、意外に重要ですね。
No responses yet