簡體   English   中英

使用 GeoPandas 將坐標列表轉換為多邊形

[英]Convert lists of Coordinates to Polygons with GeoPandas

在 csv 文件中獲得了坐標列表(請點擊圖片)。 我應該如何將它們轉換為 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_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])

稍微修改了你的 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])

我們可以使用一些列表推導來構建一個 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]

最后,我們可以使用 Shapely 多邊形列表創建一個 gdf。

polygon_gdf =  gpd.GeoDataFrame(geometry=geom_list_2)

在此處輸入圖像描述

為了提供一個類似於 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]]

此數據保存為polygon_data.csv文件。

對於代碼,模塊首先加載為

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

然后,通過pandas.read_csv()讀取數據以創建 dataframe。 要將每一行數據放入 dataframe 的單個列中,使用delimiter="x" 由於任何一行數據中都沒有x ,因此將整行數據作為一個長字符串作為結果。

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

要查看df3的內容,您可以運行

df3.head()

並獲得單列(使用 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...

接下來, df3用於創建 geoDataFrame。 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)

最后,geoDataFrame 可以用一個簡單的命令來繪制:

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

在我提出的數據的這種特殊情況下,output plot 是:

3x3sq

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM