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

使用GeoPandas从点创建多边形

祁杰
2023-03-14

我有一个geopandas数据框,其中包含一个形状良好的点几何体列表。还有一列包含ID列表,用于指定每个点所属的唯一多边形。简化输入代码为:

import pandas as pd
from shapely.geometry import Point, LineString, Polygon
from geopandas import GeoDataFrame

data = [[1,10,10],[1,15,20],[1,20,10],[2,30,30],[2,35,40],[2,40,30]] 
df_poly = pd.DataFrame(data, columns = ['poly_ID','lon', 'lat']) 
geometry = [Point(xy) for xy in zip(df_poly.lon, df_poly.lat)]
geodf_poly = GeoDataFrame(df_poly, geometry=geometry)
geodf_poly.head()

我想按多边形ID分组,以便将几何体从点转换为多边形。该输出基本上如下所示:

poly_ID   geometry
1         POLYGON ((10 10, 15 20, 20 10))
2         POLYGON ((30 30, 35 40, 40 30))

我想这很简单,但我很难让它工作。我发现下面的代码允许我将其转换为开放式多段线,但无法计算出多边形。有人能建议如何适应这种情况吗?

geodf_poly = geodf_poly.groupby(['poly_ID'])['geometry'].apply(lambda x: LineString(x.tolist()))

简单地用多边形替换LineString会导致TypeError:类型'Point'的对象没有len()

共有1个答案

华锦程
2023-03-14

在Pandas中完成您的请求有点棘手,因为在您的输出中,您希望文本“POLYGON”,但括号中有数字。

请参见下面的选项

from itertools import chain
df_poly.groupby('poly_ID').agg(list).apply(lambda x: tuple(chain.from_iterable(zip(x['lon'], x['lat']))), axis=1).reset_index(name='geometry')

输出

poly_ID     geometry
0   1   (10, 10, 15, 20, 20, 10)
1   2   (30, 30, 35, 40, 40, 30)

from itertools import chain

df_new =df_poly.groupby('poly_ID').agg(list).apply(lambda x: tuple(chain.from_iterable(zip(x['lon'], x['lat']))), axis=1).reset_index(name='geometry')
df_new['geometry']=df_new.apply(lambda x: 'POLYGON ('+str(x['geometry'])+')',axis=1 )
df_new

输出

poly_ID     geometry
0   1   POLYGON ((10, 10, 15, 20, 20, 10))
1   2   POLYGON ((30, 30, 35, 40, 40, 30))

注意:列几何是一个字符串

 类似资料:
  • 我不熟悉geopandas,只想绘制多边形的轮廓,类似于PostGIS中的函数 我有一个地理数据框包含每个状态的多边形 当我按一个状态划分子集时,我能够绘制该状态: 我只对轮廓感兴趣,但在留档中不清楚如何将多边形转换为线几何。在或其他空间库中是否有有用的方法可以帮助将多边形转换为线性字符串?

  • 我的geodataframe如下所示: 我可以在“几何体”列中看到点列表,但我想将这些点拉出并放入列表中。例如,在pandas中,您可以执行类似df['column']的操作。到列表()。但是,在尝试此操作时,我得到一个错误: 你知道我如何去掉“多边形”名称,直接得到组成该多边形的点的列表吗?说清楚,我不想要多边形的外部或边界,我想要边界内的所有点。

  • 我有一个geopandas数据框,由一个id和一个由2D点填充的几何列组成。我想为每个唯一id连接点以创建一个多边形,以便我的新数据帧将多边形作为其几何体。我的代码当前看起来像这样: 它创建了一个多边形,但当我指定新变量时,它会显示 这很有意义,因为它仍然只是一个坐标列表,而不是实际的多边形对象。有人知道如何将它变成一个实际的多边形对象,我可以将它添加到geopandas上的列中吗 提前感谢:)

  • 我正在寻找一种方法来创建一组多边形(rechtangles),沿着一条线在多个多边形中创建一组多边形(rechtangles),并将其水平隔开,如图所示。 我尝试生成点并将其用作多边形的中点,但问题是,通过创建等间距的点光栅,除了180度之外,不可能以任何其他方向旋转。 例子 给出了一个多多边形形状的对象和由宽度和高度以及每个多边形之间的垂直和水平间距定义的多边形。多边形应仅放置在多多边形内,且不

  • 我有一些KMZ和KML文件,它们定义了Google Earth中的一些多边形。有没有办法用谷歌地图API读取这些文件并创建多边形? 谢啦!

  • 如何创建多色边框,如下图所示?