Terra中buffer输出用作mask无效的原因及可行性咨询
问题分析:terra包中mask未生效的原因及buffer输出用作mask的可行性
一、mask未生效的原因
- 你用
rast()默认创建的栅格是WGS84(EPSG:4326)地理坐标系,单位为经纬度(度)。 - 调用
buffer(r, width=5000000)时,设置的缓冲宽度为5000000米。在地理坐标系下,terra会自动转换米到地理距离,但5000公里的缓冲范围极大——地球半径约6371公里,这个缓冲几乎覆盖了整个地球表面。 - 最终
b图层中几乎所有单元格都被标记为有效区域(非NA),用它执行mask时,s的所有值都会被完整保留,因此tst和s完全一致。
二、buffer输出能否用作mask?
完全可以,但需要注意两个关键细节:
- 缓冲宽度与投影匹配:如果使用地理坐标系,要确保缓冲宽度合理(比如改用较小的度数单位,或者先将栅格转换为投影坐标系,再用米作为宽度单位);如果使用投影坐标系(如UTM),直接用米作为宽度单位会更直观。
- 确保缓冲结果存在NA区域:只有当buffer输出的图层中存在未被覆盖的NA区域时,
mask才会起到筛选作用。比如把缓冲宽度改小为100公里,就能看到明显的mask效果。
修正示例代码
library(terra) # 创建基础栅格 r <- rast(ncols=36, nrows=18) r[500] <- 1 # 改用100公里的缓冲宽度 b <- buffer(r, width=100000) plot(b) s <- rast(ncols=36, nrows=18) values(s) <- runif(ncell(s)) tst <- mask(s, b) plot(tst)
内容的提问来源于stack exchange,提问作者Ana Catarina Vitorino
相关产品推荐
相关产品推荐

