1. 境界線データ
Julia(および,その他のプログラミング言語)で日本地図を描くためには,何と言ってもまず,都道府県境界線のデータを取得必要がある。
色々選択肢もあるかもしれないが,その中で選ぶならば,国土地理院のウェブサイトから取得できる GeoJSON ファイルを使用するのが良いであろう。
必要なファイルを前もってダウンロードしておくのが良い。類似記事では直接ファイルに毎回アクセスするような場合もあるが,サーバーへの負担を考えたり,オフラインでの作業も考えると,必要なファイルを一度だけアクセスしてローカルファイルに保存するのがマナーと言うべきであろう。
このファイルには、都道府県とその境界線の情報が含まれている。全国を対象とするファイルも,地域ブロックを対象とするファイルも,各都道府県一つを対象とするファイルも用意されている。
ダウンロードする際に,いくつかのアンケートにも誠実に答えよう。そうしなければ,将来的にこのようなありがたいデータが供給され続けるかどうか,危うい状況にもなりかねない。ダイレクトに(毎回)ダウンロードするというのはぜひとも避けてほしい。
2. 必要なパッケージの使用宣言
その次には,プログラミング環境ごとに必要なパッケージをインポートする必要がある。
ここでは、Julia を例として取り上げるが,基本的にはどのようなプログラミング言語であろうと,先に上げたダウンロードしたファイルを読み取り,プロットするのに必要なパッケージを用意するということに尽きる。
Julia では Plots
とGeoJSON
パッケージを使用する。以下のコマンドを使用して、これらのパッケージを使用することを宣言する。まだ,インストールしていない場合はそれぞれのパッケージを add する。
using GeoJSON
using ZipFile
using Plots
using DataFramesMeta
前述した,都道府県境界線のデータファイルを読み込む。ここでは,全国の都道府県データを含む JSON ファイルを対象とする。これがあれば,万能であろう。
このファイルを,このファイルを利用する Julia プログラムと同じ階層に置いておく(わかっている人は,どこに置いてあっても構わない)。
ファイルから,プロットできる状態のデータをデータフレーム df に読み取る。
jsonbytes = read("./N03-20210101_GML/N03-21_210101.geojson");
fc = GeoJSON.read(jsonbytes)
df = DataFrame(fc);
df がどのような構造になっているかを示す。これがわかれば,他の言語でも適切に処理・描画ができる。
df
Row | N03_001 | N03_004 | N03_007 | geometry | N03_002 | N03_003 |
---|---|---|---|---|---|---|
String | String | String? | Polygon… | String? | String? | |
1 | 北海道 | 中央区 | 01101 | 2D Polygon | 石狩振興局 | 札幌市 |
2 | 北海道 | 北区 | 01102 | 2D Polygon | 石狩振興局 | 札幌市 |
3 | 北海道 | 東区 | 01103 | 2D Polygon | 石狩振興局 | 札幌市 |
4 | 北海道 | 白石区 | 01104 | 2D Polygon | 石狩振興局 | 札幌市 |
5 | 北海道 | 豊平区 | 01105 | 2D Polygon | 石狩振興局 | 札幌市 |
6 | 北海道 | 南区 | 01106 | 2D Polygon | 石狩振興局 | 札幌市 |
7 | 北海道 | 西区 | 01107 | 2D Polygon | 石狩振興局 | 札幌市 |
8 | 北海道 | 厚別区 | 01108 | 2D Polygon | 石狩振興局 | 札幌市 |
9 | 北海道 | 手稲区 | 01109 | 2D Polygon | 石狩振興局 | 札幌市 |
10 | 北海道 | 清田区 | 01110 | 2D Polygon | 石狩振興局 | 札幌市 |
11 | 北海道 | 函館市 | 01202 | 2D Polygon | 渡島総合振興局 | missing |
12 | 北海道 | 函館市 | 01202 | 2D Polygon | 渡島総合振興局 | missing |
13 | 北海道 | 函館市 | 01202 | 2D Polygon | 渡島総合振興局 | missing |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
121147 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121148 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121149 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121150 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121151 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121152 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121153 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121154 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121155 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121156 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121157 | 沖縄県 | 与那国町 | 47382 | 2D Polygon | missing | 八重山郡 |
121158 | 沖縄県 | 所属未定地 | missing | 2D Polygon | missing | missing |
データフレームは 6 列からなり,
N03_001 都道府県名
N03_004 市町村名
N03_007
geometry 境界線情報
N03_002 北海道の場合のデータ
N03_003 郡市町村データ
であるが,最重要なのは geometry 列。
最初に,地図をプロットする際のデフォルト設定を指定しておく(任意)。
以下に示す以外,何でも指定できる。
default(grid=false, # グリッドは描かない
showaxis=false, # 座標軸は描かない
ticks=false, # ティックマークは描かない
color=:aliceblue, # 塗りつぶし色(好きなものを)
lw=1, # 境界線の幅 0.5 ぐらいがいいかも
aspect_ratio=1, # 縦横比 これは 1 以外では困るかも
)
さて本番。色々やってみる
3. ある特定の都道府県のみを指定する場合
plot(df[df.N03_001 .== "岐阜県", :geometry])
savefig("fig1.png")
4. 複数の都道府県を同時に指定する場合
岐阜県と隣接する岐阜県,長野県,山梨県を同時に描画する。
df2 = @rsubset df :N03_001 .== "岐阜県" || :N03_001 .== "長野県" || :N03_001 .== "山梨県";
plot(df2.geometry)
savefig("fig2.png")
5. 複数の都道府県を同時に指定し色分けする場合
上と同じく,岐阜,長野,山梨を同時に色分けして描画する。
plot(df[df.N03_001 .== "岐阜県", :geometry])
plot!(df[df.N03_001 .== "長野県", :geometry], color=:orange)
plot!(df[df.N03_001 .== "山梨県", :geometry], color=:olive)
savefig("fig3.png")
6. 前節の応用(地方ごとに色分けする)
中国地方,四国地方をまとめ,それぞれを同じ色で塗り分けて描く。
plot(df[occursin.(r"山口県|広島県|島根県|鳥取県|岡山県|兵庫県", df.N03_001), :geometry], color=:skyblue)
plot!(df[occursin.(r"愛媛県|香川県|徳島県|高知県", df.N03_001), :geometry], color=:hotpink)
savefig("fig4.png")
7. 特定の市町村を描画する
ある都道府県の市町村を指定して描画する。
これだけ見て,そこが私の出身地!とわからない人もいるかも??
df2 = @rsubset df :N03_001 .== "愛媛県" && :N03_004 .== "伊方町"
plot(df2.geometry)
savefig("fig5.png")
8. その他の応用
その他も,データフレームから特定のデータを抽出することで,どのような行政区の地図も描くことができる。
Julia を使うメリットは,描画領域についての指示をする必要がないということ。描画領域が収まるように自動的に範囲を設定してくれる(少々...いや,かなり時間がかかるが)。
北海道と東京都と沖縄県の位置関係。間に他の府県が描かれていないと認識している距離感との違いが顕になるやもしれない。
df2 = @rsubset df :N03_001 .== "北海道" || :N03_001 .== "東京都" || :N03_001 .== "沖縄県";
plot(df2.geometry)
savefig("fig6.png")
9. さらなる応用
基本がわかれば,いろいろなことができる
- 指定した経緯度に文字列を描く
- 行政区画ごとのデータで色分けする
- 行政区画ごとにグラフを表示する(2次元棒グラフなど)
- その他,あれやこれや
誰か,書いて,描いて...