基于多边形裁剪栅格后,如何平滑锯齿状边缘?
栅格掩膜裁剪边缘平滑方案与crop函数snap参数说明
一、解决边缘锯齿/突出问题的方法
栅格边缘的锯齿感,本质是因为栅格单元是离散的正方形,默认规则是判断单元中心是否在矢量边界内,导致跨边界的单元要么全保留要么全舍弃,出现边缘不贴合的情况。可以用以下两种思路处理:
1. 先平滑矢量边界再掩膜
先对矢量多边形做平滑处理,再用平滑后的边界进行掩膜裁剪,从源头上让边界更贴合栅格边缘:
library(geodata) library(terra) # 原数据加载 tmax <- worldclim_global("tmax", 2.5, path=tempdir()) tmax_yr <- tmax[[1]] mys <- gadm(country="MYS", level=1, path=tempdir()) mys <- terra::project(mys, crs(tmax_yr)) # 方法1:用terra::smooth直接平滑矢量边界(adjust值越大越平滑,按需调整) mys_smoothed <- terra::smooth(mys, adjust = 1.2) tmax_crop_smooth <- terra::crop(tmax_yr, mys_smoothed, mask = TRUE) # 方法2:缓冲-反缓冲实现平滑(缓冲距离匹配栅格分辨率,2.5度分辨率用0.1度左右) mys_buffer <- terra::buffer(mys, width = 0.1) mys_smoothed <- terra::buffer(mys_buffer, width = -0.1) tmax_crop_smooth <- terra::crop(tmax_yr, mys_smoothed, mask = TRUE) # 查看效果 plot(tmax_crop_smooth) plot(mys_smoothed, add = T)
2. 对掩膜后的栅格做邻域平滑
如果不想修改矢量边界,可以直接对掩膜后的栅格边缘做邻域滤波,填充边缘的突出/缺失单元:
# 先完成基础掩膜裁剪 tmax_masked <- terra::mask(tmax_yr, mys) # 创建3x3的邻域窗口,对边缘的NA单元用邻域均值填充(只处理NA区域) w <- matrix(1, 3, 3) tmax_smoothed <- terra::focal(tmax_masked, w, fun = mean, na.rm = TRUE, na.only = TRUE) plot(tmax_smoothed) plot(mys, add = T)
二、crop函数snap参数的作用
snap参数是用来控制裁剪范围与原栅格的对齐规则,和边缘锯齿无直接关联,但能保证裁剪后的栅格行列完全贴合原栅格的栅格线,可选值有三个:
"near"(默认):将裁剪范围的边界对齐到最近的栅格单元边缘"in":把裁剪范围向内收缩,对齐到完全包含在目标范围内的最内侧栅格线"out":把裁剪范围向外扩展,对齐到完全覆盖目标范围的最外侧栅格线
举个例子:如果你的矢量范围刚好在两个栅格单元之间,用snap="out"会把这两个单元都包含进去,snap="in"则只包含完全在范围内的单元。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

