13

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分割しようとしているオブジェクトは、(パッケージ内の) 関数で行われた幾何学的結合の結果ですgUnaryUnionRGEOSを適用する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

RGEOSv0.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ポリゴンと穴を再集約するための回避策になる可能性があります。

4

4 に答える 4

3

SpatialPolygons私が理解しているように、OPはオブジェクトを のリストに変換し、Polygons存在する場合はホールを保持したいと考えています。

OP によって作成されたSpPオブジェクトには 3 つのポリゴンが含まれており、そのうちの 3 番目には穴が関連付けられています。

を使用lapplyして、 の各ポリゴンを循環しSpP、 のリストを返すことができますSpatialPolygonsPolygonsaとSpatialPolygonsobjectの違いは、プロット順序情報の追加です。ただし、それぞれの結果SpatialPolygonsは長さ = 1 であるため、この情報は不要です。

n_poly <- length(SpP)

out <- lapply(1:n_poly, function(i) SpP[i, ])

lapply(out, class)

> lapply(out, class)
   [[1]]
   [1] "SpatialPolygons"
   attr(,"package")
   [1] "sp"

   [[2]]
   [1] "SpatialPolygons"
   attr(,"package")
   [1] "sp"

   [[3]]
   [1] "SpatialPolygons"
   attr(,"package")
   [1] "sp"

plot(out[[3]]) # Hole preserved

のリストが必要な場合は、オブジェクトPolygonsから適切なスロットを取得するだけです:SpatialPolygons

out <- lapply(1:n_poly, function(i) SpP[i, ]@polygons[[1]])

lapply(out, class)

> lapply(out, class)
[[1]]
[1] "Polygons"
attr(,"package")
[1] "sp"

[[2]]
[1] "Polygons"
attr(,"package")
[1] "sp"

[[3]]
[1] "Polygons"
attr(,"package")
[1] "sp"
于 2015-09-28T11:57:54.823 に答える
2

SpatialPolygonsオブジェクトが呼び出された場合mysp...

out <- lapply( mysp@polygons , slot , "Polygons" )
于 2013-10-11T10:56:27.413 に答える