如何编写一个循环来为具有光栅基础的 shapefile 的每个 id 创建裁剪光栅?

How to write a loop for creating cropped raster for every id of a shapefile with a raster base?

我还是 R 的新手,不知道如何为我的工作流程创建循环以提高效率。

我有一个数字高程模型(栅格 Barrow_5m.tif),一个用于湖泊和缓冲区的 shapefile,每个 table 一排有 10 个 iD。 在下面的脚本中,我为湖泊的所有值创建了一个新的栅格文件,并使用来自 DEM 栅格的数据创建了缓冲区形状文件。这很好用。

setwd("...")

Barrow_5m <- raster("Barrow_5m.tif")

Barrow_DTLB <- st_read("Barrow_DTLB.shp")

Barrow_DTLB_Buffer <- st_read("Barrow_DTLB_BufferOUT.shp")

Barrow_lake <- crop(Barrow_5m, extent(Barrow_DTLB))

raster_lake <- rasterize(Barrow_DTLB, Barrow_lake, mask = TRUE)

Barrow_buffer <- crop(Barrow_2m, extent(Barrow_DTLB_Buffer))

raster_buffer <- rasterize(Barrow_DTLB_Buffer, Barrow_buffer, mask = TRUE)

writeRaster(raster_lake, "raster_lake.tif")

writeRaster(raster_buffer, "raster_buffer.tif")

但现在我想为湖泊的每个 ID 和缓冲区 shapefile 分别创建一个光栅文件,所以 2x10 文件。 我认为最好为此编写一个循环,但到目前为止我的技能还不足以做到这一点。 到目前为止,其他问题也没有带来解决方案。我试图帮助我 this.

或者,我可以使用上面脚本中的最终产品 tif,并在文件中为每个 ID 撤消此操作。

我想为 shapefile 的所有 ID 编写循环而不是手动执行它,因为之后我将对具有更多值的更大的 shapefile 执行相同的操作。

我认为这应该可行:

for (i in unique(raster_lake)){
  r <- raster_lake
  r[!(values(r) == i)] <- NA
  r <- trim(r) 
  writeRaster(r, paste0("raster_lake_", i, ".tif"))
}

我现在找到了解决方案,通过 ID 提取数据。 它创建了一个包含 11 个元素和每个 id 的所有值的大列表,这足以满足我的进一步工作。您还可以直接创建每个元素的平均值、最大值、最小值等值(因此每个 ID)。

k <- Barrow_DTLB$ID #k= number of rows
LakesA <- extract(raster_lakeA, Barrow_DTLB[k, ])
LakesA_mean <- extract(raster_lakeA, Barrow_DTLB[k, ], fun=mean)

也许这个解决方案对一些已经看过问题的人也有帮助。