对 geopandas 中相交/重叠的几何图形进行分组和组合

问题描述 投票:0回答:3

我有一个 geopandas 数据框,其中有几行具有重叠的多边形几何形状以及索引(唯一且连续)。我想将重叠的多边形几何形状合并为多多边形,并保留各个重叠多边形的相应最小索引。

例如: 地理数据框如下:

original geodataframe

假设索引为 10233、10235、10238 的多边形几何重叠。我想要一个单行,将这些几何图形合并在一个多多边形中(而不是 3 个单独的几何图形),并且相应的索引应该是 3 行的最小索引,即 10233。我想对整个地理数据框执行此操作

我尝试使用 geopandas 的溶解功能:

gdf = gdf.dissolve(by = 'index').reset_index()

这不会执行任何操作,因为“index”是唯一的。我也尝试过:

gdf = gdf.dissolve().reset_index()

但是,这将所有几何图形组合成单行多多边形

python python-3.x gis geopandas shapely
3个回答
4
投票

我想这就是你的想法:

import geopandas as gpd

# load your geodataframe ..

# self join on geodataframe to get all polygon intersections
intersects = gdf.sjoin(gdf, how="left", predicate="intersects")

# dissolve intersections on right index indices using the minimum value
intersects_diss = intersects.dissolve("id_right",aggfunc="min")

# dissolve again on left index using minimum
intersects_diss = intersects_diss.reset_index().dissolve("id_left",aggfunc="min")


2
投票

任何遇到这个问题的人都想知道如果我们有“多边形链”如何解决这个问题,例如:

  • 多边形 A 与 B 相交
  • 多边形 B 与 A 和 C 相交
  • 多边形 C 与 B 相交

这就是你解决这个问题的方法(受到@NielsFlohr的回答的启发):

import geopandas as gpd

# load your geodataframe ..

# self join on geodataframe to get all polygon intersections
intersects = gdf.sjoin(gdf[["geometry"]], how="left", predicate="intersects").reset_index()

# dissolve intersections on right index indices aggregating to list
intersects_diss = intersects.dissolve(
    "index_right",
    aggfunc=lambda x: x.tolist(),
)
intersects_diss["id"] = gdf["id"]
intersects_diss.geometry = intersects_diss.geometry.buffer(0)

# determine which polygons are connected
intersects_diss["polygon_group"] = None
for i in range(len(polygons)):
    if intersects_diss.loc[i, "polygon_group"] is None:
        intersects_diss.loc[i, "polygon_group"] = i
    poly_group = intersects_diss.loc[i, "polygon_group"]
    intersects_diss.loc[intersects_diss["index"].apply(lambda x: i in x), "polygon_group"] = poly_group

# dissolve on the polygon_group
intersects_diss = intersects_diss.dissolve(
    "polygon_group",
    aggfunc="min",
)
intersects_diss.geometry = intersects_diss.geometry.buffer(0)

很可能不是最好的方法,但它确实有效。


0
投票

这很有帮助,所以谢谢!

在我的数据上,它表现出无法按预期正确分配 ID 的问题。这取决于多边形的呈现顺序。为了避免这个问题,请直接使用“indices”的first_valid_index而不是“group_id”...

for i range(len(temp)):
    first_valid_index = temp.loc[temp['indices'].apply(lambda x: i in x), group_id].first_valid_index()
    temp.loc[i, 'group_id'] = i if first_valid_index == None else temp.loc[first_valid_index, 'group_id']
    id = temp.loc[i, 'group_id']
    temp.loc[temp['indices'].apply(lambda x: i in x), 'group_id'] = id
© www.soinside.com 2019 - 2024. All rights reserved.