Python + folium で Strava の "全"記録を地図で可視化 (2) - ヒートマップ編

hiboma.hatenadiary.jp

前回の続きで Strava の記録をヒートマップにする

ヒートマップをつくる

folium のプラグインでヒートマップも手軽に生成できることを知ったのでスクリプトを書いた。大したモノじゃないんだけど。

  • よく通るルートは目立つように
  • 滅多に通らないルートは控えめに

という可視化ができるんじゃないかと試行錯誤して、結果、なかなかビジュアル映えするものができて満足

サンプル1

過去の走行データを全てまとめてプロットすると よく走っているエリアが赤くなって表示される。練馬付近が真っ赤だ

f:id:hiboma:20170914154242p:plain

ズームレベルを上げると、どの道路を頻繁に通っているか色で判別できる

f:id:hiboma:20170914154324p:plain

東秩父・奥武蔵の山が連なる当たりを見てみよう。

f:id:hiboma:20170914154343p:plain

中央の峠道が赤くなっているが、実は2-3度しか訪れてない場所なのだ … なぜ赤くなるのだろう?

実は Garmin Edge (≒ 計測器・サイクルコンピューター) で1秒ごとに現在の緯度・経度を記録するモードにしている。したがって、山道を登っている = 速度が遅くなることで計測点が密になり、ヒートマップ化の際に密度が高いポイントとして計算されてしまうのだった。同様に、自転車を押しながら徒歩でウロウロしているポイントなども密に記録されている。

私がやりたいのは「頻繁に通過する ≒ 異なる日時に通過している」ルートが目立つようすることなので、「日時が異なる計測点が重なる場合に色を変えるヒートマップ」という実装が必要そうだが、さてはて、どうやるのがいいんだろうね?

サンプル2

タイルサーバーや配色を変えると全然違った印象の地図になる

bin/heatmap.py --gradient '{ "0.4":"blue","0.65":"cyan","1":"white" }' --radius 3 --blur 4

チェレンコフ光ぽい色を選ぶと無駄に見栄えがいい

f:id:hiboma:20170921142044p:plain

厨二感を出すには背景色は黒ベースがいいだろう。 漆黒の闇に瞬きし我が蒼炎の軌跡。よくワカラナイ

f:id:hiboma:20170921142106p:plain

少しだけズームレベルを上げる。自宅付近が光ってしまうので ある程度のズームレベルで許して

f:id:hiboma:20170921152350p:plain

ズームレベルを最大にするとパーティクル状にプロットされているのが確認できる。前述の通り Garmin Edge で 1秒ごとに緯度・経度を記録するモード にしてるので、緯度・経度を計測したポイントが として表現されるのだ

f:id:hiboma:20170914152807p:plain

一旦、デフォルトカラーに戻したマップで別の地点を見てみよう

f:id:hiboma:20170914155250p:plain

鎌倉に行った際に鶴岡八幡宮に寄り道した際の記録だ。参道の入り口や境内に点が密集していて、速度を落としてうろついているのがわかる。思い返すと、景色の良い場所で自撮りしたくて自転車を押しながらウロウロしていたのだった。

… とあれこれ思い出せる地図にもなってくれた

サンプル3

bin/heatmap.py --gradient '{ "0.4":"blue","0.65":"red","1":"white" }' --radius 2 --blur 1 

更に色を変えてみる。赤を混ぜるとグロいって思う人もいるかな 💀

f:id:hiboma:20170914152931p:plain

ウネウネしながら触ってくるやつをおもいだす

f:id:hiboma:20170914153023p:plain

f:id:hiboma:20170914153212p:plain

f:id:hiboma:20170914151208p:plain

彩色を変えることで違ったプレゼンテーションとなる地図をつくれる。かっこいい配色があればアドバイスしてほしい

Strava の Global HeatMap

前回のエントリを書いている途中で知ったのだが、 Strava では Global HeatMap という名称で利用者の走行記録をヒートマップにして閲覧できる機能を提供している

labs.strava.com

Strava のヒートマップは複数の計測点をあれこれ正規化するなどして扱っているので、 folium のヒートマップとはアプローチが違うようだ。

f:id:hiboma:20170921120254p:plain

カッコイイし面白い。荒川の彩湖付近だが、川沿いのサイクリングロードが人気なのがひと目で分かる

f:id:hiboma:20170921120257p:plain

ロード乗りは山が好き。秩父のあたりの山道が真っ赤

f:id:hiboma:20170921120722p:plain

正規化のやり方は下記のブログに書いてある通りだと思う。さて、どうやって実装しているのだろう

medium.com

The normalization is very local, taking into account the 8 neighboring tiles. For each tile the 95% percentile, non-zero, GPS count is computed. These values are averaged into 4 corner “heatmax” values for the current tile. The count for every pixel is divided by the bilinear interpolation of those values, capped at 1. This [0,1] value is used to color each pixel using a gradient function. You can see the local effect on roads that branch away from popular routes.

プライバシー

画像をご覧になって理解できると思うが、私の過去の行動パターンや現在の居住地などがはっきりと見て取れる地図になるので一般公開は差し控える。ご了承を 😲

コード

github.com

コードはここにあげております。ユーザーフレンドリーなレベルまで作り込めてないのはご了承を 😳