R には、SpatialPolygons
数百のポリゴンを含む単一のオブジェクト (マルチポリゴン) があります。SpatialPolygons
このオブジェクトをリストに分割したいと思いますPolygons
(つまり、穴は親ポリゴンに接続したままにする必要があります)。
これを行う方法はありますか?
編集:
sp
パッケージで提供されている次の例を使用します。
# simple example, from vignette("sp"):
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)
その後、実行していout = lapply(SpP@polygons, slot, "Polygons")
ます。3 つのリストPolygons
(つまり、、、Srs1
)Srs2
を取得しますSrs3
。
ただし、解決しようとしているケースは、この例とは少し異なります。SpatialPolygons
分割しようとしているオブジェクトは、(パッケージ内の) 関数で行われた幾何学的結合の結果ですgUnaryUnion
。RGEOS
を適用するout <- lapply(merged.polygons@polygons, slot, "Polygons")
と、オブジェクトの一意のリストが取得されPolygon
ます (オブジェクトのリストではありませんPolygons
)。つまり、各ポリゴンはその穴から分離されています。
ランニング topol <- sapply(unlist(out), function(x) x@hole)
私は得る:
> length(topol)
[1] 4996
> sum(topol, na.rm=TRUE)
[1] 469
RGEOS
v0.3-2 マニュアル ( http://cran.r-project.org/web/packages/rgeos/rgeos.pdf )によると:
rgeos が適切に機能するためには、特定の POLYGON または MULTIPOLYGON ジオメトリ内のすべての穴が特定のポリゴンに属している必要があります。SpatialPolygons クラスの実装には、現在、この情報は含まれていません。この制限を回避するために、rgeos は、どの穴がどのポリゴンに属しているかを示す追加のコメント属性を Polygons クラスで使用します。現在の実装では、このコメントはスペースで区切られた数字のテキスト文字列であり、数字の順序は Polygons オブジェクトの Polygons スロット内の Polygon オブジェクトの順序に対応しています。0 は Polygon オブジェクトがポリゴンであることを意味し、0 以外の数値は Polygon オブジェクトがホールであることを意味し、値はホールを「所有する」Polygon のインデックスを示します。
したがって、createSPComment()
関数は、RGEOS
ポリゴンと穴を再集約するための回避策になる可能性があります。