sf
ギャップやスライバーを導入せずにポリゴンを単純化するにはどうすればよいですか?
たとえば、シェープファイルでは、次を使用しますrmapshaper::ms_simplify()
。
library("pryr")
library("rgdal")
library("rmapshaper")
download.file("https://borders.ukdataservice.ac.uk/ukborders/easy_download/prebuilt/shape/England_gor_2011.zip",
destfile = "regions.zip")
unzip("regions.zip")
regions <- readOGR(".", "england_gor_2011")
object_size(regions)
# ~13MB
regions <- ms_simplify(regions)
object_size(regions)
# < 1MB
私はsf::st_cast()
、manページから次のように述べました:
ジオメトリを別のタイプにキャスト:単純化するか、明示的にキャストします
そして:
引数へ:文字; 対象タイプがない場合、簡素化が試行されます。xがsfgタイプ(つまり、単一のジオメトリ)の場合、指定する必要があります。
私がto
行方不明になったとき、これは期待通りに機能しませんでした(それが本当であるには余りにも良いことを知っていました!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
現在、でファイルを開きrgdal::readOGR()
、簡略化して保存し、で再度読み込みsf
ます。
もっと良い方法はありますか?
rgeos::gSimplify()
@skの提案はrgeos::gSimplify()
、次の引数で指定された場合、トポロジを考慮した単純化(つまり、スライバを作成せずに単純化)を実行できます。
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
@data
ただし、フレームは保持されないため、再作成する必要があります。
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
実際、これによりファイルサイズが小さくなり(tol
引数を微調整して小さくすることができます)、QGISで調べてスライバーが作成されていないことを確認しました。
object_size(regions_gSimplify)
# ~8MB
したがって、これはrmapshaper::ms_simplify()
私と同じ問題を抱えている有効な代替手段ですが、つまり、次の場合には機能しませんsf
:
regions_sf <- sf::read_sf("england_gor_2011.shp")
object_size(regions_sf)
regions_gSimplify <- gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05)
# Error in gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05) :
# no slot of name "proj4string" for this object of class "sf"
@obrl_soilの答えはまたに適用することができgSimplify()
、ちょうどの代わりにそれを使用しますms_simplify()
。
st_simplify
ことになっていないのですか?(まだ使用していません)
st_simplify
、指摘してくれてありがとう。私はrmapshaper::ms_simplify
これまで試した他のすべてのアルゴリズムよりもデフォルトのアルゴリズムを好んでいますが、新しいオプションを試してみます(更新:preserveTopology = TRUE
regions
)で使用したポリゴンで最大約1000までの許容範囲で機能しますが、それを超えるとトポロジが保持されなくなります。それは私が行動を意図していないことを言うだろう、ある時点で壊れたよう