
これは、MIERUNE Advent Calendar 2022…1日目の記事です。
はじめに
毎年11月に世界中の地図好きが日替わりテーマに関する数千もの地図作品をTwitterに投稿する#30DayMapChallenge2022というイベントがあり、ことしMIERUNEはチームとして参加しました!

3日目のテーマはPolygonでして、わたしは主題図の一種である「Cartogram(カルトグラム)」というポリゴンを属性値でぶりぶり膨らませる手法を使い、都道府県人口の数値もとにQGISでこの表現をためしてみました。そのやり方を今回は紹介したいと思います。
なお、今回はQGIS 3.22.13(on MACOS 12.6)を使用しています。
まず1枚のCartogramを作ってみる
データは2016年公開の国土地理院の地球地図日本(第2.2版ベクタ)の市町村ポリゴン(polbnda_jpn.shp)利用させていだいております、いつもありがとうございます。

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

地球地図日本には-89999999などの値が[pop]に入っててちょっと手間がかかるので、このへんの前処理は割愛しますが、さっさと試してみたい方はこちらにEPSG3099でGeoJSONをおいてます、適宜DLしてお使いください。
次にCartogram3プラグインをQGISにインストールします。

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

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

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

もう一工夫してアニメーションにする
今回アニメーションを作成するにあたっては、
- Cartgram3の[max.number of iterations]を0から20までのバッチ処理を行う
- 各々をPNGで出力
- FFmpegで動画化
をの流れで行いました。
なお、1で生成されたデータをマージして、QGISのアニメーション機能で流すのもスマートかもしれませんし、モデルを作って一気にやるのもありですね。
今回はとりあえず11フレーム(max.number of iterations=0〜10)で作ってみます。
まず、バッチ処理を行うには、プロセッシングツールボックス内のツリーから[Cartgram]を掘り出して、右クリック→[バッチプロセスで実行]を押しましょう。

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

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

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

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

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

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

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

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

先程の応用なのですが、「任意出力先のパス(/Users/hoge/Desktop/)」+「行番号」+「.shp」という意味で左の式作成エリアに
'/Users/hoge/Desktop/' || @row_number || '.shp’
のテキスト式をいれてみます。(’hoge’は文字列を表し、||は結合を意味します)
なお、今回は出力先を/Users/hoge/Desktop/
としましたが、お試しになる方は適宜出力先などを変更してください。ちゃんと関数ができていないとウインドウ左下にこのような表示がでますのでご注意を。

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

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

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

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

その後、FFmpegがある方は下記のコマンドでアニメ素材のmp4ファイルを作成します
$ ffmpeg -r 10 -i %02d.png -c:v libx264 output.mp4
※なお初心者の方にとってFFmpegは導入やコマンドがちょっと敷居が高いので、別途アニメーション作成ツールなどを用いても良いと思います。
おわりに
これでぶりぶりと都道府県でも世界地図でも膨らませることができます。
ちなみに吉田戦車のぷりぷり県は個人的にかなり好きなのですがここでお返しできたような気がします()
なお、Cartogramの手法はなかなかおもしろいやり方ではありますが、この表現にはストロングゼロくらいのセンセーショナルなパワーがありますので、用法にはお気をつけくださいね💊👨⚕️
参考
先人パイセンたちの智慧と共有に感謝しますm(_ _)m
ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~
How to Make Cartograms With Animation
明日のMIERUNE Advent Calendar 2022は@bordoray さんの番です!お楽しみにー