library(sp)
library(geojsonio)
library(ggplot2)

良い子のみんなは、{geojsonio}パッケージでGeoJSONファイルやTopoJSONファイルが読み込めるのを知っているよね。{geojsonio}は信頼と実績のropensciが作っているパッケージだ!GitHubのページや開発者の一人であるScott Chamberlainさんのブログ記事(その1, その2)に使い方の例があるが、そこに載っているのはアメリカの地図を描画するという話だ。遠いアメリカに思いを馳せるよりも、住んでいる日本の地図を表示させたい…。ファイルがあれば簡単に地図を描画できそうだということで日本地図のTopoJSONファイルを探してみた。

(さわり程度に)探してみたのだけど、国土地理院とか有名なところでも対象ファイルは提供していなかったりする。そんな背景もあってか、利用者の皆さんは各自でファイルを作成されているみたい。ひとまずの例としてTetsuya Yoshida さん作成のJapanCityGeoJsonを紹介する。ファイルの作成方法はQiitaに書かれているので参考にどうぞ(国土交通省のシェイプ形式データから全都道府県市町村郡区のGeoJsonとTopoJsonを作成。 - Qiita )。

やることはScottのブログ記事と変わらない。GitHub上にあるtopojsonファイルを{geojsonio}を使って読み込み、描画させるというもの。ただ、マルチバイトのフォルダ内にあるファイルだと読み込みに失敗するのでご注意。

url <- "https://raw.githubusercontent.com/niiyz/JapanCityGeoJson/master/toyama.topojson"
toyamap <- topojson_read(url)
## OGR data source with driver: GeoJSON 
## Source: "https://raw.githubusercontent.com/niiyz/JapanCityGeoJson/master/toyama.topojson", layer: "富山県"
## with 34 features
## It has 2 fields
plot(toyamap)

ggplot2を使って描画させる場合はfortify()関数を噛ませて、geom_map()を重ねる必要がある。

toyamap %<>% fortify(.)
## Regions defined for each Polygons
ggplot(data = toyamap, 
       aes(map_id = id, x = long, y = lat)) + 
  geom_map(map = toyamap, color = "black", fill = "white")

結果は省略。富山県の地図が描けた。

最後にコロプレス図(ある属性で地図を塗り分ける、みたいなことをしたい場合)の作成方法をメモ。

str(toyamap)
## 'data.frame':    55281 obs. of  7 variables:
##  $ long : num  138 138 138 138 138 ...
##  $ lat  : num  37 37 37 37 37 ...
##  $ order: int  1 2 3 4 5 6 7 8 9 1 ...
##  $ hole : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
##  $ piece: Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
##  $ group: Factor w/ 35 levels "0.1","1.1","2.1",..: 1 1 1 1 1 1 1 1 1 2 ...
##  $ id   : chr  "0" "0" "0" "0" ...

toyama.topojsonには上記の情報が含まれており、groupというのはおそらく市区町村とかの行政区を意味しているのだろうから、今回は単純にその値を元に地図を塗り分けてみる。

ggplot(data = toyamap, 
       aes(map_id = id, x = long, y = lat)) + 
  geom_map(map = toyamap, color = "black", fill = "white") +
  geom_map(data = toyamap, map = toyamap,
           aes(fill = group, map_id = id)) +
  guides(fill = FALSE)

大事なことはキャプテンアメリカが教えてくれた。感謝の気持ちを込めて、6月26日は金曜ロードショーのアベンジャーズを観ます。