使用GeoPandas从点创建多边形

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

我有一个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()))

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

pandas pandas-groupby geopandas
1个回答
0
投票

您的请求在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

© www.soinside.com 2019 - 2024. All rights reserved.