我有一个简单的栅格(使用R-package:raster创建)。使用“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)
我不使用“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
我的问题有两个: 1)如何组合共享边缘或点的多边形? 2)如何将此信息转换为允许分析组合多边形区域的格式? 非常感谢您的反馈。
答案 0 :(得分:9)
您可以先使用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))
答案 1 :(得分:3)
rgeos
包有许多多边形操作工具。 gUnion
将联合起来触及多边形:
require(rgeos)
uni <- gUnion( r_poly , r_poly )
plot( uni , col = 2 )
答案 2 :(得分:2)
rasterToPolygons()
是一个计算上非常昂贵的操作,因此,假设CRS是平面的,我会选择:
m <- clump(r)
f <- freq(m)
f[,2] <- f[,2] * xres(r) * yres(r)
对于lon / lat,我会使用:
a <- area(r)
zonal(a, m, 'sum')