如何基于幼龄林栅格,统计移动窗口内老龄林像元总数
问题:针对幼龄林像元统计周边老龄林数量的高效计算方法
需求说明
现有两个0/1栅格掩码:
- 幼龄林存在/缺失栅格:值为1代表幼龄林像元,0代表非幼龄林区域
- 老龄林存在/缺失栅格:值为1代表老龄林像元,0代表非老龄林区域
需实现:对每个幼龄林像元,在可调宽度(range)的移动窗口内统计老龄林像元的总数,最终输出一个仅在幼龄林像元位置存储对应统计值的栅格(非幼龄林位置可保持0或无值)。
现有尝试及问题
方法1:全局使用focal函数计算
直接对大尺寸老龄林栅格执行移动窗口求和,代码如下:
> mature_mask class : SpatRaster dimensions : 31734, 16026, 1 (nrow, ncol, nlyr) resolution : 0.0002694946, 0.0002694946 (x, y) extent : -48.31876, -43.99984, -3.282444, 5.269697 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 (EPSG:4326) source(s) : memory name : classification_2019 min value : 0 max value : 1 range <- 21 mature_sum <- focal(mature_mask, range, sum, na.rm = TRUE) # 全局移动窗口求和
- 问题:计算效率极差,窗口大小为21时运行耗时约7分钟;窗口增大至101时直接触发内存不足错误(bad::alloc),无法完成计算。
方法2:通过buffer裁剪计算范围
考虑到两个栅格均为稀疏栅格,尝试先获取幼龄林周边区域,再掩码老龄林栅格以缩小计算范围,测试代码如下:
rm <- matrix(0, 6, 6) young <- rast(rm) young[1] <- 1 young[15] <- 1 old <- rast(rm) old[2] <- 1 old[16] <- 1 old[14] <- 1 young_surroundings <- buffer(young, 20) # 生成幼龄林周边缓冲区
- 问题:
buffer操作同样耗时,未能有效提升计算效率。
期望输出
得到old_sum栅格,仅在幼龄林像元位置存储对应窗口内的老龄林像元总数,示例如下:
old_sum <- young old_sum[1] <- 1 # 该幼龄林像元窗口内有1个老龄林像元 old_sum[15] <- 2 # 该幼龄林像元窗口内有2个老龄林像元
内容的提问来源于stack exchange,提问作者Ana Catarina Vitorino
相关产品推荐
相关产品推荐

