我有一个光栅文件列表和一个按日期排序的 shapefile 列表(一年中每 52 周一个)。我需要用相应的形状文件屏蔽每个栅格,并且我坚持使用代码来实现它。我已经通过使用
lapply
完成了其他数据操作,但由于我需要迭代光栅和形状文件,所以我陷入了困境。
library(terra)
#> terra 1.7.78
library(sf)
#> Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
# take a raster
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
plot(r)
# take a shapefile
pathshp <- system.file("ex/lux.shp", package = "terra")
v <- vect(pathshp)
v2 <- subset(v, v$ID_1 ==1) # make a Spatial Vector to use for masking
plot(v2)
# mask the raster using the shapefile
masked_raster <- mask(r, v2, inverse=TRUE)
plot(masked_raster)
# repeat this masking for a list of rasters usign a list of spatial vectors
# make some more rasters
s <- rast(system.file("ex/elev.tif", package="terra"))
x <- rep(s, 4)
# create a function to mask rasters
mask_raster <- function(raster, shapefile) {
masked_raster <- mask(raster, shapefile, inverse = TRUE)
return(masked_raster)
}
# use mappply and the new function to cycle through both rasters and Spatvectors
masked_rasters <- mapply(mask_raster, x, v, SIMPLIFY = FALSE)
#> Error: unable to find an inherited method for function 'mask' for signature 'x = "SpatRaster", mask = "data.frame"'
我不确定
mapply
是否是解决这个问题的最佳方法或者是否有更好的方法。当我仅使用一个栅格和一个 shapefile 对实际数据进行测试时运行代码时,我也会收到以下错误:
Error: [vect] the variable name(s) in argument `geom` are not in `x`
TIA 寻求您的帮助!
您可以使用
map2
包中的 purrr
函数,它的作用与使用带有两个参数的 lapply
类似。但是,您需要将栅格和矢量保存在其相应列表对象的单独条目中。在您的OP中,x
是一个4波段栅格,而不是一个包含四个条目的列表,每个条目都有一个带一个波段的栅格。这是创建这两个列表并在 mask_raster
函数中使用它们的示例。
library(purrr)
# Working with your own data, you can change these lines to
# v <- map(vectfiles, vect)
# x <- map(rastfiles, rast)
v <- list(subset(v, v$ID_1 ==1),
subset(v, v$ID_1 ==2),
subset(v, v$ID_1 ==3))
x <- as.list(rep(s, 3))
# use map2 to use the function over x and v
masked_rasters <- map2(x,
v,
mask_raster)