在 GeoPandas 或 Shapely 中创建多边形的并集(形成单个几何体)

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

我试图在 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 从输入多边形(

poly_union
df1
)输出上述多边形(
df2
)?

其次,与我试图找到的几何体 (

poly_union
) 相关的正确命名法是什么? 我将其称为“联合”,但我发现的每个引用“联合”的示例都不会输出此几何图形。

注意:这个示例似乎也没有输出单个多边形:

poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()

merged_poly.png

python pandas geopandas shapely
3个回答
85
投票

注意:如果使用 GEOS 3.2+,下面答案中提到的

cascaded_union
将被
unary_union
取代 - 这允许不同几何类型的联合,而不仅仅是多边形。要检查您的版本,

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

here的问题/答案来看,这似乎在cascaded_union

中被称为
shapely

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


23
投票

如果您更喜欢 Geopandas 而不是 Shapely,您可能会考虑溶解并使用所有条目具有恒定值的列: http://geopandas.org/aggregation_with_dissolve.html


17
投票

@Rutger Hofste 的回答对我来说也最有效。如果您的多边形缺少具有恒定值的列,只需简单地创建一个:

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.