是否有一个 R 函数(在 terra 中?),它接受一个栅格(代表地图)并返回每个像元所属的补丁区域的栅格?

问题描述 投票:0回答:1

我编写了一个 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!

有什么想法吗?

谢谢

r matrix raster spatial terra
1个回答
0
投票
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))
© www.soinside.com 2019 - 2024. All rights reserved.