Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 使用地理命令从点创建多边形_Pandas_Pandas Groupby_Geopandas - Fatal编程技术网

Pandas 使用地理命令从点创建多边形

Pandas 使用地理命令从点创建多边形,pandas,pandas-groupby,geopandas,Pandas,Pandas Groupby,Geopandas,我有一个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]

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

您的请求在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)
poly_ID     geometry
0   1   POLYGON ((10, 10, 15, 20, 20, 10))
1   2   POLYGON ((30, 30, 35, 40, 40, 30))

输出

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

注意:列<代码>几何体是一个字符串&我不确定您是否可以将其直接输入到
Shapely

您可以将输入和预期输出作为文本而不是图片发布吗?谢谢@moys。我已经在原始问题中添加了输入和所需的输出文本/代码。感谢@moys的快速回复-我可以看到这生成了一些“看起来”正确的内容,但正如您所说,我不确定这是否创建了正确的形状点几何体?下面的代码行正确地将输入转换为绘图线条几何体(无需在前面连接文本“Linestring”),因此我认为可能会有类似于转换为多边形的内容。geodf_poly=geodf_poly.groupby(['polygon_ID'])['geometry'])。应用(lambda x:LineString(x.tolist())另一个解决方案: