使用GeoPandas或Shapely将多边形组合成一个单一的几何体。

79
我正在尝试在GeoPandas中查找两个多边形的并集,并输出一个包含两个多边形顶点的单个几何体。 geopandas.overlay函数为每个单独的联合提供了多边形,但我想要一个单一的多边形。
为了背景,我正在使用这个来将两个行政区域合并成一个区域(即将城镇区划包括在国家内)。
以下示例来自geopandas网站,说明了我想要的内容:
from matplotlib import pyplot as plt
import geopandas as gpd
from shapely.geometry import Polygon

polys1 = gpd.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
                         Polygon([(2,2), (4,2), (4,4), (2,4)])])

polys2 = gpd.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
                         Polygon([(3,3), (5,3), (5,5), (3,5)])])

df1 = gpd.GeoDataFrame({'geometry': polys1, 'df1':[1,2]})
df2 = gpd.GeoDataFrame({'geometry': polys2, 'df2':[1,2]})

res_union = gpd.overlay(df1, df2, how='union')
res_union.plot()

res_union.png

输出的几何图形都不是我期望的,期望的是以下内容:

poly_union = gpd.GeoSeries([Polygon([(0,0), (0,2), (1,2), (1,3), \
    (2,3), (2,4), (3, 4), (3, 5), (5, 5), (5, 3), (4, 3), (4, 2), \
    (3,2), (3,1), (2, 1), (2, 0), (0, 0)])])

poly_union.plot(color = 'red')
plt.show()

union.png

首先,我如何使用GeoPandas或shapely从输入多边形(df1,df2)中输出上述多边形(poly_union)?其次,与我正在寻找的几何图形(poly_union)相关的正确术语是什么?我会称其为“联合”,但我找到的每个引用“联合”的示例都没有输出此几何图形。注意:此示例似乎也未输出单个多边形:This
poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()

merged_poly.png


记录一下,在2020年,使用geopandas v 0.8.1版本时,所有的overlay操作都没有改变(就我观察来看,自v 0.6.1以来都是如此)。 - swatchai
3个回答

84

注意:下面的答案中提到的cascaded_union已被unary_union取代,如果使用GEOS 3.2+,这将允许对不同几何类型进行联合,而不仅仅是多边形。要检查您的版本,请执行以下操作:

>>> shapely.geos.geos_version
(3, 5, 1)

根据这里的问题/答案,似乎这被称为shapely中的cascaded_union

from shapely.ops import cascaded_union
polygons = [poly1[0], poly1[1], poly2[0], poly2[1]]
boundary = gpd.GeoSeries(cascaded_union(polygons))
boundary.plot(color = 'red')
plt.show()

union


6
cascaded_unionshapely.ops.unary_union() 取代,如这里所述。它适用于不同的几何类型(不仅仅是多边形)。 - Firas Omrane
我收到一个错误:TopologyException: side location conflict at 5.4185235483127627 58.392789795412952 - zabop

21

17
@Rutger Hofste的回答对我也很有用。如果你的多边形缺少一个带有常量值的列,只需通过以下方式创建一个:

gdf['new_column'] = 0 gdf_new = gdf.dissolve(by='new_column')


如果您想在之后拆分多个几何图形,可以尝试以下代码: gdf_new = gpd.geoseries.GeoSeries([geom for geom in gdf_new.geometry.iloc[0].geoms]) - Timothy Dalton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接