使用空间向量(形状文件)列表屏蔽栅格列表

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

我有一个光栅文件列表和一个按日期排序的 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 寻求您的帮助!

r geospatial lapply raster terra
1个回答
0
投票

您可以使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.