简体   繁体   English

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

[英]Convert lists of Coordinates to Polygons with GeoPandas

I got lists of coordinates in the csv file (please click the pic).在 csv 文件中获得了坐标列表(请点击图片)。 How should I convert them to polygons in GeoDataFrame?我应该如何将它们转换为 GeoDataFrame 中的多边形?

Below is the coordinates of one polygon and I have thousands rows of this.下面是一个多边形的坐标,我有数千行。

[118.103198,24.527338],[118.103224,24.527373],[118.103236,24.527366],[118.103209,24.527331],[118.103198,24.527338]

I tried the following codes:我尝试了以下代码:

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

But I failed in the last step, since df['LON'] returns 'series' not 'string' type.但我在最后一步失败了,因为 df['LON'] 返回 'series' 而不是 'string' 类型。 How should I get over this problem?我应该如何克服这个问题? It's better if there is an easier way to achieve my goal.如果有更简单的方法来实现我的目标,那就更好了。

Recreated a sample df of what your.csv file would give (depending on how your read it in with.read_csv()).重新创建了您的.csv 文件将给出的示例 df(取决于您使用.read_csv()读取它的方式)。

import pandas as pd
import geopandas as gpd

df = pd.DataFrame({'FENCE_LOC': ['[32250,175889],[33913,180757],[29909,182124],[28246,177257],[32250,175889]', 
                  '[32250,175889],[33913,180757],[29909,182124],[28246,177257],[32250,175889]', 
                  '[32250,175889],[33913,180757],[29909,182124],[28246,177257],[32250,175889]']}, index=[0, 1, 2])

Modified your function slightly because we want numeric values, not strings稍微修改了你的 function 因为我们想要数值,而不是字符串

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

We can use some list comprehensions to build a list of Shapely polygons.我们可以使用一些列表推导来构建一个 Shapely 多边形列表。

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]

Finally, we can create a gdf using our list of Shapely polygons.最后,我们可以使用 Shapely 多边形列表创建一个 gdf。

polygon_gdf =  gpd.GeoDataFrame(geometry=geom_list_2)

在此处输入图像描述

To make available a small representative dataset similar to what the OP posts as an image, I create this rows of data (sorry for too many decimal digits):为了提供一个类似于 OP 作为图像发布的小型代表性数据集,我创建了这些数据行(抱歉,十进制数字太多):

[[-2247824.100899419,-4996167.43201861],[-2247824.100899419,-4996067.43201861],[-2247724.100899419,-4996067.43201861],[-2247724.100899419,-4996167.43201861],[-2247824.100899419,-4996167.43201861]]
[[-2247724.100899419,-4996167.43201861],[-2247724.100899419,-4996067.43201861],[-2247624.100899419,-4996067.43201861],[-2247624.100899419,-4996167.43201861],[-2247724.100899419,-4996167.43201861]]
[[-2247624.100899419,-4996167.43201861],[-2247624.100899419,-4996067.43201861],[-2247524.100899419,-4996067.43201861],[-2247524.100899419,-4996167.43201861],[-2247624.100899419,-4996167.43201861]]
[[-2247824.100899419,-4996067.43201861],[-2247824.100899419,-4995967.43201861],[-2247724.100899419,-4995967.43201861],[-2247724.100899419,-4996067.43201861],[-2247824.100899419,-4996067.43201861]]
[[-2247724.100899419,-4996067.43201861],[-2247724.100899419,-4995967.43201861],[-2247624.100899419,-4995967.43201861],[-2247624.100899419,-4996067.43201861],[-2247724.100899419,-4996067.43201861]]
[[-2247624.100899419,-4996067.43201861],[-2247624.100899419,-4995967.43201861],[-2247524.100899419,-4995967.43201861],[-2247524.100899419,-4996067.43201861],[-2247624.100899419,-4996067.43201861]]
[[-2247824.100899419,-4995967.43201861],[-2247824.100899419,-4995867.43201861],[-2247724.100899419,-4995867.43201861],[-2247724.100899419,-4995967.43201861],[-2247824.100899419,-4995967.43201861]]
[[-2247724.100899419,-4995967.43201861],[-2247724.100899419,-4995867.43201861],[-2247624.100899419,-4995867.43201861],[-2247624.100899419,-4995967.43201861],[-2247724.100899419,-4995967.43201861]]
[[-2247624.100899419,-4995967.43201861],[-2247624.100899419,-4995867.43201861],[-2247524.100899419,-4995867.43201861],[-2247524.100899419,-4995967.43201861],[-2247624.100899419,-4995967.43201861]]

This data is saved as polygon_data.csv file.此数据保存为polygon_data.csv文件。

For the code, modules are loaded first as对于代码,模块首先加载为

import geopandas as gpd
import pandas as pd
from shapely.geometry import Polygon

Then, the data is read to create a dataframe by pandas.read_csv() .然后,通过pandas.read_csv()读取数据以创建 dataframe。 To get each row of data into a single column of the dataframe, delimiter="x" is used.要将每一行数据放入 dataframe 的单个列中,使用delimiter="x" Since there is no x within any row of data, the whole row of data as a long string is the result.由于任何一行数据中都没有x ,因此将整行数据作为一个长字符串作为结果。

df3 = pd.read_csv('polygon_data.csv', header=None, index_col=None, delimiter="x")

To view the content of df3 , you can run要查看df3的内容,您可以运行

df3.head()

and get single column (with header: 0) dataframe:并获得单列(使用 header: 0) dataframe:

                                                   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...

Next, df3 is used to create a geoDataFrame.接下来, df3用于创建 geoDataFrame。 Data in each row of df3 is used to create a Polygon object to act as the geometry of the geoDataFrame polygon_df3 . df3的每一行中的数据用于创建多边形 object 以充当 geoDataFrame 的geometry polygon_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)

Finally, the geoDataFrame can be plotted with a simple command:最后,geoDataFrame 可以用一个简单的命令来绘制:

# this plot the geoDataFrame
polygon_df3.plot(edgecolor='black')

In this particular case with my proposed data, the output plot is:在我提出的数据的这种特殊情况下,output plot 是:

3x3sq

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

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