如何使用 R 中的 for 循环将多个栅格裁剪到相同程度?
How to crop multiple rasters to the same extent using a for loop in R?
我有 4 个栅格,我想将它们裁剪到相同的程度。在这个脚本的未来迭代中,我将有超过 4 个,所以我试图编写一个循环,将目录中的所有栅格裁剪到相同的范围。栅格是下载的 Sentinel-2 产品,其中至少包含 4 个波段,这些波段已使用 sen2r() 库转换为 GeoTIFF。我已经尝试使用此处发布的类似问题的答案,但在此过程中以某种方式丢失了波段,稍后我将需要这些波段来进行一些光栅数学运算。
到目前为止的代码:
raster_files <- list.files(here::here("data", "s2_rasters")) #dir with 4 rasters
raster_paths <- paste0(here::here("data", "s2_rasters", raster_files))
wp_shp <- readOGR(here::here("data", "wp_boundary.shp"))
e <- extent(wp_shp)
n <- length(raster_paths)
for (i in 1:n) {
m <- raster_paths[i]
crop(x = m, y = e)
}
编辑:
我认识到我的循环没有意义。我是新手,不知道我在做什么。直到脚本中的这一点,我一直在使用文件的路径来做一些事情(构建虚拟栅格、应用大气校正等)。
这是我为单一作物所做的一个例子,效果很好。
extent <- extent(802331.9, 802503.7, 9884986, 9885133)
ras_crop <- stack(here::here("data", "s2_rasters", "sample_raster.tif")) %>%
crop(extent) %>%
writeRaster(filename=file.path(here::here("data", "s2_rasters"), "raster1_crop.tif"))
据我所知,你应该可以做这样的事情
# input filenames
inf <- list.files("data/s2_rasters", pattern="tif$", full.names=TRUE)
# create output filenames and folder
outf <- gsub("data/s2_rasters", "output", inf)
dir.create("output", FALSE, FALSE)
library(raster)
wp_shp <- shapefile("data/wp_boundary.shp")
e <- extent(wp_shp)
for (i in 1:length(inf)) {
b <- brick(inf[i])
crop(b, e, filename=outf[i])
}
我有 4 个栅格,我想将它们裁剪到相同的程度。在这个脚本的未来迭代中,我将有超过 4 个,所以我试图编写一个循环,将目录中的所有栅格裁剪到相同的范围。栅格是下载的 Sentinel-2 产品,其中至少包含 4 个波段,这些波段已使用 sen2r() 库转换为 GeoTIFF。我已经尝试使用此处发布的类似问题的答案,但在此过程中以某种方式丢失了波段,稍后我将需要这些波段来进行一些光栅数学运算。
到目前为止的代码:
raster_files <- list.files(here::here("data", "s2_rasters")) #dir with 4 rasters
raster_paths <- paste0(here::here("data", "s2_rasters", raster_files))
wp_shp <- readOGR(here::here("data", "wp_boundary.shp"))
e <- extent(wp_shp)
n <- length(raster_paths)
for (i in 1:n) {
m <- raster_paths[i]
crop(x = m, y = e)
}
编辑: 我认识到我的循环没有意义。我是新手,不知道我在做什么。直到脚本中的这一点,我一直在使用文件的路径来做一些事情(构建虚拟栅格、应用大气校正等)。
这是我为单一作物所做的一个例子,效果很好。
extent <- extent(802331.9, 802503.7, 9884986, 9885133)
ras_crop <- stack(here::here("data", "s2_rasters", "sample_raster.tif")) %>%
crop(extent) %>%
writeRaster(filename=file.path(here::here("data", "s2_rasters"), "raster1_crop.tif"))
据我所知,你应该可以做这样的事情
# input filenames
inf <- list.files("data/s2_rasters", pattern="tif$", full.names=TRUE)
# create output filenames and folder
outf <- gsub("data/s2_rasters", "output", inf)
dir.create("output", FALSE, FALSE)
library(raster)
wp_shp <- shapefile("data/wp_boundary.shp")
e <- extent(wp_shp)
for (i in 1:length(inf)) {
b <- brick(inf[i])
crop(b, e, filename=outf[i])
}