geopandas POLYGON 坐标到 x,y 坐标列

geopandas POLYGON coordinates to x,y coordinate columns

我有一个类型的 geopandas 数据框:

 id  \
0  028f342a-b26f-4e36-b5d1-25d3428cac2f   

                                                 add  
0  POLYGON ((33.78148 3.50903, 33.12417 3.50903, ... 

这是整个多边形:

;id;add
0;028f342a-b26f-4e36-b5d1-25d3428cac2f;POLYGON ((33.781475 3.5090296, 33.1241675 3.5090296, 33.1241675 4.392868066666667, 33.781475 4.392868066666667, 33.781475 3.5090296))

我想做的是将多边形角的所有 xy 坐标提取到 2 列中。所以,我尝试过的是(此代码适用于整个数据框):

List_Mvv_id = list(set(df['id']))

Full =[]
for i in List_Mvv_id:
    df = df[df['id']==i]
    P = df['add'].iloc[0]
    print(P)
    for x,y in P.exterior.coords:
        df['x'] = x
        df['y'] = y

        Full.append(df)

但是,它只returns多边形的第一个坐标:

                                     id  \
0  028f342a-b26f-4e36-b5d1-25d3428cac2f   
0  028f342a-b26f-4e36-b5d1-25d3428cac2f   
0  028f342a-b26f-4e36-b5d1-25d3428cac2f   
0  028f342a-b26f-4e36-b5d1-25d3428cac2f   
0  028f342a-b26f-4e36-b5d1-25d3428cac2f   

                                                 add          x        y  
0  POLYGON ((33.78148 3.50903, 33.12417 3.50903, ...  33.781475  3.50903  
0  POLYGON ((33.78148 3.50903, 33.12417 3.50903, ...  33.781475  3.50903  
0  POLYGON ((33.78148 3.50903, 33.12417 3.50903, ...  33.781475  3.50903  
0  POLYGON ((33.78148 3.50903, 33.12417 3.50903, ...  33.781475  3.50903  
0  POLYGON ((33.78148 3.50903, 33.12417 3.50903, ...  33.781475  3.50903  

我也试过这种方法:

def coord_lister(geom):
    coords = list(geom.exterior.coords)
    return (coords)

coordinates_list = df.geometry.apply(coord_lister)

但是我在提取 x,y 坐标时卡住了。

感谢任何见解。

使用apply()做循环就这么简单

import pandas as pd
import geopandas as gpd
import shapely
import io

df = pd.read_csv(io.StringIO(""";id;add
0;028f342a-b26f-4e36-b5d1-25d3428cac2f;POLYGON ((33.781475 3.5090296, 33.1241675 3.5090296, 33.1241675 4.392868066666667, 33.781475 4.392868066666667, 33.781475 3.5090296))"""), sep=";")

# recreate geodataframe
gdf = gpd.GeoDataFrame(df, geometry=df["add"].apply(shapely.wkt.loads))

# expand the co-ordinates
gdf["geometry"].apply(lambda p: list(p.exterior.coords)).explode().apply(pd.Series).rename(columns=({0:"x", 1:"y"}))
x y
0 33.7815 3.50903
0 33.1242 3.50903
0 33.1242 4.39287
0 33.7815 4.39287
0 33.7815 3.50903