如何在Python中用Shapely和Matplotlib移除狭长小多边形?
如何通过面积过滤Shapely生成的微小多边形
问题背景
用Shapely从6个点生成缓冲圆后,通过unary_union和polygonize提取重叠区域的独立多边形时,在靠近(4,0)的中心位置出现7个极小多边形,导致手动着色操作繁琐。尝试用膨胀腐蚀(先缓冲再反向缓冲)移除这类狭长小多边形,但因circles是列表对象无法直接调用buffer方法报错,希望通过面积筛选移除小多边形。
解决方案:按面积过滤多边形
直接在生成最终多边形列表时加入面积判断条件,就能过滤掉微小多边形。修改polygonize后的列表推导式,添加面积阈值判断即可:
# 原代码 # result = [geom for geom in polygonize(union)] # 修改后:添加面积过滤,阈值可根据实际情况调整 area_threshold = 0.01 # 可根据小多边形的实际面积调整 result = [geom for geom in polygonize(union) if geom.area > area_threshold]
这样会自动剔除所有面积小于area_threshold的微小多边形,无需手动注释对应的多边形和质心。
额外说明:膨胀腐蚀的正确用法
如果想尝试膨胀腐蚀方法,需要遍历circles列表中的每个多边形单独处理,不能直接对列表调用buffer:
eps = 0.001 # 遍历每个圆进行膨胀腐蚀操作 circles_cleaned = [circle.buffer(eps).buffer(-eps) for circle in circles] # 之后用处理后的circles_cleaned继续后续的unary_union等操作
不过这种方法可能会轻微改变原多边形的形状,相比之下按面积过滤的方式更精准,不会影响正常多边形的结构。
代码调整后的注意事项
过滤后result的长度会减少,建议使用自动生成的颜色方案,避免手动设置的colors列表长度不匹配:
# 替换手动颜色列表,使用自动生成的颜色 colors = cm.viridis(np.linspace(0, 1, len(result)))
内容的提问来源于stack exchange,提问作者Doda
相关产品推荐
相关产品推荐

