如何获取近乎连续不规则形状组的外围周长?
解决方案
核心思路
针对带微小间距的不规则城市街区形状组,先通过缓冲操作填补间隙,将离散形状融合为一个整体,再提取其外围轮廓或计算周长,避免凸包(convex_hull)带来的形状失真问题。
具体实现代码
import geopandas as gpd from shapely.geometry import Polygon # 示例数据 p1=Polygon([(0,0),(10,0),(10,9.8),(0,9.8)]) p2=Polygon([(10.2,10),(20,10),(20,20),(10.2,20)]) p3=Polygon([(10,10),(9.8,20),(0,10)]) df=gpd.GeoDataFrame(geometry=[p1,p2,p3]) # 1. 缓冲操作:填补微小间距,缓冲距离需略大于形状间的最大间隙宽度(此处间隙为0.2,设0.11即可) buffered = df.geometry.buffer(0.11) # 2. 合并所有缓冲后的形状为单一整体 merged = buffered.unary_union # 3. 提取外围轮廓(可选:若需还原近似原尺寸,可追加负缓冲操作) # merged = merged.buffer(-0.11) # 负缓冲还原尺寸,需根据实际需求调整 perimeter_geom = gpd.GeoSeries(merged.boundary) # 可视化验证 ax = df.plot(facecolor='lightblue', edgecolor='black') perimeter_geom.plot(ax=ax, color='red', linewidth=2)
关键说明
- 缓冲距离设置:缓冲距离必须大于形状间的最大微小间距,确保所有离散形状能被连接成一个整体。若需要还原近似原形状尺寸,可执行一次相同距离的负缓冲操作(注意负缓冲可能损失部分细节,需根据业务需求调整)。
- 替代方案:如果不想改变原形状尺寸,可结合
shapely.ops.unary_union与凹包(Concave Hull)算法,但凹包需要依赖额外库(如pysal),缓冲法是更直接通用的方案。
内容的提问来源于stack exchange,提问作者Juan C
相关产品推荐
相关产品推荐

