【问题标题】:Create polygons from points with GeoPandas使用 GeoPandas 从点创建多边形
【发布时间】:2020-06-07 01:34:56
【问题描述】:

我有一个 geopandas 数据框,其中包含一系列形状优美的 POINT 几何图形。还有另一列包含 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()

我想按 poly_ID 进行分组,以便将几何图形从 POINT 转换为 POLYGON。这个输出基本上看起来像:

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 替换为 Polygon 会导致 TypeError:'Point' 类型的对象没有 len()

【问题讨论】:

  • 您可以将您的输入和预期输出作为文本而不是图片发布吗?
  • 谢谢@moys。我已在原始问题中添加了输入和所需的输出文本/代码。

标签: pandas pandas-groupby geopandas


【解决方案1】:

在 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))

注意:geometry 是一个字符串,我不确定您是否可以将其直接输入 Shapely

【讨论】:

  • 感谢@moys 的快速回复 - 我可以看到这会生成一些“看起来”正确的东西,但就像你说的,我不确定这是否创建了正确的形状点几何?以下代码行正确地将输入转换为线串几何图形(无需在前面连接文本“线串”),所以我认为会有类似的东西转换为多边形。 geodf_poly = geodf_poly.groupby(['polygon_ID'])['geometry'].apply(lambda x: LineString(x.tolist()))
猜你喜欢
  • 2021-08-02
  • 2022-06-10
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多