【问题标题】:Combine and sum values of overlapping Polygons in GeoPandas在 GeoPandas 中合并和求和重叠多边形的值
【发布时间】:2022-04-23 19:12:28
【问题描述】:

我有一个带有 a.o. 的 GeoPandas 数据框。多边形作为“几何”列和不同列中的相应值。例如。像这样:

import numpy as np
import geopandas as gpd
xmin, xmax, ymin, ymax = 900000, 1080000, 120000, 280000
xc = (xmax - xmin) * np.random.random(2000) + xmin
yc = (ymax - ymin) * np.random.random(2000) + ymin
gdf = gpd.GeoDataFrame(geometry=gpd.points_from_xy(xc,yc),crs=3857)
gdf['geometry'] = gdf['geometry'].buffer(5000)
gdf['value'] = np.random.random(2000)

gdf.head()
                                             geometry    value
0  POLYGON ((1058397.021 237842.681, 1058372.944 ...  0.792110
1  POLYGON ((907562.671 276549.404, 907538.595 27...  0.124436
2  POLYGON ((953685.557 229083.936, 953661.481 22...  0.264356
3  POLYGON ((1052030.845 242915.680, 1052006.769 ...  0.161183
4  POLYGON ((1063942.060 263330.293, 1063917.983 ...  0.972290

我想做的是创建描述所有多边形重叠的新多边形,并将这些重叠多边形的值相加,如下图所示:

我已经查看了溶解和 unary_union,但这些似乎都不起作用。任何建议表示赞赏。

【问题讨论】:

  • 不确定 GeoPandas,但在 R 中它是 ST_intersection

标签: fragment polygon geopandas


【解决方案1】:

对于任何对此解决方案感兴趣的人,这里有一个解决类似问题的示例。

首先创建地理数据框:

from shapely.geometry import Polygon
import geopandas
from shapely.ops import linemerge, unary_union, polygonize

dftest = geopandas.GeoDataFrame({'geometry': geopandas.GeoSeries([Polygon([(0,0), (3,0), (3,3), (0,3)]),
                                                                              Polygon([(0,0), (2,0), (2,2), (0,2)]),
                                                                            Polygon([(2,2), (4,2), (4,4), (2,4)]),
                                                                            Polygon([(1,1), (3,1), (3,3), (1,3)]),
                                                                            Polygon([(3,3), (5,3), (5,5), (3,5)])])}
                                            ).reset_index()
       
dftest['values'] = [4,3,2,1,0]

绘制这个:

dftest.plot('values', legend=True)

initial geodataframe

将所有多边形转换为线并执行联合:

lines = unary_union(linemerge([geom.exterior for geom 
                           in dftest.geometry]))

再次转换为(较小的)相交多边形和地理数据框:

polygons = list(polygonize(lines))
intersects = geopandas.GeoDataFrame({'geometry': polygons})

使用原始地理框架执行 sjoin 以获得重叠的多边形。然后对每个相交的多边形进行分组以执行(任意)聚合。

intersects['sum_overlaps'] = (intersects
                        .sjoin(dftest, predicate='within')
                        .reset_index()
                        .groupby(['level_0', 'index_right'])
                        .head(1)
                        .groupby('level_0')
                        .values.sum())

绘图结果

intersects.plot('sum_overlaps', legend=True)

overlap result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2020-01-26
    • 2021-07-20
    • 2018-06-14
    • 2020-12-22
    相关资源
    最近更新 更多