{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)
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"))) + )
最後はadd_arc()
を試す。