コロプレス(統計表現地図) Choroplethを作ってみたい、ということで辿り着いたのがR言語のleafletRパッケージ(github.com/chgrl/leafletR/)。
シェープファイル読み込み ⇒ コロプレス作成 ⇒ 描画
という流れがスムーズなのかもしれないが、leafletRのおかげでLeafletでTopoJSONファイルを描画できるようになった。
コロプレスも少ないコマンドで作れる。
地球地図日本のpolbnda_jpn.shpには、あらかじめ人口データ popが入っているので、それを使って色塗り(色分け)してみる。
2014年のデータなので、新しいデータは統計局からダウンロードするなど手を加えなければならないが、このまま利用する。
データのチェック
今一度QGISの属性テーブルでpolbnda_jpn.shpのデータを見直してみると手直しする点がいくつかあった。
まず島や飛地がある市町村について、複数の地物(ポリゴン)データを1つのデータにまとめる。マルチポリゴン MultiPolygon化。
QGISのベクタ - 空間演算ツール - 融合で
融合フィールドに市町村コードの列(adm_codeが該当)を指定してまとめる。
市町村の列(laa)を指定してまとめると同名の市町村(例えば山形県小国町と熊本県小国町)がまとまってしまうので注意。
総地物数は2914から1750へ。
人口データが消えてしまう市町村があったので(-89999999のデータが残ってしまう)、チェックしながら気長に手直し。もっとスマートな方法があるはずだが……。
北方領土6村の人口データは-99999999となっているので、便宜上0とした。
市町村がUNK(=Unknown)となっている東京都の地物データは、八丈島・青ヶ島の南の鳥島のデータ。東京都だが、どの市町村にも属していない珍しい地域。
まとめたにもかかわらず、秋田県東成瀬村、島根県隠岐の島町の地物データが2つあったので、合っていない市町村コードの方の地物データを消去。
総地物数は1748。
令和元年現在、日本の市町村数は1724。
+ 東京23区
+ 鳥島
で1748。合っている。
2014年以降、日本の市区町村数(東京23区含む)は1747(北方領土6村含む)のまま。
2014年、栃木県下都賀郡岩舟町 ⇒ 栃木県栃木市編入以降、市町村の合併・編入は行われていないので、市町村数は変わっていない。
市制施行、市名変更はあるが、図形情報は基本的にそのまま使える。
- 2014年 岩手県岩手郡滝沢村 ⇒ 岩手県滝沢市
- 2016年 宮城県黒川郡富谷町 ⇒ 宮城県富谷市
- 2018年 福岡県筑紫郡那珂川町 ⇒ 福岡県那珂川市
- 2019年 兵庫県篠山市 ⇒ 兵庫県丹波篠山市
レイヤ - 属性テーブルを開く - カラムを削除する
で特に必要ではないカラム(=列)を4つ削除。
GeoJSON ⇒ TopoJSON ⇒ mapshaperで簡素化。
ファイルサイズ600KB弱。
簡素化しすぎると地物データが消滅して、nullデータができてしまう。沖縄県渡名喜村が一番目に消えてしまった。
ソースコードのミスではなく、データがおかしい場合もエラーが出る。また、ミスがあるのにエラーが出ない場合もある。
データのチェックは大変重要かつ大変。
leafletRでコロプレス
整えてサイズを小さくしたTopoJSONファイル(polbnda_jpn_ctv.topojson)を作業するディレクトリ(C:/……)に置いて、R起動。
ファイル - ディレクトリの変更
leafletRパッケージのインストール。
library(leafletR)
階級分け、凡例づくりが肝。
JPctv_style <- styleGrad(prop="pop", breaks=seq(0,4000000,by=500000), style.val=rev(heat.colors(8)), leg="2014年人口", fill.alpha=0.8, lwd=1, col="grey")
prop(=property)に列名。人口データ pop。
breaks=seq(0,4000000,by=500000)は、人口0人~400万人を階級幅50万人で分ける、という意味。
style.val=rev(heat.colors(8))で、カラーパレット設定。計8階級。
カラーパレットはheat.colors()の他、
- cm.colors()
- topo.colors()
- terrain.colors()
- rainbow()
leg(=legend)は凡例のタイトル。
その後はポリゴンの透過度など。
JPctv_map <- leaflet(data="polbnda_jpn_ctv.topojson", title="2014pop", base.map="osm", style=JPctv_style, popup="*")
でJSONファイルを読み込んで処理開始。
Your leaflet map has been saved under C:/……
⇒ C:/……にHTMLが生成される。
ベースマップは、OpenStreetMapを指定。
popup=(“*”)の*は全てのカラム(列)をポップアップ。
生成されたHTMLをいじれば、ポップアップしたくないカラム(列)を削ることができる。
その他、leaflet.jsなどのプラグインを最新のものに変えたり ……。
日本語の文字化けはHTMLの文字コードをUTF-8に変えることで解消される。
生成されたHTML コロプレス(2014年人口) →
東京が23区に分かれたままなので、東京23区(東京特別区)が目立たない。
東京23区が人口最多だが、海外の知らない人が見ると横浜市が中心に見えるはず。
データが視覚化されると分かりやすいが、読み違えないよう注意。