如何计算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
相关产品推荐
相关产品推荐

