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

如何在R中对栅格内的缺失值进行空间插值?

栅格缺失值区域插值实现方案

你需要填充栅格中矩形缺失区域的NA值,以下是几种贴合需求的实现方法,涵盖你熟悉的点插值方法(IDW、克里金、样条)以及栅格直接插值的方式:

1. 统一使用Terra包(推荐,替代Raster包)

先修正代码,避免混用Terra与Raster包,保持代码一致性:

library(terra)
# 创建原始栅格
r <- rast(xmin=0, xmax=10, ymin=0, ymax=10, nrows=50, ncols=50)
values(r) <- 1:ncell(r)
# 创建缺失区域栅格并标记NA
e <- rast(xmin=2, xmax=4, ymin=2, ymax=4, nrows=10, ncols=10)
r <- mask(r, e, inverse=TRUE)
plot(r)

栅格内的缺失值

2. 方法一:Terra内置插值函数直接填充

Terra的interpolate()函数可直接对栅格NA区域插值,支持多种经典方法:

(1)样条插值(Spline)

# 提取有效值作为样本点
pts <- as.points(r)
# 对缺失区域执行样条插值
r_spline <- interpolate(r, pts, method="spline")
plot(r_spline)

(2)IDW插值

r_idw <- interpolate(r, pts, method="idw", power=2)
plot(r_idw)

(3)克里金插值(Kriging)

需先拟合变异函数模型:

library(gstat)
# 转换为gstat兼容的空间对象
pts_sp <- as(pts, "Spatial")
# 拟合球状变异函数
vgm_model <- variogram(layer ~ 1, pts_sp) %>% fit.variogram(model=vgm("Sph"))
# 执行克里金插值
r_krige <- interpolate(r, pts, method="krige", model=vgm_model)
plot(r_krige)

3. 方法二:手动点插值→栅格化(适配你熟悉的点插值流程)

若更习惯先处理点数据再转栅格,可按以下流程操作:

# 1. 提取栅格中的有效值点
valid_pts <- as.data.frame(r, xy=TRUE) %>% na.omit()
# 2. 生成缺失区域的所有栅格中心点
na_cells <- as.data.frame(r, xy=TRUE) %>% filter(is.na(layer))
# 3. 执行IDW插值(可替换为krige/spline等你熟悉的方法)
library(gstat)
idw_result <- idw(layer ~ x + y, locations=valid_pts, newdata=na_cells, idp=2)
# 4. 将插值结果填充回原始栅格
r_filled <- r
r_filled[na_cells$x, na_cells$y] <- idw_result$var1.pred
plot(r_filled)

关键说明

  • 上述方法针对多边形范围的缺失区域,本质是利用缺失区域周围的有效栅格点作为样本,对缺失区域内的每个栅格单元逐一插值,无需额外多边形处理——栅格的NA区域已明确标记出需要插值的范围。
  • 若缺失区域为任意非矩形多边形,只需用mask()函数将对应多边形范围内的栅格设为NA,后续插值流程完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:05:58