INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

{mapdeck}を試してみる(4/5) Path編

{mapdeck}を試すシリーズ4回目。今回はadd_path()で軌跡の描画をしてみる。

今回は前回までと異なり国土数値情報 交通流動量 パーソントリップOD量データで試してみる。


データの取得

これまでと同様データの取得は@yutannihilation氏の{kokudosuuchi}を使用させて頂いた。*1

> # 東京都市圏 パーソントリップOD量データの取得
> library(dplyr)
> library(kokudosuuchi)
> dat.od <- getKSJURL("S05-b") %>% 
+   filter(areaCode == "100") %>% 
+   select(zipFileUrl) %>% 
+   as.character() %>% 
+   getKSJData()
Using the cached zip file: /var/folders/xl/wm11q0z951nf03drkv4dsltw0000gn/T//RtmpIJhyJ8/S05-b-10_SYUTO_GML.zip

Details about this data can be found at http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-S05-b-v2_2.html

> 
> glimpse(dat.od)
List of 3
 $ S05-b-10_SYUTO-1-g_PersonTripODAmount:Classes ‘sf’, ‘tbl_df’, ‘tbl’ and 'data.frame':  51013 obs. of  36 variables:
  ..$ S05b_001: chr [1:51013] "1" "1" "1" "1" ...
  ..$ S05b_002: chr [1:51013] "2008" "2008" "2008" "2008" ...
  ..$ S05b_003: chr [1:51013] "0010" "0010" "0010" "0010" ...
  ..$ S05b_004: chr [1:51013] "0010" "0011" "0012" "0013" ...
(以下略)


前回と異なりlistの要素が複数あり、purrr::map_df(~.)で1つのtibbleに結合しようとすると以下の警告とエラーが発生する。

> library(purrr)
> sf.od <- dat.od %>% map_df(~.)
 警告メッセージ: 
1:  bind_rows_(x, .id): 
  Vectorizing 'sfc_LINESTRING' elements may not preserve their attributes
2:  bind_rows_(x, .id): 
  Vectorizing 'sfc_LINESTRING' elements may not preserve their attributes
3:  bind_rows_(x, .id): 
  Vectorizing 'sfc_LINESTRING' elements may not preserve their attributes
> sf.od
 .subset2(x, i) でエラー: 
  attempt to select less than one element in get1index

{sf}githubに以下のissueがあり、{dplyr}側でまだ対応されていないようだ。


そのため一度、geometry列を文字列に変換する関数を定義しpurrr::map_df()で連結後、再度sfオブジェクトにする。(もっとスマートな方法があればご教示ください)

> library(sf)
> # geometry列を文字列に変更する関数
> geom2txt <- function(x){
+   txt <- st_as_text(x$geometry)
+   x %>% 
+     st_set_geometry(NULL) %>% 
+     mutate(geometry = txt)
+ }
>
> sf.od <- dat.od %>% 
+   map_df(geom2txt) %>% 
+   # 文字列からsfcに変換
+   mutate(geometry = st_set_crs(st_as_sfc(geometry), 4612)) %>% 
+   st_as_sf() %>% 
+   st_transform(4326)
>
> glimpse(sf.od)
Observations: 116,667
Variables: 36
$ S05b_001 <chr> "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"...
$ S05b_002 <chr> "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008", "2008"...
$ S05b_003 <chr> "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010", "0010"...
(以下略)


{leaflet}で確認してみる。

# 着ゾーンコード 0031の全トリップ上位30件を表示
> sf.od.sub <- sf.od %>% 
+   filter(S05b_004 == "0031") %>% 
+   mutate(S05b_035 = as.numeric(S05b_035)) %>% 
+   arrange(desc(S05b_035)) %>% 
+   head(n = 30) %>% 
+   arrange(S05b_035)
> 
> library(leaflet)
> pal <- colorNumeric(domain = sf.od.sub$S05b_035, palette = "Spectral", reverse = TRUE)
> 
> sf.od.sub %>% 
+   leaflet() %>% 
+   addProviderTiles(providers$CartoDB.Positron) %>% 
+   addPolygons(color = ~pal(S05b_035), weight = 3)

f:id:tak95:20180925213535p:plain


Pathの描画

{mapdeck}でPathの描画はadd_path()で行う。引数は以下の通り。

引数 説明
map mapdeck地図オブジェクト
data レイヤで使用するデータ
polyline ポリゴンの列
stroke_colour 線の色の列名 or 16進数
stroke_width 線の太さ
stroke_opacity 線の透明度
tooltip ツールチップに表示するテキスト or HTMLの列名
layer_id レイヤID(同じタイプのレイヤを区別するために使用される)
digits 緯度・経度の小数点以下の桁数
auto_highlight マウスオーバー時にオートハイライトするか
palette 色を生成する関数

上で準備したデータをmapdeck::add_path()で描画すると以下のようになる。

> library(googlePolylines)
> library(mapdeck)
> mapdeck(style = mapdeck_style("light"), zoom = 10, location = c(139.745433, 35.658581), pitch = 45) %>% 
+   add_path(
+     data = sf.od.sub,
+     polyline = "geometry",
+     layer_id = "path_layer",
+     stroke_colour = "S05b_035",
+     stroke_width = 3,
+     palette = colorRampPalette(rev(brewer.pal(11, "Spectral")))
+   )

f:id:tak95:20180925214258p:plain


最後はadd_arc()を試す。