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

如何获取近乎连续不规则形状组的外围周长?

解决方案

核心思路

针对带微小间距的不规则城市街区形状组,先通过缓冲操作填补间隙,将离散形状融合为一个整体,再提取其外围轮廓或计算周长,避免凸包(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:30:01