RでGIS：塗り分け地図（コロプレス図）を作る

#はじめに
Rで塗り分け統計地図（コロプレス図）を作る方法がいろいろあるようで，それぞれ長短あったりして調べていて混乱したので自分用にいくつか備忘録としてメモしていきます。


* 塗り分け地図についてのみ延べています。他のタイプのGISには触れません。
* GISはたまにしか使わないので情報が古かったり，間違ってる部分があるかもしれません。何かあればコメントください。


#塗り分け地図の主要な作成方法

## 1. {choroplethr}パッケージ
静的な地図（１枚の画像）を作るだけで，ズームしたり動的なことはできないが，少なくとも日本全国レベルの地図を作る分にはシェープファイルが不要（内蔵されている）のでいちばん簡単かもしれない方法。

{choroplethrAdmin1}を使えば，日本の全国レベルのシェープファイルが内蔵されているのですぐに地図を描くことができる

```{r}
library("choroplethr")
library("choroplethrAdmin1")
admin1_map("japan")　#白地図（黒地図？）を作成
```
![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/201348/74f9f774-0f48-f38b-e1b4-010716420763.png)


内蔵されているdf_japan_censusデータを使ってみる

```{r}
# df_japan_censusデータ
data(df_japan_census)
head(df_japan_census)
```


|   |region | pop_2010| percent_pop_change_2005_2010| pop_density_km2_2010|
|:--|:------|--------:|----------------------------:|--------------------:|
|23 |aichi  |  7411000|                          2.2|               1434.8|
|5  |akita  |  1086000|                         -5.2|                 93.3|
|2  |aomori |  1373000|                         -4.4|                142.4|
|12 |chiba  |  6216000|                          2.6|               1205.5|
|38 |ehime  |  1431000|                         -2.5|                252.1|
|18 |fukui  |   806000|                         -1.9|                192.4|


```{r}
# df_japan_censusデータ
PlotData <- data.frame(region = df_japan_census[, 1], value = df_japan_census[, 2])
#プロット
admin1_choropleth(country.name = "japan",
                  df           = PlotData,
                  title        = "2010 Japan Population Estimates",
                  legend       = "Population",
                  num_colors   = 3)
```
![Rplot02.png](https://qiita-image-store.s3.amazonaws.com/0/201348/870bc415-e693-de48-c044-d16b7356bf9e.png)

###参考
[Rでウェブ解析：コロプレスを簡単にプロット!「choroplethr」パッケージ](https://www.karada-good.net/analyticsr/r-81)



## 2. {leaflet}パッケージ
動的な地図を作ることができる。

{leaflet}を使う場合でも，addCircles()などの地図の上に統計データの値に基づく図形（値が大きい地域ほど色が濃いとか，図形が大きいとか）を描くタイプの地図ならば地域名から{geocode}で座標を取得すればよいが，

addPolygons()で塗り分け地図を作成したい場合，地形のデータとしてシェープファイル（Shapefile）を使う必要がある。シェープファイルは外部サイトなどからダウンロードして読み込んで使う。

###シェープファイルの主な入手先
[Global Administrative Areas](http://www.gadm.org/country)
↑ 世界レベル（国ごとに塗り分け）や全国レベル（県ごとに塗り分け）のマクロな地図データ，および，市区町村レベルのミクロな地図データの両方が公開されている。
Rの{sp}パッケージなどで使われるSpatialPolygonsDataFrame(.rds)というファイル形式でDLできる。

[ESRI ジャパン 全国市区町村界データ](http://www.esrij.com/products/data/japan-shp/)
↑日本の市区町村レベルのミクロな地図データ

[国土数値情報　行政区域データ](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v2_3.html)
↑日本の市区町村レベルのミクロな地図データ

[{jpndistrict}パッケージ](https://suryu.me/post/rgis_advent_calendar_day1/)
↑日本の行政区域の地図データをパッケージに内蔵しており簡単に読み込むことができるようになるパッケージ


### Rの実践
今回は[Global Administrative Areas](http://www.gadm.org/country)から入手した日本の全国レベルのシェープファイル(JPN_adm1.rds)を使う。



次のような手順で実行していく
1. 地図データ（予めダウンロードしておいたシェープファイル）を読み込む
2. 統計データを読み込み，地図データとデータの順番が一致しているか確認する
3. 上2つのデータをleaflet()に投入して描画する

```{r}
library(maps)
library(mapproj)

# 1.地図データの読み込み：ダウンロードしたシェープファイルを使う
jpn.shp <- readRDS("data/JPN_adm1.rds")
plot(jpn.shp)
```

{dplyr}のglimpse()で.rdsの中身を簡単に確認することができる。

```{r}
library(dplyr)
glimpse(jpn.shp) #{dplyr}のglimpse()で中身を確認
```

次に地図データに流し込むための統計データを読み込む。
ここでは，例として先程の{choroplethr}のdf_japan_censusデータを使う

```{r}
# 2.統計データの読み込み
library("choroplethr")
data(df_japan_census)

# 2-1.都道府県名などで一致する列を見つける（toupper()は英文字列を大文字にする関数）
table(toupper(jpn.shp@data[["NAME_1"]]) == toupper(df_japan_census$region))
  # 長崎が'Naoasakiになっているスペルミスなどで一致しない行が２つあったが，データの順番は問題ないのでプロットに使用可能


# 3.plot
library(leaflet)

# 塗る色（連続値のカラーパレット）をセット
pal <- colorNumeric("Blues", domain=df_japan_census$pop_2010, reverse=F)

# マウスオーバー時の表示内容を設定（sprintf()で実数表記など指定）
labels <- sprintf("<strong>%s</strong><br/>%5.0f",
                  paste0(jpn.shp@data$NL_NAME_1),
                  df_japan_census$pop_2010) %>% lapply(htmltools::HTML)

# 地図にプロット
jpn.shp %>% 
  leaflet() %>% 
  # setView() : 地図を日本にズームした状態で表示する
  setView(lat=37, lng=139, zoom=5) %>% 
  # addProviderTiles() : 背景のタイルを指定
  addProviderTiles(providers$CartoDB.Positron) %>% 
  # addPolygons() : 塗り分け地図の描画
  addPolygons(fillOpacity = 0.5,
              weight=1,
              fillColor = ~pal(df_japan_census$pop_2010),
              label = labels,
              labelOptions = labelOptions(
                style = list("font-weight" = "normal", padding = "3px 8px"),
                textsize = "15px",
                direction = "auto"),
              highlight = highlightOptions(
                weight = 5,
                color = "#666",
                dashArray = "",
                fillOpacity = 0.7,
                bringToFront = TRUE)) %>% 
  # addLegend() : 凡例の設定
  addLegend("bottomright", pal = pal, values = ~df_japan_census$pop_2010,
            title = "2010年の人口分布"  )
```

マウスオーバーでポップアップ表示する動的できれいな地図ができる。
![Rplot05.png](https://qiita-image-store.s3.amazonaws.com/0/201348/8f8d5b2b-d7ac-963e-ebac-c765138e6c48.png)


### 参考
[{flexdashboard}と{leaflet}でGISっぽいダッシュボードを作る - INPUTしたらOUTPUT!](http://estrellita.hatenablog.com/entry/2017/06/15/081752)




# その他参考文献・関連分野リンク
[leafletでのSpatialPolygonsDataFrameの扱いのメモ - Technically, technophobic.](http://notchained.hatenablog.com/entry/2015/11/02/002717)

[SpatialPolygonsDataFrameをUnionするときのメモ - Technically, technophobic.](http://notchained.hatenablog.com/entry/2015/10/31/182515)

[leafletで国土地理院タイルを使う - Technically, technophobic.](http://notchained.hatenablog.com/entry/2015/10/26/231508)

[leafletでMapbox（とかいろいろな地図）を使う - Technically, technophobic.](http://notchained.hatenablog.com/entry/2015/10/23/213223)