You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R语言terra包实现两栅格图层的平滑渐变镶嵌?

实现栅格重叠区域的平滑过渡合并

要实现两个带掩膜栅格重叠区域的数值平滑过渡,可通过距离加权混合的方式实现——核心逻辑是根据每个像素到两个栅格有效区域的距离分配权重,距离越近权重越高,从而自然产生渐变效果。以下是基于terra包的具体实现方案:

步骤1:复用示例数据生成基础栅格

先运行你提供的代码生成两个目标栅格r和b:

library(terra)

# 创建值为1的栅格r
r <- rast(ncols = 36, nrows = 18)
r[450] <- 1
r <- 1 * buffer(r, width = 5000000) 
r[r == 0] <- NA

# 创建值为5的栅格b
b <- rast(ncols = 36, nrows = 18)
b[345] <- 1
b <- 1 * buffer(b, width = 5000000)
b[b == 1] <- 5
b[b == 0] <- NA

步骤2:生成有效区域的距离栅格

为两个栅格的非NA区域计算欧氏距离,得到用于权重分配的距离栅格:

# 生成r的有效区域掩码(非NA为1,NA为0)
mask_r <- !is.na(r)
# 计算每个像素到r有效区域的距离(单位与栅格CRS一致)
dist_r <- distance(mask_r)

# 同理生成b的距离栅格
mask_b <- !is.na(b)
dist_b <- distance(mask_b)

步骤3:计算权重并完成平滑混合

将距离转换为权重,加权合并两个栅格的数值:

# 计算总距离(加极小值避免除以0)
total_dist <- dist_r + dist_b + 1e-10

# 分配权重:距离目标栅格越近,权重越高
weight_r <- dist_b / total_dist
weight_b <- dist_r / total_dist

# 加权混合得到平滑过渡结果
m_smooth <- (r * weight_r) + (b * weight_b)

步骤4:对比效果

可以绘制原均值合并与平滑合并的结果进行对比:

# 原均值合并结果
m_mean <- mosaic(r, b, fun = "mean")

# 绘制对比图
par(mfrow = c(1,3))
plot(m_mean, main = "均值合并")
plot(m_smooth, main = "平滑过渡合并")
plot(mask_r + mask_b, main = "重叠区域")

自定义过渡效果说明

如果需要调整过渡的平缓程度,可对距离进行幂次变换,例如:

# 幂次为2时,过渡会更陡峭;幂次越小,过渡越平缓
weight_r <- (dist_b^2) / (dist_r^2 + dist_b^2)
weight_b <- (dist_r^2) / (dist_r^2 + dist_b^2)

内容的提问来源于stack exchange,提问作者Alexander Klug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:20:18