Help us understand the problem. What is going on with this article?

Rのtmapパッケージでインタラクティブな主題図の作成&ウェブ上での公開

all2.png

Rでインタラクティブマップを作成する方法はいくつかありますが今回はtmapを使用します。
tmapはレイヤの重ね合わせをggplot2のように+で表現し、描画をオブジェクトに格納できるので非常に使いやすいです。
また地図をHTML形式で保存できるのでウェブにもあげられます。

以前投稿したRのcartographyパッケージで主題図の作成が静的な地図の作成方法を解説したもので、今回が動的な地図の作成方法を解説したものになります。

準備

必要パッケージとデータを準備します。

なおGISの処理や描画処理が重いので注意してください。
スペックに余裕があるのであればRstudio上で作業すると非常に楽です。

パッケージの準備

tmapとtmaptools(とshinyjs)をインストールします。

install.packages(c("tmap", "tmaptools", "shinyjs"))

その他tidyverseとsfを使用するのでインストールされていない場合はインストールしてください。

インストールできたらR上で呼び出しておきます。

library(tidyverse)
library(sf)
library(tmap)
library(tmaptools)

使用データの準備

今回は

を使用します。それぞれ手順通りにダウンロードして作業ディレクトリに展開してください。

データの読み込みと編集

描画前にデータを読み込んで編集しておきます。

読み込み

sf::st_readでsfクラスのオブジェクトとして読み込みます。

# DIDデータの読み込み
tokyo <- st_read("A16-15_13_DID.geojson")
# 鉄道データの読み込み
rail <- st_read("N02-18_RailroadSection.geojson")
# 都市公園データの読み込み
park <- st_read("P13-11_13.shp", options = "ENCODING=CP932", crs = 4612) # エンコーディングとCRS(ここではJGD2000)を指定

参考:sfでShapefileの読み書きをするときの文字コードの指定方法GISのための測地成果、測地系、楕円体、投影座標系、EPSGコードのまとめ

編集

処理前にJGD2011の平面直角座標9系に投影変換しておきます。
その上で鉄道データと都市公園データをDIDの範囲で切り出します。
また描画の際に使う属性を追加で作成しておきます。

# DIDデータ
tokyo.proj <- st_transform(tokyo, crs = 6677)  %>% st_make_valid() # 投影変換と不正な地物の整形

# 鉄道データ
rail.proj <- st_transform(rail,  crs = 6677) # 投影変換
rail.proj.clip <- st_intersection(x = rail.proj, y = tokyo.proj) %>% mutate(`鉄道路線(運営会社)` = fct_drop(N02_004)) # DIDで切り出し、属性を追加

# 都市公園データ
park.proj <- st_transform(park, crs = 6677)
park.proj.clip <- st_intersection(x = park.proj, y = tokyo.proj) %>% mutate(`公園面積(m2)` = P13_008) # DIDで切り出し、属性を追加

なお

  • DIDデータは投影変換した後にポリゴンの境界線が交差してしまっている?ようなので、lwgeom::st_make_validで整形しています。
  • 切り出したあとでもfactorのlevelはそのままで、存在しない属性も凡例に追加されてしまいます。ここではそれを防ぐためにforcats::fct_dropで使われていないlevelを削除しています。

参考:Package 'sf' - CRAN、 sf cheatsheets、 lwgeomパッケージでRからliblwgeomの関数を使う、 {forcats}パッケージでカテゴリカル変数(factor型データ)をいじってみる

描画

モードの設定

描画前に描画モードの設定をしておきます。
今回はインタラクティブなviewモードに設定します。

tmap_mode("view")

ポリゴンの描画とラベルの表示

まずDIDデータを描画してみます。

tm_shape(shp = tokyo.proj) +
  tm_polygons(col = "gray") + 
  tm_text(text = "市町村名称")
  • tm_shapeで描画するデータを指定します。
  • tm_polygonsでポリゴンを描画します。ここでは色分けをせず、塗りつぶし色だけを指定しています。
  • tm_textで描画するラベルを指定します。ここでは参照する属性として「市町村名称」を指定しています。

描画するとこんな感じです。背景地図はEsri.WorldGrayCanvas、OpenStreetMap、Esri.WorldTopoMapから選べます。
DID.png

ラインの描画と類型による色分け

次に鉄道データを描画してみます。

tm_shape(shp = rail.proj.clip) + 
  tm_lines(col = "鉄道路線(運営会社)", lwd = 2, palette = get_brewer_pal("Paired", n = 18)) 
  • tm_shapeで描画するデータを指定します。
  • tm_linesでラインを描画します。ここでは色分け用の属性として「鉄道路線(運営会社)」を指定しています。またlwdで線分の大きさを、paletteで色分け用のパレットを指定しています。

描画するとこんな感じです。
rail.png

パレットについて

tmaptools::palette_explorer()で使用できるパレットを確認できます。実行すると以下のようにインタラクティブにいくつかのパレットをプレビューできます。

palette.png

…これふつうに便利なのでは

ポイントの描画と階級による色分け

最後に都市公園データを描画します。

tm_shape(shp = park.proj.clip) + 
  tm_dots(col = "公園面積(m2)", style = "quantile", size = 0.01,palette = get_brewer_pal("Greens"))
  • tm_shapeで描画するデータを指定します。
  • tm_dotsでポイントを描画します。ここでは色分け用の属性として「公園面積(m2)」を指定しています。またstyleで区分方法を(ここでは四分位点)。sizeで点の大きさを(デフォルトは0.01)、paletteで色分け用のパレットを指定しています。

描画するとこんな感じです。
park.png

レイヤの重ね合わせ

以上のレイヤは+で重ね合わせられます。またtm_layoutでタイトルを指定できます。

m <- tm_shape(shp = tokyo.proj) +
      tm_polygons(col = "gray") + 
      tm_text(text = "市町村名称") + 
     tm_shape(shp = rail.proj.clip) + 
      tm_lines(col = "鉄道路線(運営会社)", lwd = 2, palette = get_brewer_pal("Paired", n = 18)) + 
     tm_shape(shp = park.proj.clip) + 
      tm_dots(col = "公園面積(m2)", style = "quantile", size = 0.01,palette = get_brewer_pal("Greens")) + 
     tm_layout(title = "<p>東京のDID内の鉄道と都市公園</p><p><small>国土交通省国土政策局「国土数値情報(人口集中地区データ、鉄道データ、都市公園データ )」(http://nlftp.mlit.go.jp/ksj/index.html)をもとにocean_fが編集、加工。</small></p>") 

m # 描画

タイトルの部分はHTMLとして解釈されるので、ここでは<p><small>で改行とサイズ変更を指定しています。(マニュアルでは\nで改行できることになっていますがうまく行きませんでした)

描画するとこんな感じ。
all.png

保存とウェブ上での公開

保存

上の図を保存するにはtmap_saveを使用します。

tmap_save(m, "tmap.html")

これでインタラクティブな地図がHTMLで保存できます。

ウェブ上での公開

実際はShinyと連携させるようなのですが、ファイルをサーバーにあげるだけでもウェブ上で公開できます。
今回はGitHub pagesにアップしました。Gitの知識があれば登録からアップロードまで数分でできると思います。(参考:GitHubを使って3分でHPを公開する。

ページはこんな感じです。 ← スマホだと重くてうまく動かないので注意
HTMLやCSSやJSの知識が全然ないのでそのまま上げただけです。
それでも地図としてかなり見やすく、クリックで属性も見れてとてもGOOD!

地図を広く公開したいときには非常に便利だと思います!
(ただおそらく描画処理はクライアント側で行っているので、表示のスムーズさはマシンスペックに依存します。データが増えると難しいかもしれません)

参考ページ

ocean_f
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away