都道府県をぶりぶり膨らませてみた


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/e2102360-a355-8688-0d83-19e900155f31.gif" width=640 /> 

:::note info
これは、[MIERUNE Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mierune)…1日目の記事です。
:::


## はじめに


毎年11月に世界中の地図好きが日替わりテーマに関する数千もの地図作品を[Twitterに投稿](https://twitter.com/search?q=30DayMapChallenge&src=typed_query&f=live)する[#30DayMapChallenge2022](https://30daymapchallenge.com/)というイベントがあり、ことしMIERUNEはチームとして参加しました！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/a36961e8-f074-6645-111b-f4489c5a8d9c.png" width=450 /> 

3日目のテーマはPolygonでして、わたしは主題図の一種である「[Cartogram(カルトグラム)](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0)」というポリゴンを属性値でぶりぶり膨らませる手法を使い、都道府県人口の数値もとにQGISでこの表現をためしてみました。そのやり方を今回は紹介したいと思います。
なお、今回はQGIS 3.22.13(on MACOS 12.6)を使用しています。


## まず1枚のCartogramを作ってみる

データは2016年公開の[国土地理院の地球地図日本(第2.2版ベクタ)](https://www.gsi.go.jp/kankyochiri/gm_jpn.html)の市町村ポリゴン(polbnda_jpn.shp)利用させていだいております、いつもありがとうございます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/d169e806-7109-587c-82de-f28e91eddfd0.png" width=450 /> 



このデータには市町村ごとに[pop]という[人口の属性](https://github.com/globalmaps/specifications/blob/master/gmspec-2.2.pdf)があります。この市町村ごとのデータを都道府県別人口のデータにするために、集計処理をQGISでかけます。プロセッシングツールボックス内の「集計」という機能で、ディゾルブも属性集計も一緒にやってくれるので便利です（今回はじめて知った😂）。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/e6d3dab4-9678-b257-5b57-35ed6d345a11.png" width=600 /> 

地球地図日本には-89999999などの値が[pop]に[入っててちょっと手間がかかるので](https://www.tekito-gottani.com/entry/2017/01/15/160518)、このへんの前処理は割愛しますが、さっさと試してみたい方は[こちらにEPSG3099でGeoJSON](https://github.com/Yfuruchin/30mapdaychallenge/blob/main/2022/03polygon/jpn_pop_gsi_global_map_3099.geojson)をおいてます、適宜DLしてお使いください。

次にCartogram3プラグインをQGISにインストールします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/1b54bd42-1b41-607c-77b5-023837daf095.png" width=450 /> 


インストールが成功すると、ツールバーにCartogram3の多面体ぽいアイコンが表示されます。先ほどの都道府県別人口データをQGISに表示させたあと、Cartogram3のアイコンを押すとこのような設定画面になります。膨らませたいレイヤと計算に用いるフィールド（今回は人口のpop)を設定後とりあえずOkをおしてみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/829f4972-8693-83c3-4880-94e2e854ef62.png" width=600 /> 


マシンパワーによりますが、10-20秒ほどで都道府県がぶりぶり膨らんだ日本のデータが一時ファイルとして生成されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/8338992b-1040-6b7b-e8ab-fcccb173ba85.png" width=500 /> 


[あまりプラグインやアルゴリズムの詳細](https://github.com/austromorph/cartogram3)を見ていないのですが、ユーザーが指定する反復処理までこの計算は行われるようで、プラグイン実行時のmax.number of iterations(最大反復数)の値が大きいほど如実な膨らみを示します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/3db0c2e8-334a-ecb8-9ba3-6efe331f3c6c.png" width=550 /> 

## もう一工夫してアニメーションにする

今回アニメーションを作成するにあたっては、

1. Cartgram3の[max.number of iterations]を0から20までのバッチ処理を行う
2. 各々をPNGで出力
3. FFmpegで動画化

をの流れで行いました。
なお、1で生成されたデータをマージして、QGISのアニメーション機能で流すのもスマートかもしれませんし、モデルを作って一気にやるのもありですね。

今回はとりあえず11フレーム(max.number of iterations=0〜10)で作ってみます。

まず、バッチ処理を行うには、プロセッシングツールボックス内のツリーから[Cartgram]を掘り出して、右クリック→[バッチプロセスで実行]を押しましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/da7842fb-1c86-b836-e522-a3e8256cbf87.png" width=500 /> 


バッチプロセスのウインドウが開くので「＋」マークを10回押して、11回分(0〜10)の処理レコードを作成し、「完了時にレイヤを読み込む」にチェック(ここの冗長性もなんとかしたいけどまずはこのままで)。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/2b3efecd-6d7d-bbb4-d5f0-94882ae75d6f.png" width=600 /> 


ID1行の膨らませる基準となる対象フィールドに[pop]を指定

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/c5c0e8c7-ac3f-e4ef-7016-abf1d08d0550.png" width=300 /> 


他の行は全部繰り返して入力してもよいんですが、「オートフィル」をクリックして「フィルダウン」を選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/8635de74-41de-d9d8-5f9b-7a29bdabb9a0.png" width=300 /> 


するとExcelのように全部同じフィールドが自動で入ります、楽ちん！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/b6091a3c-9d46-8d39-c7ed-ed500331620d.png" width=300 /> 


次に膨らみ具合の調整を行う[max.number of iteration]を行数に基づいて段階的に上げていきましょう。今度は[max.number of iteration]列の「オートフィル」をクリックして「式による計算」を選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/8858d265-14bb-ac88-3c3b-2798a0dd622d.png" width=300 /> 

式文字列ビルダウインドウが立ち上がるので、真ん中の列のrow_number(行数の変数)をダブルクリックすると、左側の式に@row_numberが代入されます （ダイレクトで入力してもよいです）。そのあと、右下の[OK]を押すと…

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/6162300a-0c24-f6ce-dab8-0fcd3433d086.png" width=640 /> 


[max.number of iteration]に0〜10までの値が自動で入力されます、楽ちん！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/db48dc61-aebd-94a7-8e10-d9892f8b4dc4.png" width=350 /> 


Output layer(出力先)も同様に式で作ってしまいましょう（手で入力し続けるのもアレだし同じファイル名にしちゃうとずっと上書きされれてしまうので…）Output layer列の「オートフィル」をクリックして「式による計算」を選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/ebb18af5-c43f-0d0e-1ace-4df9d4fb755f.png" width=450 /> 


先程の応用なのですが、「任意出力先のパス(/Users/hoge/Desktop/)」＋「行番号」＋「.shp」という意味で左の式作成エリアに

`'/Users/hoge/Desktop/' || @row_number || '.shp’`

のテキスト式をいれてみます。（’hoge’は文字列を表し、||は結合を意味します)

なお、今回は出力先を`/Users/hoge/Desktop/`としましたが、お試しになる方は適宜出力先などを変更してください。ちゃんと関数ができていないとウインドウ左下にこのような表示がでますのでご注意を。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/07b1ee19-e8d2-05c2-e504-f5a6c8d312c2.png" width=450 /> 


うまくできていたらこのような値が自動で入力されます、またまた楽ちん！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/2ef15974-ae9a-d896-fb51-523c52cd1999.png" width=350 /> 


 では右下の「実行」を押してみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/764ab181-1db7-696e-f977-a3987033ce2a.png" width=550 /> 


数分かかりますが、自動的にCartogramのぶりぶりとした処理結果が生成され、QGISのマップキャンバス上に表示されます、年輪みたい。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/3dca6b0a-2485-f63b-cc67-1eae93eaff55.png" width=650 /> 


 アニメ化をするには、生成されたデータの凡例やレイアウトをお好きに設定して、今回作成したパラメータのレイヤごとに画像をエクポートしていきます（QGISの機能である「スタイルのコピー」などを活用すると便利ですよ）。ここもモデルビルダーやPythonなどでやってもいいのですが今回は手作業で。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/2a8cbb5b-d496-7ae0-3db4-fe1382198975.png" width=450 /> 


その後、[FFmpeg](https://qiita.com/tags/ffmpeg)がある方は下記のコマンドでアニメ素材のmp4ファイルを作成します

```
$ ffmpeg -r 10 -i %02d.png -c:v libx264 output.mp4
```

これでできあがり！すばらしくぶりぶりしてますね！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/daa3ce8f-3e56-55b6-2187-9cc21cc398fe.gif" width=600 /> 


※なお初心者の方にとってFFmpegは導入やコマンドがちょっと敷居が高いので、別途アニメーション作成ツールなどを用いても良いと思います。

## おわりに

これでぶりぶりと都道府県でも世界地図でも膨らませることができます。
ちなみに[吉田戦車のぷりぷり県](https://csbs.shogakukan.co.jp/book?book_group_id=9115)は個人的にかなり好きなのですがここでお返しできたような気がします()

なお、Cartogramの手法はなかなかおもしろいやり方ではありますが、この表現にはストロングゼロくらいのセンセーショナルなパワーがありますので、用法にはお気をつけくださいね💊👨‍⚕️

### 参考

先人パイセンたちの智慧と共有に感謝しますm(_ _)m

[山仕事：Cartogramプラグインを使ってみた](https://denthor.exblog.jp/22268813/)

[ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~](https://qiita.com/livlea/items/a94df4667c0eb37d859f)

[How to Make Cartograms With Animation](https://metrocosm.com/how-to-make-cartograms-with-animation/)


:::note info
明日の[MIERUNE Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mierune)は@bordoray さんの番です！お楽しみにー
:::