マルチポリゴンに縮小せずにRでバッファとユニオン


9

空間オーバーレイを実行して、一連のポイントが含まれるポリゴンを特定します。ただし、最初にポリゴンをバッファリングしてディゾルブし、マージされたポリゴン内の任意の場所にあるポイント(穴内にはない)に、オーバーレイ手順によって同様にラベルが付けられるようにします。

残念ながら、私が使用しているバッファリングまたはディゾルブプロセスは、SpatialPolygonsオブジェクトをマルチポリゴンに縮小しています。を使用gBufferすると、の場合はマルチポリゴンが作成されますが、の場合byid=FALSEは重複するポリゴンの結合に失敗しますbyid=TRUE。後者の場合、続いてgUnaryUnion再びポリゴンをディゾルブすると、マルチポリゴンが作成されます。SpatialPointsこれらのマルチポリゴンでオーバーレイすると、含まれているすべてのポイントがポリゴン1内にあると報告されます。

これは、バッファ付きポイントを使用した関連するおもちゃの例です。バッファ付きポリゴンでポイントをオーバーレイしたいと思います。

library(sp)
library(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
plot(gBuffer(pts, width=0.6), lwd=2)
points(pts, pch=20, cex=2)
text(coordinates(pts), labels=seq_len(length(pts)), pos=4, font=2)

ここに画像の説明を入力してください

そして、いくつかのオーバーレイの結果...

  • byid=FALSE

    b <- gBuffer(pts, width=0.6) 
    over(pts, b)
    # [1] 1 1 1 1
  • byid=TRUE

    b2 <- gBuffer(pts, width=0.6, byid=TRUE) 
    over(pts, b2)
    # [1] 1 2 3 4
  • byid=TRUEし、それに続きますgUnaryUnion

    b3 <- gUnaryUnion(b2)
    over(pts, b3)
    # [1] 1 1 1 1

結果を達成するための正しい方法を探しています1 1 1 2。つまり、ポイント1、2、3はポリゴン1(以前はマージされたポリゴン1、2、3)にあり、ポイント4はポリゴン2(元はポリゴン4)にあります。 )。


編集

私の本当のデータには穴が含まれており、理想的にはそれらを保存できるようになりたいです。上記のサンプルデータを更新して、バッファリング後にホールを含めました。

これらのポリゴンに@JeffreyEvansのアプローチを適用する:

polys <- b@polygons[[1]]@Polygons
pl <- vector("list", length(polys))
for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
b.spolys <- SpatialPolygons(pl)
row.ids <- sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))    
b.exploded <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids))) 

結果は:

over(pts, b.exploded)

#   FID
# 1   2
# 2   2
# 3   2
# 4   1

これは予想される結果ですが(ポリ次数-と2,2,2,1比較してそれほど心配していません1,1,1,2)、b.exploded穴に関する情報を失い、代わりに非穴ポリゴンとして表しています。それは明らかにおもちゃの例の結果に影響を与えませんが、穴にあるポイントを含むオーバーレイは誤解を招くでしょう、例えば:

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, b.exploded)
#   FID
# 1   2

回答:


7

それはそれは結局のところsp::disaggregateシングルパートポリゴンを引き離すために使用することができます。

pts <- SpatialPoints(cbind(c(1, 1, 2, 3), c(1, 2, 1.5, 2.5))) 
b <- gBuffer(pts, width=0.6) 
over(pts, disaggregate(b))

# [1] 1 1 1 2

in_hole <- SpatialPoints(cbind(1.375, 1.5))
over(in_hole, disaggregate(b))

# [1] NA

raster::aggregateそれらを再度組み合わせるために使用できます。)


3

私は同情しています。これは少し苦痛です。gBufferポリゴンオブジェクトのスロットを個別のポリゴンに分解する必要があります。

require(sp)
require(rgeos)
pts <- SpatialPoints(cbind(c(1, 1, 3), c(1, 2, 3))) 

b <- gBuffer(pts, width=0.6)

over(pts, b)

###########################################################
# explodes slots into individual polygons
polys <- b@polygons[[1]]@Polygons
  pl <- vector("list", length(polys))
    for (i in 1:length(polys)) { pl[i] <- Polygons(list(polys[[i]]), i) }
      b.spolys <- SpatialPolygons(pl)
        row.ids=sapply(slot(b.spolys, "polygons"), function(i) slot(i, "ID"))    
b <- SpatialPolygonsDataFrame(b.spolys, data.frame(FID=as.numeric(row.ids)) ) 
###########################################################

over(pts, b)

テストしたところ、有望に思えますが、私の穴はもはや穴ではありません:(。これを調整して、関連付けられているポリゴンと一緒に穴を維持できますか?(私は、あなたの提案と同様の線に沿って向かっていたn <- length(buff@polygons[[1]]@Polygons); SpatialPolygons(mapply(function(x, y) Polygons(list(x), y), buff@polygons[[1]]@Polygons, seq_len(n)))...私は申し訳ありませんが、ポストの穴の問題を言及している必要があります。
jbaums
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.