在 Geopandas/Python 中从重叠的多边形创建不同的非重叠多边形

Create distinct non-overlapping polygons from overlapping polygons in Geopandas/Python

提问人:user2503169 提问时间:11/17/2023 最后编辑:user2503169 更新时间:11/18/2023 访问量:87

问:

给定一个具有一些重叠多边形(缓冲区)的 GeoDataFrame,我想在有重叠的地方创建唯一的、不重叠的多边形,并保留不重叠的多边形。输出将没有重叠的面。此功能可在 ArcMap/ArcGIS Desktop 中使用要素转面工具使用:

https://pro.arcgis.com/en/pro-app/3.1/tool-reference/data-management/feature-to-polygon.htm

我尝试过很多不同的东西,但似乎不能完全正确。感谢您的帮助。

编辑以添加示例:

#example
import geopandas as gpd
from shapely.geometry import Point
import matplotlib.pyplot as plt
import numpy as np

polys = gpd.GeoDataFrame(geometry=[Point(0, 0), Point(1, 1), Point(1, 2), Point(2, 1)])
polys['geometry'] = polys.buffer(1)

ax2 = polys.plot(figsize=(5,5), edgecolor=u'white', color='gray')

colors = [1,2,3,4]
for name in (colors):
    polys.loc[polys['id'].eq(name)].plot(edgecolor=u'white', color=np.random.rand(3,), ax=ax2)

ax2.axis('scaled')
plt.show()

输出:

enter image description here

期望输出:

enter image description here

Python GIS Geopandas

评论

0赞 Marco Parola 11/17/2023
你能提供一些代码吗?
0赞 user2503169 11/17/2023
对不起,希望我刚刚添加的内容有所帮助。

答:

1赞 Timeless 11/17/2023 #1

IIUC,您可以多边形化每个单独多边形的外部unary_union

from shapely.ops import polygonize    

nonov_polys = gpd.GeoDataFrame(geometry=list(
        polygonize(polys.exterior.unary_union)))

print(nonov_polys.shape[0]) # 9 polygons

nonov_polys.plot(ec="w", cmap="plasma"); # + plt.text for annotations

enter image description here

评论

0赞 user2503169 11/17/2023
谢谢!我尝试了许多不同的使用叠加层的东西,包括遍历每个多边形,在其余功能上运行相交和差异,将它们添加到新的GeoDataFrame中......但不能完全正确。我尝试了您的建议,但是当有多个重叠时,它似乎不起作用。
0赞 Timeless 11/17/2023
你的问题仍然缺乏细节,但我更新了我的答案,给你一般的逻辑。
0赞 user2503169 11/18/2023
谢谢。仍然无法让它产生我正在寻找的东西。此示例中所需的输出是包含 9 个非重叠面的 geodataframe。因此,它将有 9 行,每个非重叠多边形对应一行。下面是一个 shapefile 表示形式:drive.google.com/drive/folders/...
0赞 Timeless 11/18/2023
知道了,更新的答案应该能给你你想要的东西。
1赞 user2503169 11/18/2023
是的,这行得通,而且是一句话!非常感谢,真的很感激!