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

