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

如何在Python中平滑相邻多边形且保持邻接关系?

平滑相邻多边形并保持邻接关系的Python实现

我需要一种平滑多边形的方法,使相邻/接触的多边形在平滑后仍保持接触状态。单个多边形可通过PAEK或Bezier插值轻松平滑,但这类方法会改变多边形边界,无法直接满足多邻接多边形的平滑需求。我希望找到Python实现方案以完成自动化处理。

此前找到过可行策略:将多边形边转换为节点间的线段,对这些线段平滑后再重构多边形,但不清楚如何在Python中将多边形的共享边界提取为单独折线。

示例代码(双多边形场景)

以下是针对两个多边形的测试代码,其中“平滑后”的多边形为手动创建:

import matplotlib.pyplot as plt
import geopandas as gpd
from shapely import geometry

x_min, x_max, y_min, y_max = 0, 20, 0, 20

## 创建原始(粗糙)多边形:
staircase_points = [[(ii, ii), (ii, ii + 1)] for ii in range(x_max)]
staircase_points_flat = [coord for double_coord in staircase_points for coord in double_coord] + [(x_max, y_max)]

list_points = {1: staircase_points_flat + [(x_max, y_min)],
               2: staircase_points_flat[1:-1] + [(x_min, y_max)]}
pols_coarse = {}
for ind_pol in [1, 2]:
    list_points[ind_pol] = [geometry.Point(x) for x in list_points[ind_pol]]
    pols_coarse[ind_pol] = geometry.Polygon(list_points[ind_pol])

df_pols_coarse = gpd.GeoDataFrame({'geometry': pols_coarse.values(), 'id': pols_coarse.keys()})

## 手动创建平滑后的多边形:
pols_smooth = {1: geometry.Polygon([geometry.Point(x) for x in [(x_min, y_min), (x_max, y_min), (x_max, y_max)]]),
               2: geometry.Polygon([geometry.Point(x) for x in [(x_min, y_min), (x_min, y_max), (x_max, y_max)]])}
df_pols_smooth = gpd.GeoDataFrame({'geometry': pols_smooth.values(), 'id': pols_smooth.keys()})

## 绘图
fig, ax = plt.subplots(1, 2, figsize=(10, 4))
df_pols_coarse.plot(column='id', ax=ax[0])
df_pols_smooth.plot(column='id', ax=ax[1])
ax[0].set_title('原始多边形')
ax[1].set_title('平滑后多边形');

预期效果

预期的平滑后邻接多边形效果

问题拆解与思路更新

结合相关建议,可将问题拆解为以下步骤:

  • 识别每对接触多边形之间的共享边界
  • 将共享边界转换为NumPy数组,采用B样条等方法进行平滑处理
  • 利用平滑后的边界重构多边形

另外补充:单个shapely.geometry多边形可通过pol.simplify()(基于Douglas-Peucker算法)实现平滑,但该方法无法维持多边形间的邻接关系。

内容的提问来源于stack exchange,提问作者Thijs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:24:28