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

如何用Pandas实现GeoDataFrame的累积多边形并集(类cumsum操作)

实现GeoDataFrame的累积多边形并集(类似cumsum)

针对你的需求,要实现每一步取前n个多边形的并集并计算面积,Rolling工具因固定窗口不适用,可通过以下两种Pandas/GeoPandas方法实现:

方法一:使用expanding()窗口 + 自定义函数

expanding()会创建从第一行到当前行的累积窗口,完全匹配你的需求。我们可以对窗口内的几何对象执行unary_union,再提取面积:

import shapely
import geopandas as gpd

# 初始化数据
p0 = shapely.geometry.Point([0, 0]).buffer(1)
p1 = shapely.geometry.Point([1, 1]).buffer(1)
p2 = shapely.geometry.Point([1, 0]).buffer(1)

gdf = gpd.GeoDataFrame({'name' : ['p0', 'p1', 'p2'], 'geometry' : [p0, p1, p2]}, crs = 'epsg:4326')

# 定义累积并集面积计算函数
def cumulative_union_area(geometries):
    union = shapely.unary_union(geometries)
    return union.area

# 应用expanding窗口计算
gdf['evolving_area'] = gdf['geometry'].expanding().apply(cumulative_union_area)

print(gdf['evolving_area'])

方法二:迭代累积(更高效)

如果你的GeoDataFrame数据量较大,每次重新合并所有前面的多边形会有性能损耗,建议用迭代方式维护当前的并集对象,增量更新:

import shapely
import geopandas as gpd

# 初始化数据
p0 = shapely.geometry.Point([0, 0]).buffer(1)
p1 = shapely.geometry.Point([1, 1]).buffer(1)
p2 = shapely.geometry.Point([1, 0]).buffer(1)

gdf = gpd.GeoDataFrame({'name' : ['p0', 'p1', 'p2'], 'geometry' : [p0, p1, p2]}, crs = 'epsg:4326')

# 初始化累积并集和结果列表
current_union = None
evolving_areas = []

for geom in gdf['geometry']:
    if current_union is None:
        current_union = geom
    else:
        current_union = current_union.union(geom)
    evolving_areas.append(current_union.area)

# 赋值到GeoDataFrame
gdf['evolving_area'] = evolving_areas

print(gdf['evolving_area'])

两种方法都能得到你期望的结果,其中方法二在数据量大时效率更高,因为它避免了重复计算前面所有多边形的并集。

内容的提问来源于stack exchange,提问作者Magic Mushroom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:00:55