Terra栅格重采样丢失小区域:原因及保留小区域的方法
Terra栅格重采样小区域丢失的问题解决
问题现象
- 原始栅格叠加效果:

- 重采样后效果:

精细栅格分辨率为0.1m,粗糙栅格分辨率为0.5m。将精细栅格重采样至粗糙栅格分辨率时,仅包含少量精细像素的粗糙单元格直接消失了。
使用的代码如下:
# 绘制原始栅格 plot(fine, col = "red") plot(rough, add = T) # 最大值法重采样 resampled <- resample(fine, rough, "max") # 绘制重采样后的栅格 plot(resampled , col = "red")
需求:输出栅格中,只要精细栅格存在至少一个像素的区域都能保留。
问题原因
核心原因是**resample默认的"max"方法未忽略NA值**:当粗糙栅格的单元格内同时包含精细栅格的非NA像素和大量NA像素时,未设置na.rm=TRUE的max计算会直接返回NA,导致这些仅含少量精细像素的单元格被判定为无值区域,绘图时自然消失。
少数情况下也可能存在栅格对齐偏差:精细栅格与粗糙栅格的原点、范围未完全匹配,导致小区域的精细像素刚好落在粗糙栅格单元格的采样范围之外,但从叠加图来看这种概率极低。
解决方法
针对需求,有两种直接可行的方案:
方案1:自定义重采样函数(保留原始像素最大值)
使用带na.rm=TRUE的自定义max函数,确保只要单元格内有非NA像素,就返回其最大值:
# 绘制原始栅格 plot(fine, col = "red") plot(rough, add = T) # 自定义max重采样,忽略NA值 resampled <- resample(fine, rough, fun = function(x) max(x, na.rm = TRUE)) # 替换全NA单元格产生的NaN为标准NA(保证栅格格式一致) resampled[is.nan(resampled)] <- NA # 绘制重采样后的栅格 plot(resampled, col = "red")
方案2:二进制标记(仅保留存在性)
如果只需要标记“是否存在精细栅格像素”,不需要保留原始值,可以先将精细栅格转为二进制栅格,再用"any"方法重采样:
# 将精细栅格转为二进制(非NA为1,NA为0) fine_binary <- classify(fine, cbind(NA, 0), right=TRUE) fine_binary[!is.na(fine)] <- 1 # 重采样:只要单元格内有1(即存在精细像素)就返回1 resampled_binary <- resample(fine_binary, rough, fun = any) # 绘制结果 plot(resampled_binary, col = "red")
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

