基于两个栅格数据在R语言中重分类生成新栅格
基于双栅格条件生成新栅格的高效方法
嘿,这个场景我太熟悉了!之前也纠结过reclassify只能单栅格判断的问题,针对两个同范围栅格的组合条件生成新栅格,这里有几个高效的实现方案,给你参考:
方法一:用raster::overlay()做分块条件运算
overlay()是专门处理多栅格联合运算的函数,还会自动分块处理大栅格,内存友好度拉满。我们可以先定义一个条件判断函数,再传给它:
library(raster) # 先模拟两个同范围栅格(替换成你自己的r1和r2即可) r1 <- raster(nrow=10, ncol=10) r1[] <- sample(c(0,1), size=ncell(r1), replace=TRUE) r2 <- raster(nrow=10, ncol=10) r2[] <- runif(ncell(r2), min=0, max=4) # 定义条件判断函数 calc_r3 <- function(x, y) { # x对应r1的单元格值,y对应r2的单元格值 ifelse(x == 0 & y < 2, 0.5, ifelse(x == 1 & y < 2, 0.8, ifelse(x == 0 & y > 2, 0.7, # 这里填你r1=1且r2>2时的目标值,比如0.9 ifelse(x == 1 & y > 2, 0.9, NA)))) } # 生成目标栅格r3 r3 <- overlay(r1, r2, fun=calc_r3)
如果条件多了嵌套ifelse太乱,也可以用dplyr::case_when()简化逻辑,记得要适配栅格的向量化特性:
library(dplyr) calc_r3 <- function(x, y) { case_when( x == 0 & y < 2 ~ 0.5, x == 1 & y < 2 ~ 0.8, x == 0 & y > 2 ~ 0.7, x == 1 & y > 2 ~ 0.9, # 替换成你的需求值 TRUE ~ NA # 处理r2=2这类未覆盖的情况 ) } r3 <- overlay(r1, r2, fun=calc_r3)
方法二:向量化运算(适合小栅格)
如果你的栅格数据量不大,直接把栅格转成向量处理会更直观,做完判断再转回栅格:
# 提取两个栅格的单元格值为向量 v1 <- getValues(r1) v2 <- getValues(r2) # 向量版条件判断 v3 <- case_when( v1 == 0 & v2 < 2 ~ 0.5, v1 == 1 & v2 < 2 ~ 0.8, v1 == 0 & v2 > 2 ~ 0.7, v1 == 1 & v2 > 2 ~ 0.9, TRUE ~ NA ) # 将结果转为栅格,继承r1的空间属性 r3 <- setValues(r1, v3)
方法三:用terra包(更现代的替代方案)
要是你愿意尝试新工具,terra是raster的升级版,处理速度更快,语法也更简洁:
library(terra) # 把raster对象转成terra的SpatRaster(如果原数据是raster格式) r1_terra <- rast(r1) r2_terra <- rast(r2) # 直接用条件语句生成r3 r3_terra <- ifel(r1_terra == 0 & r2_terra < 2, 0.5, ifel(r1_terra == 1 & r2_terra < 2, 0.8, ifel(r1_terra == 0 & r2_terra > 2, 0.7, ifel(r1_terra == 1 & r2_terra > 2, 0.9, NA))))
或者结合case_when让逻辑更清晰:
r3_terra <- case_when( r1_terra == 0 & r2_terra < 2 ~ 0.5, r1_terra == 1 & r2_terra < 2 ~ 0.8, r1_terra == 0 & r2_terra > 2 ~ 0.7, r1_terra == 1 & r2_terra > 2 ~ 0.9, TRUE ~ NA ) %>% rast()
这些方法里,我个人最推荐overlay()(raster包)或者terra的方案,尤其是处理大栅格时,分块运算不会把内存占满,效率更高。
内容的提问来源于stack exchange,提问作者mikey
相关产品推荐
相关产品推荐

