当前位置: 首页 > 知识库问答 >
问题:

在GeoPandas或Shapely中合并多边形(合并为单个几何体)

穆建元
2023-03-14

我试图在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()

没有一个输出几何是我所期望的,这是以下内容:

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从输入多边形(df1df2)输出上述多边形(poly_union)?

其次,我试图找到的几何体(poly_union)的正确命名法是什么?我会称之为“并集”,但我发现的每个涉及“并集”的示例都不会输出这种几何体。

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

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

共有3个答案

微生自怡
2023-03-14

@拉特格·霍夫斯特的回答对我来说也是最好的。如果多边形缺少具有常量值的列,只需逐个创建即可

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

梁丘扬
2023-03-14

如果你比较喜欢Geopand,你可以考虑溶解并使用一个具有常量值的列来表示所有条目:http://geopandas.org/aggregation_with_dissolve.html

长孙阳焱
2023-03-14

从这里的问题/答案来看,这似乎被称为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,则级联联合将被一元联合取代-这允许不同几何体类型上的联合,而不仅仅是多边形。要检查您的版本,

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

 类似资料:
  • 有没有办法在python中合并两个重叠的GEOJSON多边形,返回一个合并的GEOJSON对象?

  • 我有一对(封闭的)多边形,每个多边形被定义为一个点序列(顶点)。每个多边形都代表一块土地,由一条小河分开,所以溪流在两个多边形之间形成一个狭窄的缝隙。 我正在寻找一种算法,通过将两个多边形连接成一个连接的多边形来识别和消除间隙。 下图显示了一个示例,其中原始多边形为绿色和红色,生成的多边形显示为黄色。 到目前为止,我已经能够做到以下几点: 对于多边形A中的每条边,找到多边形B中最近的顶点。 找到多

  • 我是新来的,对C#来说也是新来的,我希望有一个简单的问题要解决。 (我使用gmaps.net for winforms来实现这一点,但也将通过web API maps版本使用该方法)。 我们的数据库中有一个zipcodes和Area的数据库。每个区域包含多个Zipcode。每个zipcode都有一系列坐标,可以为该zipcode创建一个google maps多边形。 目前,如果我们想在地图上显示我

  • 假设我有两个不相交的多边形组/“岛屿”(想想两个不相邻县的人口普查区)。我的数据可能看起来像这样: 我希望每个岛内的多边形采用表示其组的ID(可以是任意的)。例如,左下角的3个多边形的IslandID为1,右上角的3个多边形的IslandID为2。 我已经开发了一种方法来做到这一点,但我想知道这是否是最好/最有效的方法。我做以下工作: 1) 创建一个几何体等于多多边形一元并集内多边形的地理数据框。

  • 我的python3脚本创建了变量,其值是一个shapefiles列表,每个shapefiles都是一个多边形,表示一个地理区域 但它给出的结果是:AttributeError:“Shape”对象没有属性“union” 我看到了另一种方法,它涉及创建一个shapefilewriter对象,然后依次覆盖列表https://gis.stackexchange.com/questions/103033/u

  • 问题内容: 我整个上午都在搜索,但是大多数合并示例仅基于一个键,而在多个键上却找不到任何东西。 pid = 111,sid = 6,eid = 123的值在x和y中都匹配,然后合并为一条记录。如果它们不匹配,只需将其原样带过来。 我想要的最终结果: 问题答案: 这是从元组中重新锁定: