我有一个 geopandas 数据框,其中有几行具有重叠的多边形几何形状以及索引(唯一且连续)。我想将重叠的多边形几何形状合并为多多边形,并保留各个重叠多边形的相应最小索引。
例如: 地理数据框如下:
假设索引为 10233、10235、10238 的多边形几何重叠。我想要一个单行,将这些几何图形合并在一个多多边形中(而不是 3 个单独的几何图形),并且相应的索引应该是 3 行的最小索引,即 10233。我想对整个地理数据框执行此操作
我尝试使用 geopandas 的溶解功能:
gdf = gdf.dissolve(by = 'index').reset_index()
这不会执行任何操作,因为“index”是唯一的。我也尝试过:
gdf = gdf.dissolve().reset_index()
但是,这将所有几何图形组合成单行多多边形
我想这就是你的想法:
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")
任何遇到这个问题的人都想知道如果我们有“多边形链”如何解决这个问题,例如:
这就是你解决这个问题的方法(受到@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)
很可能不是最好的方法,但它确实有效。
这很有帮助,所以谢谢!
在我的数据上,它表现出无法按预期正确分配 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