python 在geopandas中按相交/重叠几何分组和合并

lhcgjxsq  于 2023-05-12  发布在  Python
关注(0)|答案(2)|浏览(271)

我有一个geopandas dataframe,它有几行重叠的多边形几何图形沿着一个索引(唯一的和顺序的)。我想将重叠的多边形几何合并成一个多多边形,并保留各个重叠多边形的相应最小索引。
例如:geodataframe如下:
original geodataframe
假设索引为10233、10235、10238的多边形几何体重叠。我想一个单一的行与这些几何合并在一个多多边形(而不是3个单独的几何),相应的索引应该是3行,即10233的最小索引。我想对整个地理数据框架执行此操作
我尝试使用geopandas中的dissolve函数:
gdf = gdf.dissolve(by = 'index').reset_index()
这不会做任何事情,因为“index”是唯一的。我也试过:
gdf = gdf.dissolve().reset_index()
但是,这会将所有几何合并为单行多面

k4aesqcs

k4aesqcs1#

我想这就是你的想法

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")

csbfibhn

csbfibhn2#

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

  • 多边形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)

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

相关问题