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