You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:10:16