我有森林的航拍图像,我需要计算碎片指数。 我知道如何为任何单个图片执行此操作,但我想要使用循环,因为它是一堆。
# required libraries
library(raster)
library(SDMTools)
所需的索引值是元素编号11.但在我提取此值之前,我需要将所有值替换为“1”(从原始范围1-100开始)
# Individual raster can be done like this:
x <- raster(forest_cov[1])
x[x > 0] = 1
PatchStat(x)[11]
# I have tried this loop but it is not working
rast<-numeric(41)
for (i in 1:41) {
rast[i] <- PatchStat(raster(forest_cov[i][forest_cov[i] > 0 == 1]))[11]
}
问题是我不知道如何将栅格中的所有值替换为1 (内部代码)。我做错了什么?
答案 0 :(得分:1)
要弄清楚为什么你的代码没有返回预期的结果,你应该从内到外运行你的代码块。例如,forest_cov[i] > 0 == 1
是否会返回您为光栅1返回的内容? (我怀疑没有,因为根据你的评论,forest_cov
是一个字符向量,因此元素i
与0的逻辑比较是不合理的。)但是,如果是这样,forest_cov[i][forest_cov[i] > 0 == 1]
回报你的期望,等等。
以下是我如何处理这个问题。
准备一些假数据:
# Write out three fake rasters to temp files
writeRaster(stack(replicate(3, raster(matrix(runif(100), nc=10)))),
{f <- tempfile()}, bylayer=TRUE, format='ascii')
# Filenames of these fake rasters
rasters <- paste0(f, '_', 1:3, '.asc')
计算每个栅格的frac.dim.index
(即PatchStat
结果的第11个元素):
sapply(rasters, function(x) {
require(SDMTools)
PatchStat(raster(x) >= 0.1)[11]
})
或者,如果角色向量中引用的所有栅格具有一致的范围和维度,则可以按如下方式对堆栈执行操作:
s <- stack(rasters) >= 0.1
sapply(seq_len(nlayers(s)), function(i) PatchStat(s[[i]])[11])