如何在R中利用sf对象插值生成中间常数值多边形?
基于sf对象生成两多边形间的插值多边形
你需要的是在两个属性值不同的嵌套多边形之间,生成对应指定属性值的中间多边形,这属于空间插值中的等值面提取场景。以下是基于sf生态的简便实现方案,无需手动计算节点距离:
实现步骤
- 准备数据:加载sf包,读取或创建你的两个多边形对象(pol1对应值10,pol2对应值20)
- 生成插值采样点:将两个多边形的边界离散为带属性值的采样点,也可生成内部网格点提升插值精度
- 空间插值生成连续表面:用IDW(反距离加权)插值生成覆盖两多边形区域的连续属性表面
- 提取等值面:从插值表面中提取属性值为13的等值线,转换为多边形对象
具体代码示例
library(sf) library(gstat) library(terra) # 示例数据(替换为你读取的.shp文件) pol1 <- st_polygon(list(rbind(c(0,0), c(0,1), c(1,1), c(1,0), c(0,0)))) %>% st_sfc() %>% st_sf(value = 10) pol2 <- st_polygon(list(rbind(c(-1,-1), c(-1,2), c(2,2), c(2,-1), c(-1,-1)))) %>% st_sfc() %>% st_sf(value = 20) # 合并两个多边形的边界点作为采样点 sample_points <- st_cast(rbind(pol1, pol2), "POINT") # 生成插值网格(覆盖两多边形的包围盒) bbox <- st_bbox(rbind(pol1, pol2)) grid <- st_make_grid(bbox, cellsize = 0.05, what = "centers") %>% st_sf() # 执行IDW插值 idw_model <- idw(value ~ 1, sample_points, newdata = grid, idp = 2) # 将插值结果转换为terra栅格对象,方便提取等值面 r <- rast(idw_model) contour_line <- contour(r, levels = 13, as.polygons = TRUE) # 转换回sf对象,得到目标多边形pol3 pol3 <- st_as_sf(contour_line) %>% st_cast("POLYGON") # 可视化验证 plot(pol2$geometry, col = "lightblue") plot(pol1$geometry, col = "pink", add = TRUE) plot(pol3$geometry, col = "orange", add = TRUE)
补充说明
- 针对复杂形状的多边形,可调整
st_make_grid的cellsize参数控制插值精度:值越小精度越高,但计算量也会增加 idp参数控制IDW插值的权重衰减速率,默认值2适配多数常规场景,可根据实际需求微调- 最终生成的
pol3可能包含多个多边形部件,可使用st_union()合并为单一多边形
内容的提问来源于stack exchange,提问作者jjunju
相关产品推荐
相关产品推荐

