Фрейм данных Geopandas указывает на полигоны

У меня есть фрейм данных geopandas, состоящий из идентификатора и столбца геометрии, который заполнен 2D-точками. Я хочу объединить точки для каждого уникального идентификатора, чтобы создать многоугольник, чтобы мой новый фрейм данных имел многоугольники в качестве своей геометрии. В настоящее время мой код выглядит примерно так:

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"

что имеет смысл, поскольку это всего лишь список координат, а не фактический объект многоугольника. Кто-нибудь знает, как сделать из этого фактический полигональный объект, который я могу добавить в столбец геопанды df?
Заранее спасибо :)


person GSam11    schedule 23.08.2016    source источник


Ответы (2)


Я добился чего-то похожего с функцией 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()

введите описание изображения здесь

person atkat12    schedule 25.08.2016

Отличный ответ @ 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')
person DataK    schedule 30.05.2017