Geopandas数据框指向多边形 [英] Geopandas Dataframe Points to Polygons

查看:158
本文介绍了Geopandas数据框指向多边形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个由id和一个由2D点填充的几何列组成的geopandas数据框.我想将每个唯一ID的点连接起来以创建多边形,以便我的新数据框将具有多边形作为其几何形状.我的代码目前看起来像这样:

I have a geopandas dataframe made up of an id and a geometry column which is populated by 2D points. I want to join the points for each unique id to create a polygon, so that my new dataframe will have polygons as its geometry. My code currently looks something like this:

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时,它会说

It creates a polygon but when I assign the new variable poly it says

ValueError: Length of values does not match length of index"

这很有意义,因为它仍然只是坐标列表,而不是实际的多边形对象.有谁知道如何使它成为我可以添加到geopandas df上的列的实际多边形对象? 在此先感谢:)

which makes sense since it is still just a list of coordinates and not an actual polygon object. Does anyone know how to make this an actual polygon object that I can add to a column on a geopandas df?
Thanks in advance :)

推荐答案

我已经实现了与groupby函数相似的功能.假设您的点实际上是Shapely Point对象,并且以正确的顺序排序,则可以尝试这样的操作.

I have achieved something similar with the groupby function. Assuming your points are actually Shapely Point objects, and are sorted in the right order, you can try something like this.

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

这篇关于Geopandas数据框指向多边形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆