日本地図（分県地図，自治体ごとの地図）の描画

## 1.　境界線データ

R（および，その他のプログラミング言語）で日本地図を描くためには，何と言ってもまず，都道府県境界線のデータを取得必要がある。

色々選択肢もあるかもしれないが，その中で選ぶならば，[国土地理院のウェブサイト](https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_4.html)から取得できる GeoJSON ファイルを使用するのが良いであろう。必要なファイルを前もってダウンロードしておくのが良い。類似記事では直接ファイルに毎回アクセスするような場合もあるが，サーバーへの負担を考えたり，オフラインでの作業も考えると，必要なファイルを一度だけアクセスしてローカルファイルに保存するのがマナーと言うべきであろう。

このファイルには、都道府県とその境界線の情報が含まれている。全国を対象とするファイルも，地域ブロックを対象とするファイルも，各都道府県一つを対象とするファイルも用意されている。ダウンロードする際に，いくつかのアンケートにも誠実に答えよう。そうしなければ，将来的にこのようなありがたいデータが供給され続けるかどうか，危うい状況にもなりかねない。ダイレクトに（毎回）ダウンロードするというのはぜひとも避けてほしい。

## 2.　必要なパッケージの使用宣言

その次には，プログラミング環境ごとに必要なパッケージを用意する必要がある。

ここでは、R を例として取り上げるが，基本的にはどのようなプログラミング環境であろうと，先に上げたダウンロードしたファイルを読み取り，プロットするのに必要なパッケージを用意するということに尽きる。

R では　`sf` を使用する（sf を `install.packages()` するときに， `proxy` が必要と言われた）。以下のコマンドを使用して、これらのパッケージを使用することを宣言する。まだ，インストールしていない場合はそれぞれのパッケージを `install.packages()` する。

`ggplot2` は使いたくないが，一応使い方を示しておく。

```R
# install.packages("sf")
# install.packages("proxy")
# install.packages("ggplot2")
```

```R
library(sf)
library(ggplot2)
```

    Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE

前述した，都道府県境界線のデータファイルを読み込む。ここでは，全国の都道府県データを含む JSON ファイルを対象とする。これがあれば，万能であろう。

このファイルを，このファイルを利用する Julia プログラムと同じ階層に置いておく（わかっている人は，どこに置いてあっても構わない）。

ファイルから，プロットできる状態のデータをデータフレーム df に読み取る。

```R
df = st_read("N03-20210101_GML/N03-21_210101.geojson")
```

    Reading layer `N03-21_210101' from data source 
      `/Users/aoki/Desktop/jupyter-lab/R/N03-20210101_GML/N03-21_210101.geojson' 
      using driver `GeoJSON'
    Simple feature collection with 121158 features and 5 fields
    Geometry type: POLYGON
    Dimension:     XY
    Bounding box:  xmin: 122.9326 ymin: 20.42275 xmax: 153.9867 ymax: 45.55724
    Geodetic CRS:  JGD2011

df がどのような構造になっているかを示す。これがわかれば，他の言語でも適切に処理・描画ができる。

```R
head(df)
```

    Registered S3 method overwritten by 'geojsonsf':
      method        from   
      print.geojson geojson

<table class="dataframe">
<caption>A sf: 6 × 6</caption>
<thead>
	<tr><th></th><th scope=col>N03_001</th><th scope=col>N03_002</th><th scope=col>N03_003</th><th scope=col>N03_004</th><th scope=col>N03_007</th><th scope=col>geometry</th></tr>
	<tr><th></th><th scope=col>&lt;chr&gt;</th><th scope=col>&lt;chr&gt;</th><th scope=col>&lt;chr&gt;</th><th scope=col>&lt;chr&gt;</th><th scope=col>&lt;chr&gt;</th><th scope=col>&lt;POLYGON [°]&gt;</th></tr>
</thead>
<tbody>
	<tr><th scope=row>1</th><td>北海道</td><td>石狩振興局</td><td>札幌市</td><td>中央区</td><td>01101</td><td>POLYGON ((141.3423 43.06682...</td></tr>
	<tr><th scope=row>2</th><td>北海道</td><td>石狩振興局</td><td>札幌市</td><td>北区  </td><td>01102</td><td>POLYGON ((141.4084 43.18395...</td></tr>
	<tr><th scope=row>3</th><td>北海道</td><td>石狩振興局</td><td>札幌市</td><td>東区  </td><td>01103</td><td>POLYGON ((141.4471 43.15616...</td></tr>
	<tr><th scope=row>4</th><td>北海道</td><td>石狩振興局</td><td>札幌市</td><td>白石区</td><td>01104</td><td>POLYGON ((141.4624 43.1001,...</td></tr>
	<tr><th scope=row>5</th><td>北海道</td><td>石狩振興局</td><td>札幌市</td><td>豊平区</td><td>01105</td><td>POLYGON ((141.3846 43.0467,...</td></tr>
	<tr><th scope=row>6</th><td>北海道</td><td>石狩振興局</td><td>札幌市</td><td>南区  </td><td>01106</td><td>POLYGON ((141.0983 43.11764...</td></tr>
</tbody>
</table>

```R
class(df)
```

<style>
.list-inline {list-style: none; margin:0; padding: 0}
.list-inline>li {display: inline-block}
.list-inline>li:not(:last-child)::after {content: "\00b7"; padding: 0 .5ex}
</style>
<ol class=list-inline><li>'sf'</li><li>'data.frame'</li></ol>

```R
class(df$geometry)
```

<style>
.list-inline {list-style: none; margin:0; padding: 0}
.list-inline>li {display: inline-block}
.list-inline>li:not(:last-child)::after {content: "\00b7"; padding: 0 .5ex}
</style>
<ol class=list-inline><li>'sfc_POLYGON'</li><li>'sfc'</li></ol>

データフレームは 6 列からなり，
N03_001　都道府県名
N03_004　市町村名
N03_007
geometry　境界線情報
N03_002　北海道の場合のデータ
N03_003　郡市町村データ

であるが，最重要なのは geometry 列。

## 3.　ggplot で日本全土の地図を描く。

本当は plot() で済ませたいが，全体を対象にすると何故かすごく時間がかかるので，ggplot() での例を示す。

```R
ggplot() +
  geom_sf(data = df) +
  theme_void()
```

![output_10_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/cc2f7838-657b-7130-7a4a-c22cc97f0d6b.png)


## 4.　ある特定の都道府県のみを指定する場合

北海道でもかなり時間がかかるが，これぐらい簡単なら plot でも何の問題もない。

```R
plot(df[df$N03_001 == "岐阜県", "geometry"], col="aliceblue", asp=1)
```

![output_12_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/8d633b42-9c0d-8247-2b17-79e8f592c03d.png)


## 5.　ある特定の都道府県のみを指定する場合

岐阜県と隣接する岐阜県，長野県，山梨県を同時に描画する。

```R
plot(df[df$N03_001 %in% c("岐阜県", "長野県", "山梨県"), "geometry"], col="aliceblue", asp=1)
```

![output_14_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/fdb79992-c068-8d2f-2182-84a52ba3c1ff.png)


## 6.　複数の都道府県を同時に指定し色分けする場合

上と同じく，岐阜，長野，山梨を同時に色分けして描画するというのは，R ではできないかな（ggplot ではできるかもしれない。Julia ではちゃんとできる）。

以下のような図が描きたいのに...
![スクリーンショット 2023-05-02 12.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/74afad81-5833-dbd3-232d-9e93363409a0.png)


## 7.　前節の応用（区域ごとに色分けする）

これも R ではできないかな。Julia ではできる。

以下のような図が描きたいのに...
![スクリーンショット 2023-05-02 12.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/d0684a12-4a4c-4a52-06d0-025e7201ddb9.png)


## 8.　特定の市町村を描画する

ある都道府県の市町村を指定して描画する。

```R
plot(df[df$N03_001 == "愛媛県" & df$N03_004 == "伊方町", "geometry"], col="aliceblue", asp=1)
```

![output_16_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/afd3cd3f-73b9-83c4-1cec-8c596c1cd57b.png)


## 9.　その他の応用

その他も，データフレームから特定のデータを抽出することで，どのような行政区の地図も描くことができる。

```R
plot(df[df$N03_001 %in% c("北海道", "東京都", "沖縄県"), "geometry"], col="aliceblue", asp=1)
```

![output_18_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/93a20d37-8fec-ec0c-58a5-fd7331abc30f.png)


## 10.　さらなる応用

基本がわかれば，いろいろなことができる

- 指定した経緯度に文字列を描く
- 行政区画ごとのデータで色分けする
- 行政区画ごとにグラフを表示する（2次元棒グラフなど）
- その他，あれやこれや

```R

```