leafletRでシェープファイルからOSM上に塗り分け地図

Leaflet - a JavaScript library for mobile-friendly maps

というインタラクティブ地図のためのJavaScriptライブラリがある。GeoJSONファイルを用意して、leafletのスクリプトを書いてやれば、OpenStreetMapの上にインタラクティブ機能付きでデータを可視化できる。

これの作業をR上でやってくれるのがleafletRパッケージ。

福岡県の市町村別高齢化率(平成26年)の塗り分け地図(コロプレス図)を作成してみる。

# leafletRパッケージを使って、Shapefileから
# leafletJSを使ったインタラクティブな地図(コロプレス図)を作成
# leafletJS: http://leafletjs.com

library(leafletR)
library(rgdal)

tmp <- tempdir()

# 国土数値情報の行政界(平成26年度、福岡県)のシェープファイルを編集して、
# 各市町村の高齢化率を属性テーブルに追加した。
# 高齢化率は福岡県の高齢者人口及び高齢化率の推移
# (http://www.pref.fukuoka.lg.jp/contents/koureika-suii26-2.html)
# のエクセルファイルより取得。
url <- "http://stat.fwu.ac.jp/~fujino/hateblo/20150510/fukuoka.zip"

file <- basename(url)
download.file(url, file)
unzip(file, exdir=tmp)

# シェープファイルをSpatialPolygonsDataFrameとして取り込む
fukuoka <- readOGR(dsn=paste0(tmp,"/fukuoka"), 
                        layer="fukuoka", encoding="Shift_JIS")

# GeoJSONオブジェクトに変換
# ちょっと時間がかかる
fukuoka.dat <- toGeoJSON(data=fukuoka, name="fukuoka", dest=tmp)

# スタイルの設定
# propは塗り分ける属性テーブルの列名、breaksは階級、
# style.valは階級の色、legは凡例のタイトル
fukuoka.style <- styleGrad(prop="agingrate", breaks=seq(10,40,by=5),
                    style.val=rev(heat.colors(6)), leg="Aging Rate",
                    fill.alpha=0.7, lwd=0.5)

# leafletJSのスクリプトを含むHTMLファイルを生成
# シェープファイルの属性テーブルにマルチバイト文字が含まれていて
# 文字コードがUTF-8でない場合にはここでエラーが出る
fukuoka.map <- leaflet(data=fukuoka.dat, dest=tmp, title="Aging Rate in Fukuoka",
                    base.map="osm", style=fukuoka.style, popup="*")
# ブラウザに表示
fukuoka.map

ポリゴンをクリックすると属性テーブルの情報がポップアップで表示される。
f:id:nonki1974:20150510225238p:plain

動くのは以下のリンクで。
Aging Rate in Fukuoka

githubで公開されているRStudioのleafletパッケージの方がポップアップのカスタマイズができたりと高機能な感じはするけど、まだ試していない。