Geopandas Dataframe指向多边形

时间:2016-08-23 15:04:08

标签: python pandas shapely geopandas

我有一个由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上的列? 在此先感谢:)

2 个答案:

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

enter image description here

答案 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')