2013-10-11 9 views
8

Rでは、数百のポリゴンを含む単一のSpatialPolygonsオブジェクト(マルチポリゴン)があります。このSpatialPolygonsオブジェクトをPolygonsのリストに分割したい(つまり、親ポリゴンに穴を付けたままにしておく必要があります)。単一のSpatialPolygonsオブジェクトのポリゴン部分を分割する

どうすればいいですか?

EDITED: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([email protected], slot, "Polygons")を実行しています。私は Polygonsの3つのリスト(すなわち、 Srs1Srs2Srs3)を取得します。

しかし、私が解決しようとしている場合は、この例とは少し異なります。私が分割しようとしているSpatialPolygonsオブジェクトは、gUnaryUnion関数(RGEOSパッケージ内)で行われた幾何学的結合の結果です。 out <- lapply([email protected], slot, "Polygons")を適用すると、Polygonオブジェクト(n.b. Polygonsオブジェクトのリストではありません)の固有リストが取得されます。言い換えれば、各ポリゴンはその穴から分離されています。

私が手topol <- sapply(unlist(out), function(x) [email protected])

の実行:

> 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オブジェクトの順序に対応します。 A 0 はPolygonオブジェクトがポリゴンであることを意味し、非ゼロの数字は を意味し、Polygonオブジェクトは穴を所有しているPolygonのインデックス を示す値を持つ穴です。

のでRGEOScreateSPComment()機能は、多角形や正孔を再集計するための回避策である可能性が高いです。

答えて

2

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

out <- lapply([email protected] , slot , "Polygons") 
1

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

OPによって作成されたSpPオブジェクトには3つのポリゴンが含まれ、3番目のポリゴンには関連する穴があります。

を使用して、SpPの各ポリゴンを循環させ、SpatialPolygonsのリストを返すことができます。 PolygonsオブジェクトとSpatialPolygonsオブジェクトの違いは、プロット順情報の追加です。しかし、各結果は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" 
11

は、あなたは

を行うことができます
d <- disaggregate(p) 

pSpatialPolygonsオブジェクトです。その後、[email protected]を使用できます。例えば

library(sp) 
library(raster) 
### example data 
p1 <- rbind(c(-180,-20), c(-140,55), c(10, 0), c(-140,-60), c(-180,-20)) 
hole <- rbind(c(-150,-20), c(-100,-10), c(-110,20), c(-150,-20)) 
p1 <- list(p1, hole) 
p2 <- rbind(c(-10,0), c(140,60), c(160,0), c(140,-55), c(-10,0)) 
p3 <- rbind(c(-125,0), c(0,60), c(40,5), c(15,-45), c(-125,0)) 
pols <- spPolygons(p1, p2, p3) 
### 

a <- aggregate(pols, dissolve=FALSE) 
d <- disaggregate(a) 
0

これはSpatialPolygonsの代わりに、(回答の一部が行う)普通のポリゴンのリストを返します。

SpP %>% split(1:length(.)) 
関連する問題