在R中使用循环对栅格堆栈进行重采样和匹配

trnvg8h3  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(171)

我的目标是将生物多样性数据与土地覆盖信息(栅格和矢量)相结合。然而,我需要将每个栅格(预测变量)的分辨率、范围、CRS和维度与我的生物多样性数据(答案变量)相匹配。我已经成功地单独完成了这一工作,但共有六个栅格。尽管如此,当我尝试对栅格堆栈进行循环时,我还是得到了一些错误。

library(terra)
library(raster)
#Create a raster stack with land cover predictors:
CDI_stack<-raster::stack(list.files(path = dir_Proj1, pattern='.tif', full.names=T))
#Convert to cylindrical equal area projection
equalareaproj<-"+proj=cea +lon_0=0 +lat_ts=30 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"
crs(CDI_stack, warn=FALSE)<-equalareaproj
#Raster with standard dimension, resolution, extention and CRS
standard<-terra::subset(study_area, 2) 
#Loop for the raster stack
for(i in 1:length(CDI_stack@layers)){
  #Creating a single raster with each layer to maintain values
  CDI_layer<-terra::rast(terra::subset(CDI_stack, i)) 
  #Matching a raster extention individually
  CDI_layer<-ext(standard) 
  #Cropping it with standard raster to reduce matching error
  raster::crop(CDI_layer[i],standard) 
  #Resample resolution 
  terra::resample(CDI_layer[i], standard, method= "near", threads= T) 
  #Write the raster:
  return(writeRaster(Resampled_layer, 
                     filename=paste0("~/Land use/Chronic_Anthropogenic_Disturbance_Surface/", CDI_layer[i]),
                     format="GTiff", overwrite=TRUE))
  }

我发现这些错误:

Error in h(simpleError(msg, call)) : 
 error evaluating argument 'x' in method selection for function 'crop': 'this S4 class is not subsettable
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘crop’ for signature ‘"numeric"’

我想知道是否有任何复杂的使用光栅堆栈或我是否做错了任何代码步骤。我希望找到正确的代码或使用类对象。
请,我希望你的支持。谢谢!

sgtfey8w

sgtfey8w1#

当您逐行运行代码时,应该很容易找出哪里出了问题;包括在for循环内部(当错误发生时,将i设置为1或任何值)。
您将看到此操作失败:

CDI_layer <- ext(standard) 
raster::crop(CDI_layer[i],standard)

因为CDI_layer[i]是单个数字。
还有其他的东西比较别扭。特别是,只使用“terra”,不要同时也使用“raster”,以免混淆。

相关问题