sfオブジェクトのポリゴンを単純化する


14

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()


1
Douglas–Peuckerアルゴリズムにアクセスできますか?GISの世界でのフィーチャの簡素化で広く知られています。stackoverflow.com/questions/17217413/...r-bloggers.com/simplifying-spatial-polygons-in-r
SK

1
それをするst_simplifyことになっていないのですか?(まだ使用していません)
lbusett

2
ああ、気づかなかったst_simplify、指摘してくれてありがとう。私はrmapshaper::ms_simplifyこれまで試した他のすべてのアルゴリズムよりもデフォルトのアルゴリズムを好んでいますが、新しいオプションを試してみます(更新:preserveTopology = TRUE
whoa

1
知っておくといい。これに関するバグレポートを開くのはどうですか?
-lbusett

1
@obrl_soilこれは、質問(regions)で使用したポリゴンで最大約1000までの許容範囲で機能しますが、それを超えるとトポロジが保持されなくなります。それは私が行動を意図していないことを言うだろう、ある時点で壊れたよう
フィル・

回答:


16

まだsfをサポートしていないパッケージの場合は、sfオブジェクトをspにキャストできます-これは、ラスター/ポリゴンの相互作用のためにかなり行います。だからあなたができる:

simplepolys <- rmapshaper::ms_simplify(input = as(sfobj, 'Spatial')) %>%
  st_as_sf()

1
この手法-空間オブジェクトとしてのキャスト、簡素化、sfオブジェクトとしての再キャスト-は完全に機能し、rmapshaper::ms_simplify()またはで使用できますrgeos::gSimplify()。提案をありがとう!
フィル

クールクール、インターロックポリゴンのトポロジはrmapshaperのアプローチでのみ保存されることに注意してください。入力データがすべて分離された非インターロックポリゴンである場合、使用可能な任意の単純化アルゴリズムを安全に使用できます。
-obrl_soil

私はこれを答えとして受け入れています。なぜなら、より正確なものsf::st_simplify()は執筆時点で高い許容度では堅牢ではないからです。
フィル

8
現在sfrmapshaperのオブジェクトのサポートに取り組んでいます。開発バージョンのオブジェクトにms_simplify使用できますsf。私は初期のテスターが欲しい-あなたがそれを試してみたい場合、あなたはでインストールできますdevtools::install_github("ateucher/rmapshaper", ref = "sf")
-andyteucher

6
とおりrmapshaper、バージョン0.3.0への呼び出しはas( , "Spatial")必要なくなりました。
ルーク1018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.