Geopandas数据框指向多边形 [英] Geopandas Dataframe Points to Polygons
问题描述
我有一个由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屋!