【发布时间】:2021-06-10 09:22:15
【问题描述】:
我在尝试附加包含几何类型的数据框时遇到以下问题。我正在查看的 pandas 数据框如下所示:
name x_zone y_zone
0 A1 65.422080 48.147850
1 A1 46.635708 51.165745
2 A1 46.597984 47.657444
3 A1 68.477700 44.073700
4 A3 46.635708 54.108190
5 A3 46.635708 51.844770
6 A3 63.309560 48.826878
7 A3 62.215572 54.108190
如您所见,每个name 有四行,因为它们代表多边形的角。我需要它采用 geopandas 中定义的多边形形式,即我需要一个GeoDataFrame。为此,我将以下代码仅用于 name 之一(只是为了检查它是否有效):
df = df[df['name']=='A1']
x = df['x_zone'].to_list()
y = df['y_zone'].to_list()
polygon_geom = Polygon(zip(x, y))
crs = {'init': "EPSG:4326"}
polygon = gpd.GeoDataFrame(index=[name], crs=crs, geometry=[polygon_geom])
print(polygon)
返回:
geometry
A1 POLYGON ((65.42208 48.14785, 46.63571 51.16575...
polygon.info()
<class 'geopandas.geodataframe.GeoDataFrame'>
Index: 1 entries, A1 to A1
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 geometry 1 non-null geometry
dtypes: geometry(1)
memory usage: 16.0+ bytes
太棒了,太好了。因此,对于更多name,我认为以下方法可行:
unique_place = list(df['name'].unique())
GE = []
for name in unique_aisle:
f = df[df['id']==name]
x = f['x_zone'].to_list()
y = f['y_zone'].to_list()
polygon_geom = Polygon(zip(x, y))
crs = {'init': "EPSG:4326"}
polygon = gpd.GeoDataFrame(index=[name], crs=crs, geometry=[polygon_geom])
print(polygon.info())
GE.append(polygon)
但它返回的是一个列表,而不是一个数据框。
[ geometry
A1 POLYGON ((65.42208 48.14785, 46.63571 51.16575...,
geometry
A3 POLYGON ((46.63571 54.10819, 46.63571 51.84477...]
这很奇怪,因为 *.append(**) 如果要附加的是 pandas 数据框,效果会很好。
我错过了什么?此外,即使在第一种情况下,我只剩下几何列,但这不是问题,因为我可以将文件写入 shp 并再次读取它以获得第二列(名称)。
感谢任何能让我前进的解决方案!
【问题讨论】: