如何在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
相关产品推荐
相关产品推荐

