如何编写一个循环来为具有光栅基础的 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)
也许这个解决方案对一些已经看过问题的人也有帮助。
我还是 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)
也许这个解决方案对一些已经看过问题的人也有帮助。