データ分析メモと北欧生活

旧Untitled Note. データ分析、計量経済・統計とR、水産管理、英語勉強、海外生活などについて備忘録や自分の勉強のOutputの場所として

MENU

sf::st_simplifyを使った後ggplot2のgeom_sfで起こるエラー

sfパッケージを使って地図をお絵描きしてたところで引っかかったかんたんなミスの備忘録。

日本の都道府県の地図を描こうと思って以下のサイトからシェープファイルをダウンロードした。
今はsfオブジェクトのままで配布もしているらしい。
GADM


sfオブジェクトがデカすぎて、ggplotで描くのに時間がかかるので、解像度を落とそうと思ってこうした。

library(ggplot2)
library(sf)

# データロード
jp_sh = readRDS("gadm36_JPN_1_sf.rds") # 都道府県 (prefecture)

# サイズダウン
jp_sh2 = st_simplify(jp_sh, dTolerance = 0.01)

# 描画
ggplot(jp_sh2) + 
  geom_sf()

すると以下のようなエラーが出た。

Error in unit(x, default.units) : 'x' and 'units' must have length > 0

少し調べたのだが、st_simplifyの問題はgeometryごとにサイズ圧縮をしてしまうことらしい。
"Geocomputation with R"の5.2.1に以下の記述がある。

>>A limitation with st_simplify() is that it simplifies objects on a per-geometry basis. This means the ‘topology’ is lost,...<<

f:id:keita43a:20200427022515p:plain
"Geocomputation with R", Figure 5.2

Geocomputation with Rではrmapsshaperのms_simplifyを使うことを提案しているが、st_simplifyにはpreserveTopologyというオプションがあり、これをTRUEにすることで解決。

# Topologyを維持してサイズダウン
jp_sh2 = st_simplify(jp_sh, preserveTopology = TRUE, dTolerance = 0.01)

# サイズチェック
pryr::object_size(jp_sh2) # 10 MB
pryr::object_size(jp_sh2) # 653 kB

# 改めて描画
ggplot(jp_sh2) + 
  geom_sf()

f:id:keita43a:20200427022729p:plain

ちなみにdToleranceは粗さを決めるパラメータで、小さいほど解像度が高いです。

粗すぎるとこうなります。

# Topologyを維持してサイズダウン
jp_sh2 = st_simplify(jp_sh, preserveTopology = TRUE, dTolerance = 500)

# サイズチェック
pryr::object_size(jp_sh2) # 549 kB

# 改めて描画
ggplot(jp_sh2) + 
  geom_sf()

f:id:keita43a:20200427023041p:plain