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,...<<
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()
ちなみにdToleranceは粗さを決めるパラメータで、小さいほど解像度が高いです。
粗すぎるとこうなります。
# Topologyを維持してサイズダウン jp_sh2 = st_simplify(jp_sh, preserveTopology = TRUE, dTolerance = 500) # サイズチェック pryr::object_size(jp_sh2) # 549 kB # 改めて描画 ggplot(jp_sh2) + geom_sf()