【问题标题】:How to write a loop for creating cropped raster for every id of a shapefile with a raster base?如何编写一个循环来为具有栅格基础的 shapefile 的每个 id 创建裁剪栅格?
【发布时间】:2018-10-17 13:04:09
【问题描述】:

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

我有一个数字高程模型(光栅Barrow_5m.tif),一个用于湖泊和缓冲区的 shapefile,每个表格的一行中有 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 执行相同的操作。

【问题讨论】:

  • raster_lake 是具有每个湖泊 ID 的栅格吗(raster_buffer 的问题相同)?
  • 是的,它们的 ID 为 0 到 10,因此每个都有 11 个值。并且每个湖ID都属于同一个Buffer ID

标签: r loops raster


【解决方案1】:

我现在找到了一个解决方案,通过 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)

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

【讨论】:

  • 你为什么不做LakesA_mean &lt;- extract(raster_lakeA, Barrow_DTLB, fun=mean)(也就是说,你需要一个循环吗?
【解决方案2】:

我认为这应该可行:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多