在R terra中基于多边形字段更新栅格值失败,求解决方法
问题解决:根据多边形修改栅格像元值
你的代码无法生效的核心原因是:values(r)的索引对应栅格像元的顺序,而p$NAME_1 == "Luxembourg"是对矢量要素的筛选,两者没有直接的索引映射关系,直接赋值不会定位到目标像元。
以下是两种可行的实现方法:
方法一:使用rasterize函数(推荐)
rasterize是terra中专门用于矢量转栅格的函数,通过update=TRUE参数可以直接覆盖原栅格的目标区域值:
library(terra) # 加载示例数据 f <- system.file("ex/lux.shp", package="terra") p <- vect(f) # 创建与矢量范围匹配的栅格(建议指定分辨率res,避免默认分辨率过大) r <- rast(ext(p), res = 0.01) values(r) <- 1 # 筛选出名为"Luxembourg"的多边形 lux_poly <- p[p$NAME_1 == "Luxembourg", ] # 将目标多边形区域的栅格值更新为2 r <- rasterize(lux_poly, r, field = 2, update = TRUE)
方法二:通过像元索引赋值
先获取目标多边形覆盖的栅格像元索引,再直接修改对应位置的栅格值:
library(terra) f <- system.file("ex/lux.shp", package="terra") p <- vect(f) r <- rast(ext(p), res = 0.01) values(r) <- 1 lux_poly <- p[p$NAME_1 == "Luxembourg", ] # 获取多边形覆盖的栅格像元一维索引 cell_idx <- cells(r, lux_poly)[, 1] # 给目标像元赋值 values(r)[cell_idx] <- 2
注意:创建栅格时务必指定合理的res(分辨率),如果默认分辨率过大,可能导致多边形覆盖的像元数量极少甚至为0,出现“看似未生效”的情况。
内容的提问来源于stack exchange,提问作者we need a Mat. Stat.
相关产品推荐
相关产品推荐

