8

我有一个由 id 和几何列组成的 geopandas 数据框,该列由 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
提前致谢 :)

4

2 回答 2

8

我已经实现了与该groupby功能类似的东西。假设您的点实际上是 ShapelyPoint对象,并且按正确的顺序排序,您可以尝试这样的事情。

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

在此处输入图像描述

于 2016-08-25T20:23:32.143 回答
3

很好的答案@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')
于 2017-05-30T10:40:01.363 回答