r - 有没有更快的方法来使用多个多边形来掩盖多个栅格?
问题描述
基本上我有 12 个多光谱图像,我想用 2 个多边形(小水体)来掩盖它们。这 2 个多边形在一个 shapefile 中,但如果可以使过程更容易,我可以将它们分解。在这里的一些优秀用户的帮助下,我使用一个多边形上的 12 个图像对这一切进行了测试,它工作得很好,但我最终需要对多个多边形执行此操作,所以我想调整我的代码。
使用单个多边形裁剪所有栅格的循环:
#The single polygon
mask <- st_read(here::here("data", "mask.shp") %>%
st_as_sf()
#Creates list of input files and their paths
crop_in <- list.files(here::here("data", "s2_rasters"), pattern="tif$", full.names=TRUE)
#Creates list of output files and their directory.
crop_out <- gsub(here::here("data", "s2_rasters"), here::here("data", "s2_cropped"), crop_in)
for (i in seq_along(crop_in)) {
b <- brick(crop_in[i])
crop(b, mask, filename = crop_out[i])
}
就像我说的那样,这很好用,但我想掩盖而不是裁剪。此外,我需要使用多个多边形进行遮罩。
我的工作循环做同样的事情,但对于多个(2)多边形:
masks_2 <- st_read(here::here("data", "multiple_masks.shp")) %>%
st_as_sf()
for (i in seq_along(crop_in)) {
b <- brick(crop_in[i])
mask(b, masks_2, filename = crop_out[i], overwrite = TRUE)
}
这花了大约 2 个小时(这让我很怀疑),我认为它在途中的某个地方丢失了多边形 ID。当我尝试绘制结果时,情节是空的。我的最终输出应该是 24 个栅格堆栈,每个多边形 12 个。我需要做进一步的图像分析,所以我需要保留名字。我希望这是有道理的,谢谢!
解决方案
这是一个最小的、独立的、可重现的示例,terra
因为它比raster
(确保您使用的是当前版本)快得多
具有 12 层的栅格数据集
library(terra)
f <- system.file("ex/elev.tif", package="terra")
r <- rast(f)
r <- rep(r, 12) * 1:12
names(r) <- paste0("band", 1:12)
两个“湖”
v <- vect(system.file("ex/lux.shp", package="terra"))
v <- v[c(1,12)]
解决方案:
x <- mask(r, v)
并且总是在运行循环之前尝试单个案例。
所以如果你有 12 个文件,你可以做类似的事情
inf <- list.files("data/s2_rasters", pattern="tif$", full.names=TRUE)
outf <- gsub(".tif$", "_masked.tif", inf)
for (for i in 1:length(inf)) {
r <- rast(inf[i])
m <- mask(r, v, filename=outf[i])
}
这样做可能会快一点(只光栅化一次多边形)
msk <- rast(inf[1])
msk <- rasterize(v, msk)
for (for i in 1:length(inf)) {
r <- rast(inf[i])
m <- mask(r, msk, filename=outf[i])
}
或者制作一个对象/文件,如果可行的话。
rr <- rast(inf)
mm <- mask(rr, v)
推荐阅读
- javascript - 在 Codepen 中检测仅 CSS 的更新
- android - TextWatcher 在 getView() 方法中不起作用
- c# - HTTPClient 在表单中发布和请求默认值
- firebase - Firebase Firestore - 为收集的每个文档获取额外数据
- javascript - 如何在ajax代码之前执行Javascript
- java - IntelliJ IDEA 中的 JAVA 11 和 JavaFX
- elasticsearch - Elasticsearch 5.5.3 版可以在带有 StatefulSet 的 Kubernetes 上运行吗?
- python - 在 pyqtgraph 中检测 mouseReleaseEvent。继承问题
- javascript - 根据一天中的时间向 React 应用程序添加问候语
- html - 将不同高度的列与底部 div css 对齐