组合多边形并计算其面积(即单元数),单位为R

组合多边形并计算其面积(即单元数),单位为R,r,r-raster,R,R Raster,我有一个简单的光栅(使用R-package:raster创建)。使用函数“rasterToPolygons”,我可以得到包含值“1”的所有光栅单元的多边形: 我不使用“溶解=T”来避免将所有多边形合并为一个大多边形。 相反,我希望获得一个新的空间多边形数据帧,其中所有共享一条边或一个点的多边形都被合并。清晰分离的多边形应可识别为单个多边形。 基于新的空间多边形框架,我想对组合多边形的大小进行如下分析: b = extract(r,r_poly_new) # "r_poly_new" contai

我有一个简单的光栅(使用R-package:raster创建)。使用函数“rasterToPolygons”,我可以得到包含值“1”的所有光栅单元的多边形:

我不使用“溶解=T”来避免将所有多边形合并为一个大多边形。 相反,我希望获得一个新的空间多边形数据帧,其中所有共享一条边或一个点的多边形都被合并。清晰分离的多边形应可识别为单个多边形。 基于新的空间多边形框架,我想对组合多边形的大小进行如下分析:

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) 如何将这些信息转换成一种格式,以允许分析组合多边形的区域?
非常感谢您的反馈。

rgeos软件包有许多多边形操作工具<代码>gUnion将在接触多边形时合并:

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

uni您可以首先使用
raster::clump()
识别连接的光栅单元簇,然后应用
rasterToPolygons()
对这些单元进行“多边形化”。(但请注意,可以直接从
光栅层
计算每个束的面积,而无需将其转换为
空间多边形数据帧
,如下所示):

函数gArea的
library(rgeos)##
##丛聚
Rclus
光栅拓扑多边形()
是一个计算成本非常高的操作,因此,假设CRS是平面的,我会选择:

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

m查看
rgeos::gUnaryUnion
rgeos::gUnionCascaded
-我认为其中之一就是您所追求的。另外+1是可复制的示例。第一个问题很好。非常感谢您的快速回复。然而,问题是我仍然得到一个多部分多边形。我需要的是单部分多边形(在您的示例中:5个单独的多边形)。有什么建议吗?非常感谢@是的,有办法做到这一点。我现在想不起来了,但我正在寻找
rgeos
功能强大,包含许多多边形操作工具。同样在
r-sig-geo
邮件列表上问这个问题,无疑会引起比我更了解技术的人的反应。亲爱的西蒙,谢谢你的回复。我将在r-sig-geo邮件列表上提问。致以最良好的祝愿,Alex。@SimonO101——带回家的信息可能是raster和rgeos都是非常全面且运行平稳的R包。绝对同意。将
sp
添加到该列表中。在功能上与ArcGIS相抗衡,并在可用性上将其粉碎的三巨头。@JoshO'Brien--非常感谢!这是伟大的作品,正是我所寻找的!然而,我发现R代码的最后一部分(即从SpatialPolygons对象获取簇区域)并不总是正常工作。有趣的是,(有时)来自SpatialPolygons对象的最大簇的面积被高估,而来自RasterLayer对象的簇面积总是被正确估计(我数过几次;)。再次感谢您的帮助!Alex@AlexZ--谢谢你的评论。知道这一点很有帮助。我一直对光栅的强大功能感到惊讶。
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))
m <- clump(r)
f <- freq(m)
f[,2] <- f[,2] * xres(r) * yres(r) 
a <- area(r)
zonal(a, m, 'sum')