我编写了一个 R 函数,它采用基于栅格的地图,并计算给定栖息地类型的斑块的面积和周长。然而,它是矢量化的,因此在大地图上速度非常慢。我需要更快的东西,并且我认为“raster”或“terra”中有一些东西可以工作。但是,我还没有成功(见下文)。
举例来说,如果我有一张包含土地覆盖类型“7”块的地图,如下所示:
矩阵(c(0,0,0,0,0,0,0, 7,7,0,0,0,0,0, 7,7,0,0,0,0,7, 7,0,0,0,0,0,7, 0,0,0,0,0,0,0, 0,0,0,7,0,0,0),nrow=6,byrow=T)
我想要一个栅格,其中每个单元格显示它所在的补丁区域,即:
矩阵(c(0,0,0,0,0,0,0, 5,5,0,0,0,0,0, 5,5,0,0,0,0,2, 5,0,0,0,0,0,2, 0,0,0,0,0,0,0, 0,0,0,1,0,0,0),nrow=6,byrow=T)
还有一个带有周长的:
矩阵(c(0, 0, 0,0,0,0,0, 10,10,0,0,0,0,0, 10,10,0,0,0,0,6, 10, 0,0,0,0,0,6, 0, 0, 0,0,0,0,0, 0, 0, 0,4,0,0,0),nrow=6,byrow=T)
针对该地区,我尝试了以下方法:
library(terra)
vals<-c(0,0,0,0,0,0,0,
7,7,0,0,0,0,0,
7,7,0,0,0,0,7,
7,0,0,0,0,0,7,
0,0,0,0,0,0,0,
0,0,0,7,0,0,0)
# Make into raster object for terra
r <- rast(nrows=6, ncols=7)
values(r)<-vals
# Create map of clumps (patches)
p <- patches(r, zeroAsNA=TRUE)
plot(p) # This finds the three patches, but doesn't give them unique names (=problem)
# Create blank raster of the same dimensions (not sure if needed)
blank<-rast(nrows=6, ncols=7)
values(blank)<-0
# Convert p to a polygon
polyg <- as.polygons(p)
plot(polyg)
# Rasterize polyg, returning the area
ss<-rasterizeGeom(polyg,blank,fun="area",unit='m')
plot(ss)
# This clearly isn't what I want!
有什么想法吗?
谢谢
library(terra)
vals<-c(0,0,0,0,0,0,0,
7,7,0,0,0,0,0,
7,7,0,0,0,0,7,
7,0,0,0,0,0,7,
0,0,0,0,0,0,0,
0,0,0,7,0,0,0)
# Make into raster object for terra
r <- rast(nrows=6, ncols=7,xmin=0,ymin=0,xmax=7,ymax=6)
values(r)<-vals
crs(r)<-"local"
# Create map of clumps (patches)
p <- patches(r,zeroAsNA=TRUE)
plot(p)
# Create blank raster of the same dimensions (not sure if needed)
blank<-rast(nrows=6, ncols=7,xmin=0,ymin=0,xmax=7,ymax=6)
values(blank)<-0
blank<-extend(blank,c(1,1))
crs(blank)<-"local"
# Convert p to a polygon
polyg <- as.polygons(p)
plot(polyg)
# To get the raster of perimeters
perimrast<-rasterize(polyg,blank,field=perim(polyg))
# To get the areas
arearast<-rasterize(polyg,blank,field=expanse(polyg))