使用terra包对SpatRaster单元格应用自定义归一化函数时出错求助
问题解决:栅格归一化函数的向量兼容修改
错误原因
terra::app()处理SpatRaster时,会把每个图层的所有单元格值以向量形式传入自定义函数,但你写的norm_formula是针对单个标量值的判断逻辑——当传入向量时,is.na(x)会返回布尔向量,直接用if语句判断就会触发"the condition has length > 1"的错误。
解决方案
方法1:将函数修改为向量化版本
把原函数中的if分支替换为支持向量运算的ifelse嵌套,让函数能直接处理向量输入:
norm_formula_vec <- function(x, min_value, max_value){ norm_x <- ifelse(is.na(x) | is.nan(x), NA, ifelse(x < min_value, 1, ifelse(x > max_value, 100, (100-1)*((x - min_value)/(max_value - min_value)) + 1))) return(norm_x) }
用修改后的函数运行:
library(terra) r <- rast(ncol=3, nrow=2) values(r) <- 1:ncell(r) s <- app(r, fun= function(x) norm_formula_vec(x, 0, 0.5)) # 查看结果 values(s)
方法2:使用terra::classify()高效处理栅格
针对栅格的区间分类场景,terra提供的classify()函数比app()更适配:
library(terra) r <- rast(ncol=3, nrow=2) values(r) <- 1:ncell(r) # 定义分类规则矩阵:[下限, 上限, 输出值/计算公式] class_mat <- matrix(c( -Inf, 0, 1, 0, 0.5, "99*((x - 0)/(0.5 - 0)) + 1", 0.5, Inf, 100 ), ncol=3, byrow=TRUE) # 应用分类规则 s <- classify(r, class_mat, right = FALSE) # 查看结果 values(s)
结果说明
你的测试栅格值为1到6,全部大于设定的最大值0.5,所以两种方法运行后,s的所有单元格值都会被映射为100,符合预期逻辑。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

