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