R语言提取两栅格非重叠区域遇extent不一致报错问题咨询
R语言提取两个栅格非重叠区域问题解决
问题复现
需求为提取yellow栅格中所有不与red栅格重叠的像元(即可视化图中显示的全部黄色区域),使用raster包执行以下代码时报错:
mask(crop(yellow, red), red)
报错信息:
Error in compareRaster(x, mask) : different extent
两个栅格的extent(空间范围)信息:
# yellow栅格范围 class : Extent xmin : 16.96877 xmax : 28.91172 ymin : 40.81715 ymax : 48.22444 # red栅格范围 class : Extent xmin : 16.74428 xmax : 28.91172 ymin : 40.23355 ymax : 48.89783
可视化参考:
报错原因
crop函数参数逻辑写反:crop(x, y)的作用是将x裁剪到y的空间范围内,当前yellow的范围完全落在red的范围内部,执行crop(yellow, red)返回的还是原始yellow栅格,和red的空间范围不一致,触发mask函数内置的栅格一致性校验报错。- 掩膜逻辑缺失反向参数:就算范围对齐,默认
mask是保留mask层有值的区域,要提取不重叠区域需要开启反向掩膜参数。
可行解决方案
基于raster包实现
先将red栅格裁剪/对齐到和yellow完全一致的空间范围、分辨率、投影,再做反向掩膜即可:
library(raster) # 若两个栅格投影、分辨率完全一致,仅范围不同,直接裁剪即可 red_clip <- crop(red, yellow) # inverse=TRUE 表示保留mask层(即red_clip)值为NA的区域 yellow_no_overlap <- mask(yellow, red_clip, inverse = TRUE) # 若两个栅格分辨率/投影不一致,先重采样对齐再掩膜 # 分类栅格resample方法用ngb,连续栅格可换为bilinear red_align <- resample(red, yellow, method = "ngb") yellow_no_overlap <- mask(yellow, red_align, inverse = TRUE)
基于terra包实现(效率更高,适合大栅格)
terra是raster包的官方继任版本,处理速度远快于旧版raster包:
library(terra) # 若读取时直接用terra::rast读取可跳过格式转换步骤 y_rast <- rast(yellow) r_rast <- rast(red) r_clip <- crop(r_rast, y_rast) yellow_no_overlap <- mask(y_rast, r_clip, inverse = TRUE)
内容的提问来源于stack exchange,提问作者Giordano
相关产品推荐
相关产品推荐

