如何用R语言将粗糙raster转换为平滑polygon
R语言将高分辨率栅格转换为平滑分类多边形的可行方案
针对0.25°分辨率的全球栅格数据,要实现类似《纽约时报》的平滑分类多边形效果,需要栅格预处理+多边形平滑的组合流程,单一方法很难达到理想效果。以下是经过验证的实操方案:
核心流程
先对栅格做模糊平滑+降采样,减少原始栅格的锯齿感;再转换为多边形,通过顶点简化+多轮平滑处理边缘,最后清理细碎图形。
1. 依赖包加载
library(terra) library(smoothr) library(dplyr)
2. 栅格重分类
先将连续栅格(如海表温度)重分类为目标类别(比如3类):
# 读取栅格数据 r <- rast("your_raster_file.nc") # 定义重分类规则(示例:将温度分为低、中、高3类) reclass_mat <- matrix(c(-Inf, 10, 1, 10, 20, 2, 20, Inf, 3), ncol=3, byrow=TRUE) r_reclass <- classify(r, reclass_mat)
3. 栅格预处理:高斯模糊+降采样
原始栅格分辨率太高,直接转多边形会产生大量锯齿,先做栅格级平滑:
# 创建高斯核(调整sigma值控制平滑程度,值越大越平滑) gauss_kernel <- focalMat(r_reclass, sigma=1, type="Gauss") # 对重分类后的栅格做高斯模糊(保留类别属性,用众数统计量) r_smoothed <- focal(r_reclass, w=gauss_kernel, fun="modal", na.rm=TRUE) # 降采样(减少栅格数量,降低后续多边形复杂度) r_agg <- aggregate(r_smoothed, fact=4, fun="modal") # fact=4将分辨率变为1°
4. 转换为多边形并初步简化
# 转多边形 poly <- as.polygons(r_agg, dissolve=TRUE) %>% st_as_sf() # 简化多边形顶点(减少顶点数量,避免平滑时运算量过大) poly_simplified <- simplify(poly, method="dp", keep=0.1) # keep值越小简化程度越高
5. 多边形平滑与优化
结合多种平滑方法,达到柔化效果:
# 方法1:核平滑(调整span值控制平滑度) poly_smooth1 <- smooth(poly_simplified, method="ksmooth", span=0.05) # 方法2:缓冲区收缩+扩张(进一步消除细碎锯齿) poly_smooth2 <- poly_smooth1 %>% st_buffer(dist=-0.1) %>% # 向内收缩 st_buffer(dist=0.1) # 向外扩张 # 清理细碎多边形(移除面积过小的碎块) poly_final <- drop_crumbs(poly_smooth2, threshold=1000) # threshold单位为平方公里
关键说明
- 单独用
smoothr::smooth效果不佳,是因为原始栅格的锯齿顶点太多,先做栅格高斯模糊+降采样能从根源减少锯齿; - 高斯核的
sigma、降采样的fact、平滑的span参数需要根据数据分辨率和需求调整,建议从小值开始测试; - 若需要更精细的平滑,可以尝试
smoothr::smooth的"chaikin"方法,或结合sf::st_smooth。
内容的提问来源于stack exchange,提问作者Ezra
相关产品推荐
相关产品推荐

