8

私は単純なラスターを持っています(Rパッケージで作成された:ラスター)。関数 "rasterToPolygons" を使用して、値 "1" を含むすべてのラスター セルのポリゴンを取得します。

library(raster) 
dat = list()
dat$x = seq(1.5, by = 10, len = 10)
dat$y = seq(3.5, by = 10, len = 15)
dat$z = matrix(sample(c(0,1), size = 10*15, replace = T), 10, 15)

r=raster(dat);plot(r)

r_poly = rasterToPolygons(r, fun = function(r) {r == 1}, dissolve = F)
plot(r_poly, add = T)

すべてのポリゴンが 1 つの大きなポリゴンにマージされるのを避けるために、「dissolve = T」は使用しません。代わりに、エッジまたはポイントを共有するすべてのポリゴンが結合された新しい SpatialPolygonsDataFrame を取得したいと考えています。明確に分離されたポリゴンは、個々のポリゴンとして識別できる必要があります。新しい SpatialPolygonsDataFrame に基づいて、結合されたポリゴンのサイズを次のように分析したいと思います。

b = extract(r,r_poly_new) # "r_poly_new" contains the combined polygons
str(b)                    # list of clearly separated polygons
tab = lapply(b,table)      
tab

私の質問は 2 つあります。1) エッジまたはポイントを共有するポリゴンを結合する方法は? 2) 結合されたポリゴンの領域を分析できる形式にこの情報を取得する方法は? フィードバックをお寄せいただきありがとうございます。

4

3 に答える 3

10

最初に を使用raster::clump()して、接続されたラスター セルのクラスターを識別し、次に適用rasterToPolygons()してそれらのセルを「多角形化」できます。RasterLayer(ただし、以下に示すように、各クランプの面積はに変換せずにから直接計算できることに注意してくださいSpatialPolygonsDataFrame)。

library(rgeos) ## For the function gArea

## Clump and polygonize
Rclus <- clump(r)
SPclus <- rasterToPolygons(Rclus, dissolve=TRUE)

## Check that this works
plot(SPclus, col = seq_along(SPclus))

## Get cluster areas from RasterLayer object
transform(data.frame(freq(Rclus)), 
          area = count*prod(res(Rclus)))

## Get cluster areas from SpatialPolygons object
transform(data.frame(SPclus), 
          area = gArea(SPclus, byid=TRUE))

ここに画像の説明を入力

于 2013-12-18T16:52:31.657 に答える
3

このrgeosパッケージには、多くのポリゴン操作ツールが含まれています。gUnion接触しているポリゴンを結合します:

require(rgeos)
uni <- gUnion( r_poly , r_poly )
plot( uni , col = 2 )

ここに画像の説明を入力

于 2013-12-18T13:24:04.250 に答える
2

rasterToPolygons()は計算コストが非常に高い操作なので、CRS が平面であると仮定すると、次のようになります。

m <- clump(r)
f <- freq(m)
f[,2] <- f[,2] * xres(r) * yres(r) 

経度/緯度の場合、次を使用します。

a <- area(r)
zonal(a, m, 'sum') 
于 2013-12-18T17:41:03.853 に答える