Python 使用GeoPandas将坐标列表转换为多边形

Python 使用GeoPandas将坐标列表转换为多边形,python,pandas,geopandas,Python,Pandas,Geopandas,我得到了(请点击图片)。如何在GeoDataFrame中将它们转换为多边形 下面是一个多边形的坐标,我有数千行 [118.103198,24.527338],[118.103224,24.527373],[118.103236,24.527366],[118.103209,24.527331],[118.103198,24.527338] 我尝试了以下代码: def bike_fence_format(s): s = s.replace('[', '').replace(']', ''

我得到了(请点击图片)。如何在GeoDataFrame中将它们转换为多边形

下面是一个多边形的坐标,我有数千行

[118.103198,24.527338],[118.103224,24.527373],[118.103236,24.527366],[118.103209,24.527331],[118.103198,24.527338]
我尝试了以下代码:

def bike_fence_format(s):
    s = s.replace('[', '').replace(']', '').split(',')
    return s

df['FENCE_LOC'] = df['FENCE_LOC'].apply(bike_fence_format)

df['LAT'] = df['FENCE_LOC'].apply(lambda x: x[1::2])
df['LON'] = df['FENCE_LOC'].apply(lambda x: x[::2])

df['geom'] = Polygon(zip(df['LON'].astype(str),df['LAT'].astype(str)))

但是我在最后一步失败了,因为df['LON']返回的是'series'而不是'string'类型。我该如何克服这个问题?如果有更简单的方法来实现我的目标,那就更好了。

重新创建了一个.csv文件的示例df(取决于您使用.read\u csv()读取它的方式)

稍微修改了您的函数,因为我们需要的是数值,而不是字符串

def bike_fence_format(s):
    s = s.replace('[', '').replace(']', '').split(',')
    s = [float(x) for x in s]

    return s

df['FENCE_LOC'] = df['FENCE_LOC'].apply(bike_fence_format)


df['LAT'] = df['FENCE_LOC'].apply(lambda x: x[1::2])
df['LON'] = df['FENCE_LOC'].apply(lambda x: x[::2])
我们可以使用一些列表理解来构建一个形状多边形列表

geom_list = [(x, y) for x, y  in zip(df['LON'],df['LAT'])]

geom_list_2 = [Polygon(tuple(zip(x, y))) for x, y in geom_list]
polygon_gdf =  gpd.GeoDataFrame(geometry=geom_list_2)
最后,我们可以使用我们的形状多边形列表创建gdf

geom_list = [(x, y) for x, y  in zip(df['LON'],df['LAT'])]

geom_list_2 = [Polygon(tuple(zip(x, y))) for x, y in geom_list]
polygon_gdf =  gpd.GeoDataFrame(geometry=geom_list_2)

重新创建了一个.csv文件的示例df(取决于您如何使用.read_csv()读入)

稍微修改了您的函数,因为我们需要的是数值,而不是字符串

def bike_fence_format(s):
    s = s.replace('[', '').replace(']', '').split(',')
    s = [float(x) for x in s]

    return s

df['FENCE_LOC'] = df['FENCE_LOC'].apply(bike_fence_format)


df['LAT'] = df['FENCE_LOC'].apply(lambda x: x[1::2])
df['LON'] = df['FENCE_LOC'].apply(lambda x: x[::2])
我们可以使用一些列表理解来构建一个形状多边形列表

geom_list = [(x, y) for x, y  in zip(df['LON'],df['LAT'])]

geom_list_2 = [Polygon(tuple(zip(x, y))) for x, y in geom_list]
polygon_gdf =  gpd.GeoDataFrame(geometry=geom_list_2)
最后,我们可以使用我们的形状多边形列表创建gdf

geom_list = [(x, y) for x, y  in zip(df['LON'],df['LAT'])]

geom_list_2 = [Polygon(tuple(zip(x, y))) for x, y in geom_list]
polygon_gdf =  gpd.GeoDataFrame(geometry=geom_list_2)

为了提供一个小的代表性数据集,类似于OP发布的图像,我创建了以下数据行(很抱歉小数位数太多):

此数据保存为
polygon_data.csv
文件

对于代码,模块首先加载为

import geopandas as gpd
import pandas as pd
from shapely.geometry import Polygon
然后,通过
pandas.read\u csv()
读取数据以创建数据帧。要将每行数据放入数据框的一列中,需要使用
delimiter=“x”
。由于任何一行数据中都没有
x
,因此结果是整行数据作为一个长字符串

df3 = pd.read_csv('polygon_data.csv', header=None, index_col=None, delimiter="x")
要查看df3的内容,可以运行

df3.head()
并获取单列(标题为0)数据帧:

                                                   0
0  [[-2247824.100899419,-4996167.43201861],[-2247...
1  [[-2247724.100899419,-4996167.43201861],[-2247...
2  [[-2247624.100899419,-4996167.43201861],[-2247...
3  [[-2247824.100899419,-4996067.43201861],[-2247...
4  [[-2247724.100899419,-4996067.43201861],[-2247...
接下来,
df3
用于创建地理数据框。
df3
的每一行中的数据用于创建多边形对象,以充当geoDataFrame
Polygon\u df3
几何体

geometry = [Polygon(eval(xy_string)) for xy_string in df3[0]]
polygon_df3 = gpd.GeoDataFrame(df3, \
                   #crs={'init': 'epsg:4326'}, #uncomment this if (x,y) is long/lat
                   geometry=geometry)
最后,可以使用简单的命令绘制geoDataFrame:

# this plot the geoDataFrame
polygon_df3.plot(edgecolor='black')
在我提出的数据的这种特殊情况下,输出图为:


为了提供一个小的代表性数据集,类似于OP发布的图像,我创建了以下数据行(很抱歉小数位数太多):

此数据保存为
polygon_data.csv
文件

对于代码,模块首先加载为

import geopandas as gpd
import pandas as pd
from shapely.geometry import Polygon
然后,通过
pandas.read\u csv()
读取数据以创建数据帧。要将每行数据放入数据框的一列中,需要使用
delimiter=“x”
。由于任何一行数据中都没有
x
,因此结果是整行数据作为一个长字符串

df3 = pd.read_csv('polygon_data.csv', header=None, index_col=None, delimiter="x")
要查看df3的内容,可以运行

df3.head()
并获取单列(标题为0)数据帧:

                                                   0
0  [[-2247824.100899419,-4996167.43201861],[-2247...
1  [[-2247724.100899419,-4996167.43201861],[-2247...
2  [[-2247624.100899419,-4996167.43201861],[-2247...
3  [[-2247824.100899419,-4996067.43201861],[-2247...
4  [[-2247724.100899419,-4996067.43201861],[-2247...
接下来,
df3
用于创建地理数据框。
df3
的每一行中的数据用于创建多边形对象,以充当geoDataFrame
Polygon\u df3
几何体

geometry = [Polygon(eval(xy_string)) for xy_string in df3[0]]
polygon_df3 = gpd.GeoDataFrame(df3, \
                   #crs={'init': 'epsg:4326'}, #uncomment this if (x,y) is long/lat
                   geometry=geometry)
最后,可以使用简单的命令绘制geoDataFrame:

# this plot the geoDataFrame
polygon_df3.plot(edgecolor='black')
在我提出的数据的这种特殊情况下,输出图为:


您能将一些示例CSV数据作为文本而不是图像发布吗谢谢您的建议。我已经更新了问题。你试过我下面的答案了吗?我想它应该对你有用。如果是这样的话,我希望得到一个赞成票并接受答案。如果没有,请告诉我,我会根据需要更新。@MatthewBorish在他的声望足够高之前,他无法投票。我给你一个。你能把一些CSV数据样本作为文本而不是图像发布吗?谢谢你的建议。我已经更新了问题。你试过我下面的答案了吗?我想它应该对你有用。如果是这样的话,我希望得到一个赞成票并接受答案。如果没有,请告诉我,我会根据需要更新。@MatthewBorish在他的声望足够高之前,他无法投票。我给你一个。