简体   繁体   English

Geopandas Dataframe指向多边形

[英]Geopandas Dataframe Points to Polygons

I have a geopandas dataframe made up of an id and a geometry column which is populated by 2D points. 我有一个由id和几何列组成的geopandas数据框,该列由2D点填充。 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. 我想加入每个唯一ID的点来创建一个多边形,这样我的新数据框就会将多边形作为几何体。 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])

It creates a polygon but when I assign the new variable poly it says 它创建了一个多边形,但是当我指定新的变量poly它会说

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

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 ? 有谁知道如何使这个实际的多边形对象,我可以添加到geopandas df上的列?
Thanks in advance :) 提前致谢 :)

I have achieved something similar with the groupby function. 我已经用groupby函数实现了类似的功能。 Assuming your points are actually Shapely Point objects, and are sorted in the right order, you can try something like this. 假设您的点实际上是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()

在此输入图像描述

Great answer @atkat12. 很棒的答案@ atkat12。 But according to your plot, last two box points should be (0,1) and (0,0): 但是根据你的情节,最后两个盒子点应该是(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') 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM