サッカーのヒートマップをQGISで作ってみる

サッカーのヒートマップをQGISで作ってみる
===================

![Kobito.dcEkpU.png](https://qiita-image-store.s3.amazonaws.com/0/100567/174f07a5-b0f4-44d3-6be5-d9a3b5a1765f.png "Kobito.dcEkpU.png")


##はじめに

**年末オープンジオかくし芸大会** でおなじみの、[FOSS4GAdventカレンダー2016](http://qiita.com/advent-calendar/2016/foss4g)の4日目です。

学生さんや一般の方などにGIS的な事例を持ってくる場合、カーナビとか[FlightRadar24](https://www.flightradar24.com/)とかをネタにすると、つかみとしてわかりやすく伝わります。
もちろん最近では最近ではPokémon GOなどが実位置とイベントと大規模処理という面でとても良い例ですよね、

あと、GIS的な表現方法として、スポーツのヒートマップが最近よく見られます。これはスポーツにおけるボールやプレーヤーの位置や統計をわかりやすく表現するやりかたで、あたらしいデータジャーナリズム的観点からも、大変興味深いです(経験則だけでドヤリングされる解説者についてのボヤキは以下略)。

これをQGISで作れたら面白いなーと考えていまして、今回はちょっとやってみましょう。

##データどこよ

それな。データ探し大変なのよ。

けっこう[データを探している人](http://opendata.stackexchange.com/questions/5813/football-soccer-player-x-y-t-data)がいて、
回答に
http://home.ifi.uio.no/paalh/dataset/alfheim/
というありがたいサイトが紹介されていました。

こちらは、画像解析の論文で作成されたcsvのデータペーパーで、下記のような出典明示で使用可能です。オープンサイエンスGJ。

>Soccer video and player position dataset": S. A. Pettersen, D. Johansen, H. Johansen, V. Berg-Johansen, V. R. Gaddam, A. Mortensen, R. Langseth, C. Griwodz, H. K. Stensland, and P. Halvorsen, in Proceedings of the International Conference on Multimedia Systems (MMSys), Singapore, March 2014 

なお、処理にかかわる論文は[こちら](http://home.ifi.uio.no/paalh/publications/files/mmsys2014-dataset.pdf)

![Kobito.dorgEF.png](https://qiita-image-store.s3.amazonaws.com/0/100567/cd7a8f33-deaa-e269-788f-ed6e9fa79751.png "Kobito.dorgEF.png")
 S. A. Pettersen et al.(2014)

この研究では1〜3台のカメラを使ってプロサッカーチームの試合ビデオを解析し、ボールとプレイヤーの位置関係を算出しました。このデーターペーパではノルウェーの一部リーグの所属しているトロムソIL（Tromsø IL）の3試合分の選手やボールの動きなどに関するデータセットが配布されています。

データセット内のCSVは前半・後半別のものもありますが、原点を(0,0)mとして、ピッチ内の(105,68)mまでの範囲内での、主に20Hz(0.05秒間隔）と1Hz(1秒間隔)における選手やボールの位置となっています。

全部の試合データ処理をやってると面白くて元旦の天皇杯までかかりそうなので、今回は、2013/11/28に開かれたヨーロッパリーグ2013−2014でのトロムソIL -トッテナム・ホットスパーFCの試合でとられた20Hzデータを用います。50万レコードくらいなので、おためしにはちょうどいいぐらいかもしれません。（1秒間隔でもやってみましたが、すぐフィールド定義が把握できなかったので追々）

なお、参考までにこの試合の結果やスタッツは[こちら](http://uk.soccerway.com/matches/2013/11/28/europe/uefa-cup/tromso-idrettslag/tottenham-hotspur-football-club/1584818/)です。こういうのもさくっと出てくるの素敵。
※てか[雪ふってるし](http://footballingtube.blog93.fc2.com/blog-entry-19578.html)


##QGISにとりこむ


CSVをダウンロード後、ちょこっとみますとなんかもうえらいことに
![Kobito.8Ryq1l.png](https://qiita-image-store.s3.amazonaws.com/0/100567/ce7a0b55-1202-c327-4b49-df003dcab589.png "Kobito.8Ryq1l.png")






ここは落ち着いてQGISを起動し、デリミッドテキストレイヤの追加ボタン![Kobito.1Pa7oh.png](https://qiita-image-store.s3.amazonaws.com/0/100567/a346e04a-cee7-4dc1-20b6-ee9c7a045d1a.png "Kobito.1Pa7oh.png")を押しましょう。
その後、ダイアログがでてきますので、一行目にはフィールド名がないため、「最初のレコードはフィールド名を保持している」をオフにして、[Field_3]をX、[Field_4]をYとしてCSVデータを取り込んでみましょう

![Kobito.oGqm8W.png](https://qiita-image-store.s3.amazonaws.com/0/100567/931a4375-09c3-7b07-87a8-e7ca85b62ddc.png "Kobito.oGqm8W.png")

なお、取り込み後に投影法とか聞いてきますが、今回はお試しなので、メートル単位のよく使われるEPSG3857：WGS 84 / Pseudo Mercatorにしておきます。

さすれば
![Kobito.BVCt6R.png](https://qiita-image-store.s3.amazonaws.com/0/100567/620df098-2d72-1cba-f305-36bf184a4f3b.png "Kobito.BVCt6R.png")

どーん、スチールウールですやんこれ…
落ち着いて、レイヤプロバティの凡例から、TagIDの指定となっている[Field_2]で凡例をわけてみます
![Kobito.Aoq6Vz.png](https://qiita-image-store.s3.amazonaws.com/0/100567/426055eb-e0f2-ac40-6458-ddb0dd625b05.png "Kobito.Aoq6Vz.png")

これでみるとIDは1〜14でわけられており、試合記録と比較をすると両チームとも3人交代を行っていますから、14人のプレーヤーなのかしらと思いましたが、背番号やチームとの対応情報は見当たりませんでした。
もしくは、このデータは45分しかないので、片方のチーム選手11人と審判3人なのかもしれません（もうすこし真面目に精査したらどこかに載ってるかもしれませんが、まあこのまますすめちゃいます）。
http://uk.soccerway.com/matches/2013/11/28/europe/uefa-cup/tromso-idrettslag/tottenham-hotspur-football-club/1584818/



##QGISでCSVを整理

仕方ないのでIDの2だけでみてみるとけっこうよさげなのでこのデータをつかっていきます。2番さん頑張ってんな！
![Kobito.CVxLUf.png](https://qiita-image-store.s3.amazonaws.com/0/100567/7cc6c024-c8ba-983e-64f9-3ec9fcc1dedf.png "Kobito.CVxLUf.png")


やり方はいろいろあるでしょうが、とりあえず各IDごとにSHPを分割します。

まず、CSVのレイヤのままだとうまくいかないと思うので、CSVレイヤを右クリックして「名前をつけて保存」を選び、SHPにエクスポートします。

![Kobito.k4r7WI.png](https://qiita-image-store.s3.amazonaws.com/0/100567/0405c41f-e484-388c-34e9-4dfc329a6810.png "Kobito.k4r7WI.png")

![Kobito.qIfwQY.png](https://qiita-image-store.s3.amazonaws.com/0/100567/1342107a-8238-12ba-8048-857375235546.png "Kobito.qIfwQY.png")


エクスポートしたSHPをIDごと、分割してみます。
ベクタメニュー→データマネージメントツール→ベクタレイヤの分割を選び、

![Kobito.WFyByI.png](https://qiita-image-store.s3.amazonaws.com/0/100567/c94e3287-513b-392d-03aa-4c104e97cbea.png "Kobito.WFyByI.png")


分割の基準となるユニークIDを[Field_2]に指定、あと出力フォルダは任意に（たくさんデータがつくられるので、新しいフォルダを準備したほうがベターです）

![Kobito.ciAWGy.png](https://qiita-image-store.s3.amazonaws.com/0/100567/18762a29-238a-876a-31ac-07bcbd61d601.png "Kobito.ciAWGy.png")


んで、フォルダをみるとこのように14セットのSHPファイル群が生成されているはずです

![Kobito.5Lz3bi.png](https://qiita-image-store.s3.amazonaws.com/0/100567/837ffd10-2c8f-da02-244e-b96854597a57.png "Kobito.5Lz3bi.png")

##QGISでヒートマップをつくる

では番号ごとにデータが分割できたので、2番くんのデータからヒートマップをつくってみます。ヒートマップは統計ソフトR通したりいろいろ細かいやり方はありますが、QGISでは定番のヒートマッププラグインをつかって表現してみましょう。
ラスタメニュー→ヒートマップ→ヒートマップ
![Kobito.V8cjSz.png](https://qiita-image-store.s3.amazonaws.com/0/100567/4e12a84b-ad6c-1b88-5d9d-dec125f15d5b.png "Kobito.V8cjSz.png")

ほぼデフォルトで検索半径を10レイヤ単位（今回はmと読み替え可能）とします
![Kobito.3loUBw.png](https://qiita-image-store.s3.amazonaws.com/0/100567/a4d755f6-7448-b774-4d13-88ed0d9019d2.png "Kobito.3loUBw.png")

さすれば、どーん
![Kobito.PMkAqL.png](https://qiita-image-store.s3.amazonaws.com/0/100567/85c0fa1d-0c3f-4019-b8e0-6e713c919708.png "Kobito.PMkAqL.png")

つぶれたイカスミちくわの断面みたいでなんかよくわかんないので、
作成したラスタのプロバティ
![Kobito.w40Hwn.png](https://qiita-image-store.s3.amazonaws.com/0/100567/551e8351-f79c-0628-085c-6c73d8ffc15a.png "Kobito.w40Hwn.png")
から、
下記のような設定にして、分類ボタンを押して、OKを押すと
![Kobito.zhhIjM.png](https://qiita-image-store.s3.amazonaws.com/0/100567/09903ce7-b2b9-f4d7-1186-75bf58631193.png "Kobito.zhhIjM.png")

お、なんかすごいものができつつある…
![Kobito.asE6OL.png](https://qiita-image-store.s3.amazonaws.com/0/100567/6db46a17-ac05-a738-8d29-7aba78ae8636.png "Kobito.asE6OL.png")

しかしこのままでは、サッカーのヒートマップなのか、雨の日に拾ってきた子猫ちゃんをふところに隠して、ママハハロボのサーモカメラでチェックを受けているときの画像なのかわからないですよね…

##背景つくる

なぜよくわからないのか？
どんなに素晴らしいデータでも、背景がないと意味がわからないのですよね、背景地図重要。ということで、サッカーフィールドのSHPとかGeoJOSNとかあったらとても嬉しいのですが、ちょっと見当たらないので、作ってみます。
素材はwikimediacommonsさんからいただきます、
![image](https://qiita-image-store.s3.amazonaws.com/0/100567/d43dd44d-b783-1cba-38b2-8d003180aebc.png)
[(C) NielsF CC BY-SA 3.0](https://commons.wikimedia.org/wiki/File:Football_pitch_metric.svg
)

WTKとかで書いてもいいんですが、とりあえずこのsvgをTIFFにして最大68X105mになるようにジオリファレンスして重ねてみます
![Kobito.c1PbE2.png](https://qiita-image-store.s3.amazonaws.com/0/100567/ef574d1e-9a22-f7c4-26eb-ea2797a55cb6.png "Kobito.c1PbE2.png")

お、なんかそれっぽくなってきた

![Kobito.FpwaSK.png](https://qiita-image-store.s3.amazonaws.com/0/100567/cdc1bec1-dded-6369-f97a-dbc1bc09705d.png "Kobito.FpwaSK.png")

ここまで来るともうベクタでも欲しくなってきちゃったので、ラスタからベクタに変換します
※SVGをラスタにしてベクタにしてるがwまあいいや（別名：餅から米をつくる作業）

![Kobito.FLBwTm.png](https://qiita-image-store.s3.amazonaws.com/0/100567/1fa2daa2-5722-5e19-240c-6c41b30d62d4.png "Kobito.FLBwTm.png")

うむ、それっぽい。

##データと合わせるつくる

背景もそれっぽくなってみたので、2番くんのヒートマップ透過かけたりして調整してみます。
![Kobito.9HXrts.png](https://qiita-image-store.s3.amazonaws.com/0/100567/1134162c-9398-e6ec-3659-c4e40f743202.png "Kobito.9HXrts.png")

おお、いいですねえ。
ほかにも、4mメッシュを作成して
![Kobito.Piafft.png](https://qiita-image-store.s3.amazonaws.com/0/100567/f396591b-dc07-f7f3-3d16-fa8dca7685a9.png "Kobito.Piafft.png")

メッシュ内のカウントを行うと
![Kobito.Y1gIGA.png](https://qiita-image-store.s3.amazonaws.com/0/100567/b6638b2a-e4b4-049c-4eb0-96461c0bd194.png "Kobito.Y1gIGA.png")


このような表現にもなります

![Kobito.OxaDzR.png](https://qiita-image-store.s3.amazonaws.com/0/100567/db490bfe-e940-cc7b-0053-d0c3b6c5a2be.png "Kobito.OxaDzR.png")

##3Dにしてやろう

もうここまで来たら、みんなだいすき[Qgis2threejsプラグイン](http://qgis2threejs.readthedocs.io/ja/docs-release/)を使って3D化しちゃうとワクワクが止まらないですよね


まず、ヒートマップやカウントの値をそのままZに持っていくと、富士山くらいの高さになってしまうので、world設定から高さを0.001倍にしておきましょう。

![Kobito.otB030.png](https://qiita-image-store.s3.amazonaws.com/0/100567/b4fc7b01-4ad9-cd81-f6b8-4e36e1fee1b9.png "Kobito.otB030.png")


これで2番さんのヒートマップラスタを処理するとこんなふうに

![Kobito.dcEkpU.png](https://qiita-image-store.s3.amazonaws.com/0/100567/174f07a5-b0f4-44d3-6be5-d9a3b5a1765f.png "Kobito.dcEkpU.png")

メッシュをオーバレイにしてもOK

![Kobito.a2HuQV.png](https://qiita-image-store.s3.amazonaws.com/0/100567/77331c48-e34e-d4a5-52e6-4d98dbe7277e.png "Kobito.a2HuQV.png")

メッシュを浮かせてみることもできる
![Kobito.V6luPf.png](https://qiita-image-store.s3.amazonaws.com/0/100567/ef3edd87-2055-c982-cab5-b84dc923e4ad.png "Kobito.V6luPf.png")


おお、なんかいいですね

##まとめ

ということで、なんかここまでやってD3とかやったらすぐおわりそうな事に気づいたのですが（）、それはまあさておき、QGISでそれっぽい絵や表現もいろいろできそうで楽しいです。

ほかにもCARTOにぶっこむとか、山手線をプレーヤー全員で競争させるとかやってみたかったんですが、きょうはこの辺にしておきます。

**もうこれでサッカーのビジュアライゼーションはおれのものだぜ！** と息巻くところですが、いいデータがないとちょっと今回のお遊びはできないのです…

まあ他力本願もアレなので、考えられることとして

1. 野球のストライクゾーンとかでやってみる 
2. 上のデータペーパーをいじりまくる
3. 論文に従って自分で試合会場にいって3台カメラを設置して処理
4. プロサッカー選手になって、からだにGPSと加速度センサーを内蔵させてだいかつやくする

…ぐらいしか思いつきませんがいまのところ2が妥当なところでしょうか（もしほかに使い勝手の良いデータあればお教えください）。
もちろん4もたいへん夢があってわたしはだいすきです。

プロサッカーなどのこのようなデータは[OPTA](http://www.optasports.com/)といった会社があるように、各チームの戦略分析にはなくてはならないものですし、視聴者へのコンテンツ素材としても非常に価値が高いデータですから、そう簡単にでてくるものではないのでしょう。

最新のデータではなく、たとえば1986年のワールドカップとかのデータでもいいので、CSVなどでちょろっと公開していただけるといろいろ楽しいのにな、と思っています；）。

とはいえ、QGISを使った可視化レクチャーなどで、AEDや避難所といったややお硬めのデータ以外にも、こんなデータを使うのもよいかもしれませんね。