在 GeoPandas 或 Shapely 中合并多边形(合并为单个几何体)
Make a union of polygons in GeoPandas, or Shapely (into a single geometry)
我正在尝试在 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()
None 的输出几何形状符合我的预期,如下所示:
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()
首先,如何使用 GeoPandas 或 shapely 从输入多边形(df1
、df2
)输出上述多边形(poly_union
)?
其次,与我要查找的几何 (poly_union
) 相关的正确命名法是什么?我会称它为 'union' 但我发现每个引用 'unions' 的示例都不会输出此几何图形。
注意:示例似乎也没有输出单个多边形:
poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()
来自question/answer here, it seems this is called a cascaded_union
within 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()
注意:如果使用 GEOS 3.2+,cascaded_union
将被 unary_union
取代 - 这允许不同几何类型的并集,而不仅仅是多边形。要检查您的版本,
>>> shapely.geos.geos_version
(3, 5, 1)
如果您更喜欢 Geopandas 而不是 Shapely,您可以考虑解散并为所有条目使用具有常量值的列:
http://geopandas.org/aggregation_with_dissolve.html
@Rutger Hofste 的回答也最适合我。如果您的多边形缺少具有常量值的列,只需通过
创建一个
gdf['new_column'] = 0
gdf_new = gdf.dissolve(by='new_column')
我正在尝试在 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()
None 的输出几何形状符合我的预期,如下所示:
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()
首先,如何使用 GeoPandas 或 shapely 从输入多边形(df1
、df2
)输出上述多边形(poly_union
)?
其次,与我要查找的几何 (poly_union
) 相关的正确命名法是什么?我会称它为 'union' 但我发现每个引用 'unions' 的示例都不会输出此几何图形。
注意:
poly1 = df1['geometry']; poly2 = df2['geometry']
mergedpoly = poly1.union(poly2)
mergedpoly.plot()
来自question/answer here, it seems this is called a cascaded_union
within 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()
注意:如果使用 GEOS 3.2+,cascaded_union
将被 unary_union
取代 - 这允许不同几何类型的并集,而不仅仅是多边形。要检查您的版本,
>>> shapely.geos.geos_version
(3, 5, 1)
如果您更喜欢 Geopandas 而不是 Shapely,您可以考虑解散并为所有条目使用具有常量值的列: http://geopandas.org/aggregation_with_dissolve.html
@Rutger Hofste 的回答也最适合我。如果您的多边形缺少具有常量值的列,只需通过
创建一个gdf['new_column'] = 0
gdf_new = gdf.dissolve(by='new_column')