Rとleafletで国土数値情報の平年値メッシュを可視化する

## 使用したライブラリ

leafletの他、Shapefileの読み込みと編集のためにdplyr, xml2, sfの3パッケージを使った。

``` r:input
library(leaflet)
library(dplyr)
library(xml2)
library(sf)
```

## Shapefileの読み込みと簡単な編集

平年値の気象要素を含むファイルは[国土数値情報ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/)の「2.
制作区域 \> 災害・防災 \>
平年値(気候)メッシュ」からダウンロードできる。次に示す例では、ダウンロードしたzipを展開してあるものとする。

まず、Shapefileを読み込む。フォルダまでの指定で良い。

``` r:input
## シェープファイル読み込み
m1 <- read_sf("G02-12/G02-12_5237-jgd_GML/")
m2 <- read_sf("G02-12/G02-12_5137-jgd_GML/")
m3 <- read_sf("G02-12/G02-12_5236-jgd_GML/")
m <- rbind(m1, m2, m3)
```

このままだと属性名が`G02_001`みたいになっていて辛いので、同梱のxmlファイルから属性名を抽出してこれを設定する。

``` r:input
## 列名の抽出とsfオブジェクトへの付与
x <- read_xml("G02-12/G02-12_5137-jgd_GML/G02-12_5137-jgd.xml")
n <- xml_child(xml_child(x, 4), 1) %>% xml_contents() %>% as_list %>% unlist
names(m)[seq_along(n)] <- n
```

これでこんな感じのsfオブジェクトが完成する。

``` r:input
m[1:5, 1:5]
```

```r:output
Simple feature collection with 5 features and 5 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 137 ymin: 34.66667 xmax: 137.0125 ymax: 34.70833
epsg (SRID):    NA
proj4string:    NA
# A tibble: 5 x 6
  `3次メッシュコード`… `1月降水量` `2月降水量` `3月降水量` `4月降水量`
  <chr>                  <dbl>       <dbl>       <dbl>       <dbl>
1 52370000                 566         608        1233        1305
2 52370010                 563         608        1244        1304
3 52370020                 553         607        1243        1298
4 52370030                 550         606        1235        1291
5 52370040                 535         602        1228        1277
# ... with 1 more variable: geometry <POLYGON>
```

なお、平年値メッシュデータの属性値のうち、降水量、気温、日照時間、全天日射量は、おそらく整数型で格納する都合から0.1単位の値になっている(=値が10倍されている)。そこで、これらは1/10の値に変換しておく。

``` r:input
m <- m %>%
  mutate_if(grepl(pattern = "(降水量|気温|日照時間|全天日射量)", names(.)), function(x) x*.1)
```

``` r:input
m[1:5, 1:5]
```

``` r:output
Simple feature collection with 5 features and 5 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 137 ymin: 34.66667 xmax: 137.0125 ymax: 34.70833
epsg (SRID):    NA
proj4string:    NA
# A tibble: 5 x 6
  `3次メッシュコード`… `1月降水量` `2月降水量` `3月降水量` `4月降水量`
  <chr>                  <dbl>       <dbl>       <dbl>       <dbl>
1 52370000                56.6        60.8        123.        130.
2 52370010                56.3        60.8        124.        130.
3 52370020                55.3        60.7        124.        130.
4 52370030                55          60.6        124.        129.
5 52370040                53.5        60.2        123.        128.
# ... with 1 more variable: geometry <POLYGON>
```

## 地図の描画

leafletを使って地図の上にメッシュデータを描画していく。`label=`にデータを文字列で与えておくとマウスオーバー時に表示されて良い。

``` r:input
target <- "8月最高気温"

## カラーパレット定義
pal <- colorNumeric(palette = "viridis", domain = m[[target]])

leaflet() %>%
  addProviderTiles(providers$CartoDB) %>% 
  addPolygons(
    data = m, 
    color = ~pal(m[[target]]), 
    stroke = FALSE,
    label = as.character(m[[target]])
    ) %>% 
  addLegend(pal = pal, values = m[[target]], title = target)
```

![b117eabf6821247e50079d76542054cc.gif](https://qiita-image-store.s3.amazonaws.com/0/109348/70f25824-3671-2412-e30d-3b07bee81551.gif)



## 参考

  - [leafletではじめるRによる地図プロット](https://kazutan.github.io/JapanR2015/leaflet_d.html)