将坐标列表转换为点几何
Converting a list of coordinates to point geometry
我的 geopandas df 看起来像这样:
events datum pz ... dst Aktenzahl geometry
0 22 2015.0 204 ... BSm BSm/204/30/2015 [16.34203, 48.21717]
1 22 2015.0 202 ... BSm BSm/202/8/2015 [16.34189, 48.21719]
如您所见,几何列是一个包含经度和纬度值的列表。有没有一种有效的方法可以将它们转换为点数?
这有效但效率很低:
pts = gpd.GeoDataFrame(geometry=gpd.points_from_xy(
[df['geometry'][0][0], df['geometry'][1][0]],
[df['geometry'][0][1], df['geometry'][1][1]]))
df["geometry"] = pts
df = gpd.GeoDataFrame(df, crs='epsg:4326').set_geometry('geometry')
df
events datum pz ... dst Aktenzahl geometry
0 22 2015.0 204 ... BSm BSm/204/30/2015 POINT (16.34203 48.21717)
1 22 2015.0 202 ... BSm BSm/202/8/2015 POINT (16.34189 48.21719)
当我把它放在一个循环中时,我得到 TypeError: len() of unsized object
for i in range(len(df['geometry'])):
print(df['geometry'][i][0], df['geometry'][i][1]) # works
print(gpd.GeoDataFrame(geometry=gpd.points_from_xy(df['geometry'][i][0], df['geometry'][i][1]))) # TypeError: len() of unsized object
基本上我需要 this 问题的反面。
此处可重现数据:
df={'events': {0: 22, 1: 22}, 'datum': {0: 2015.0, 1: 2015.0}, 'pz': {0: 204, 1: 202}, 'strasse': {0: 'Hernalser Gürtel', 1: 'Hernalser Gürtel'}, 'hnr': {0: 'unter U6', 1: 'unter U6'}, 'dst': {0: 'BSm', 1: 'BSm'}, 'Aktenzahl': {0: 'BSm/204/30/2015', 1: 'BSm/202/8/2015'}, 'geometry': {0: [16.34203, 48.21717], 1: [16.34189, 48.21719]}}
我不知道你为什么要循环。
df={'events': {0: 22, 1: 22}, 'datum': {0: 2015.0, 1: 2015.0}, 'pz': {0: 204, 1: 202}, 'strasse': {0: 'Hernalser Gürtel', 1: 'Hernalser Gürtel'}, 'hnr': {0: 'unter U6', 1: 'unter U6'}, 'dst': {0: 'BSm', 1: 'BSm'}, 'Aktenzahl': {0: 'BSm/204/30/2015', 1: 'BSm/202/8/2015'}, 'geometry': {0: [16.34203, 48.21717], 1: [16.34189, 48.21719]}}
df = pd.DataFrame(df)
df.geometry = gpd.points_from_xy(df.geometry[0], df.geomety[1])
gdf = gpd.GeoDataFrame(df, geometry='geometry', crs = 'epsg:4326)
所有坐标均已更改为点。
你觉得这样真的很低效吗?
更新
对不起,我搞错了。
我认为你想要的解决方案是这样的。
df.geometry = gpd.points_from_xy(pd.DataFrame(df.geometry.to_list())[0], pd.DataFrame(df.geometry.to_list())[1])
我的 geopandas df 看起来像这样:
events datum pz ... dst Aktenzahl geometry
0 22 2015.0 204 ... BSm BSm/204/30/2015 [16.34203, 48.21717]
1 22 2015.0 202 ... BSm BSm/202/8/2015 [16.34189, 48.21719]
如您所见,几何列是一个包含经度和纬度值的列表。有没有一种有效的方法可以将它们转换为点数?
这有效但效率很低:
pts = gpd.GeoDataFrame(geometry=gpd.points_from_xy(
[df['geometry'][0][0], df['geometry'][1][0]],
[df['geometry'][0][1], df['geometry'][1][1]]))
df["geometry"] = pts
df = gpd.GeoDataFrame(df, crs='epsg:4326').set_geometry('geometry')
df
events datum pz ... dst Aktenzahl geometry
0 22 2015.0 204 ... BSm BSm/204/30/2015 POINT (16.34203 48.21717)
1 22 2015.0 202 ... BSm BSm/202/8/2015 POINT (16.34189 48.21719)
当我把它放在一个循环中时,我得到 TypeError: len() of unsized object
for i in range(len(df['geometry'])):
print(df['geometry'][i][0], df['geometry'][i][1]) # works
print(gpd.GeoDataFrame(geometry=gpd.points_from_xy(df['geometry'][i][0], df['geometry'][i][1]))) # TypeError: len() of unsized object
基本上我需要 this 问题的反面。
此处可重现数据:
df={'events': {0: 22, 1: 22}, 'datum': {0: 2015.0, 1: 2015.0}, 'pz': {0: 204, 1: 202}, 'strasse': {0: 'Hernalser Gürtel', 1: 'Hernalser Gürtel'}, 'hnr': {0: 'unter U6', 1: 'unter U6'}, 'dst': {0: 'BSm', 1: 'BSm'}, 'Aktenzahl': {0: 'BSm/204/30/2015', 1: 'BSm/202/8/2015'}, 'geometry': {0: [16.34203, 48.21717], 1: [16.34189, 48.21719]}}
我不知道你为什么要循环。
df={'events': {0: 22, 1: 22}, 'datum': {0: 2015.0, 1: 2015.0}, 'pz': {0: 204, 1: 202}, 'strasse': {0: 'Hernalser Gürtel', 1: 'Hernalser Gürtel'}, 'hnr': {0: 'unter U6', 1: 'unter U6'}, 'dst': {0: 'BSm', 1: 'BSm'}, 'Aktenzahl': {0: 'BSm/204/30/2015', 1: 'BSm/202/8/2015'}, 'geometry': {0: [16.34203, 48.21717], 1: [16.34189, 48.21719]}}
df = pd.DataFrame(df)
df.geometry = gpd.points_from_xy(df.geometry[0], df.geomety[1])
gdf = gpd.GeoDataFrame(df, geometry='geometry', crs = 'epsg:4326)
所有坐标均已更改为点。
你觉得这样真的很低效吗?
更新
对不起,我搞错了。 我认为你想要的解决方案是这样的。
df.geometry = gpd.points_from_xy(pd.DataFrame(df.geometry.to_list())[0], pd.DataFrame(df.geometry.to_list())[1])