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

如何计算geopandas DataFrame中多边形共享边长度并优化计算效率

计算Voronoi多边形相邻共享边长度的优化方案

原来的代码性能低主要来自三个冗余操作:嵌套循环中反复做全表NAME匹配查询、每次循环都临时创建GeoDataFrame、不必要的格式转换,以下是直接可运行的优化方案:

核心优化点

  • 提前构建NAME到行索引的映射字典,将每次邻居查询的时间复杂度从O(n)降到O(1)
  • 直接调用shapely几何对象的交集计算接口,省去循环内反复创建GeoDataFrame的开销
  • 支持直接存储列表类型到GeoDataFrame列,不需要拼接为字符串,后续取用更方便

优化后代码

import geopandas as gpd

vorList = gpd.GeoDataFrame(data)

# 预构建映射和几何列表,减少循环内查询开销
name_index_map = {name: idx for idx, name in vorList["NAME"].items()}
geom_list = vorList.geometry.tolist()

# 存储结果的列表,每个元素是对应多边形的相邻共享边长度数组
result_list = []

for idx, row in vorList.iterrows():
    current_geom = geom_list[idx]
    neighbor_names = row["NEIGHBORS"].split(",")
    cur_lengths = []
    for neighbor_name in neighbor_names:
        # 直接取邻居几何,不需要全表筛选
        neighbor_geom = geom_list[name_index_map[neighbor_name]]
        # 直接计算交集长度
        share_len = current_geom.intersection(neighbor_geom).length
        cur_lengths.append(round(share_len, 2))
    result_list.append(cur_lengths)

# 直接将数组存入列,pandas会自动以object类型存储
vorList["d"] = result_list

超大数据量额外优化建议

如果你的多边形数量超过1万,可以用以下方式进一步提效:

  • 用libpysal.weights.Rook.from_dataframe批量生成邻接矩阵和共享边长度,省去自己写循环的开销,整体速度可以提升5倍以上
  • 替换intersection为shapely的shared_paths方法计算共享路径,针对复杂多边形边界的计算效率更高

内容的提问来源于stack exchange,提问作者e.jimenez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:39:02