我有一个由id和几何列组成的地理数据框,该列由2D点填充。我想加入每个唯一ID的点来创建一个多边形,这样我的新数据框就会将多边形作为几何体。我的代码目前看起来像这样:
polygons = geopandas.GeoDataFrame()
for i in id:
group = df[df['id']== i]
polygon = {'type': 'Polygon', 'coordinates': group['geometry']}
polygon['poly'] = polygon
polygons = geopandas.concat([polygon,polygons])
它会创建一个多边形,但是当我指定新变量poly
时,它会显示
ValueError: Length of values does not match length of index"
这是有道理的,因为它仍然只是一个坐标列表而不是一个实际的多边形对象。有谁知道如何使这个实际的多边形对象,我可以添加到geopandas df
上的列?
在此先感谢:)
答案 0 :(得分:4)
我已经使用groupby
函数实现了类似的功能。假设您的点实际上是Shapely Point
对象,并按正确的顺序排序,您可以尝试这样的事情。
import pandas as pd
import geopandas as gp
from shapely.geometry import Point, Polygon
# Initialize a test GeoDataFrame where geometry is a list of points
df = gp.GeoDataFrame( [['box', Point(1, 0)],
['box', Point(1, 1)],
['box', Point(2,2)],
['box', Point(1,2)],
['triangle', Point(1, 1)],
['triangle', Point(2,2)],
['triangle', Point(3,1)]],
columns = ['shape_id', 'geometry'],
geometry='geometry')
# Extract the coordinates from the Point object
df['geometry'] = df['geometry'].apply(lambda x: x.coords[0])
# Group by shape ID
# 1. Get all of the coordinates for that ID as a list
# 2. Convert that list to a Polygon
df = df.groupby('shape_id')['geometry'].apply(lambda x: Polygon(x.tolist())).reset_index()
# Declare the result as a new a GeoDataFrame
df = gp.GeoDataFrame(df, geometry = 'geometry')
df.plot()
答案 1 :(得分:1)
很棒的答案@ atkat12。但根据你的情节,最后两个盒子点应该是(0,1)和(0,0):
# Initialize a test GeoDataFrame where geometry is a list of points df = gp.GeoDataFrame( [['box', Point(1, 0)], ['box', Point(1, 1)], ['box', Point(0,1)], ['box', Point(0,0)], ['triangle', Point(1, 1)], ['triangle', Point(2,2)], ['triangle', Point(3,1)]], columns = ['shape_id', 'geometry'], geometry='geometry')