首页
/ Shapely库中Voronoi多边形分割技术的应用与优化

Shapely库中Voronoi多边形分割技术的应用与优化

2025-06-15 09:47:41作者:凤尚柏Louis

概述

在空间数据处理领域,处理多边形重叠区域是一个常见需求。本文探讨了如何使用Shapely库中的Voronoi多边形分割技术来解决多边形重叠问题,并提出了优化方案。

问题背景

当多个多边形在空间上存在重叠时,我们需要一种方法将这些重叠区域合理分配给各个多边形,同时满足两个核心条件:

  1. 每个结果多边形必须完全包含在原始多边形内
  2. 所有多边形的总面积保持不变

初始解决方案

使用Shapely 2.1.0新增的ordered=True参数进行Voronoi多边形分割:

# 创建示例多边形
gdf = gpd.GeoDataFrame(
    geometry=[
        box(0, 0, 1.1, 1.1),
        box(1, 1, 2, 2),
        box(0.5, 0.5, 1.5, 1.5),
        box(2.5, 2.5, 3, 3),
        box(1.4, 0.5, 2, 1.1),
    ]
)

# 生成Voronoi多边形
voronoi = shapely.voronoi_polygons(
    shapely.geometrycollections(gdf.geometry.centroid.values._data),
    ordered=True
)

# 与原始多边形求交
gdf.geometry = gdf.intersection(_voronoi_series)

这种方法虽然消除了重叠,但会导致部分区域未被充分利用,形成空白间隙。

优化方案

通过结合Shapely和libpysal.cg.voronoi_frames,我们提出了更优的解决方案:

def remove_overlap(gdf: gpd.GeoDataFrame) -> gpd.GeoDataFrame:
    # 保留原始索引
    gdf["_index"] = gdf.index
    
    # 计算所有重叠区域
    overlay = gdf.overlay(gdf, how="intersection")
    overlap = overlay[overlay._index_1 != overlay._index_2].union_all()
    
    if overlap.is_empty:
        return gdf
    
    # 处理非重叠区域
    shapes_no_overlap = gdf.difference(overlap).buffer(-1e-5)
    
    # 生成Voronoi分割
    _voronoi = voronoi_frames(shapes_no_overlap, return_input=False, as_gdf=False)
    
    # 与原始多边形求交
    gdf.geometry = gdf.intersection(_voronoi)
    
    return gdf

技术要点

  1. 重叠区域处理:首先识别并分离出所有重叠区域
  2. 缓冲区处理:使用微小负缓冲区确保几何体不接触
  3. Voronoi分割:在非重叠区域上应用Voronoi分割
  4. 结果整合:将分割结果与原始多边形求交

应用效果

该方法在多种场景下表现良好:

  • 对于简单矩形重叠,能合理分配重叠区域
  • 对于不同大小的圆形重叠,能保持原始形状特征
  • 对于复杂重叠模式,能产生合理的分割结果

结论

通过结合Shapely的空间操作功能和libpysal的Voronoi分割能力,我们实现了高效的多边形重叠处理方案。这种方法既保留了原始多边形的边界特征,又确保了空间分配的合理性,是处理空间数据重叠问题的有效手段。

登录后查看全文
热门项目推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
178
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
868
514
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
130
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
288
323
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
373
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
600
58
GitNextGitNext
基于可以运行在OpenHarmony的git,提供git客户端操作能力
ArkTS
10
3