【问题标题】:Converting a list of coordinates to point geometry将坐标列表转换为点几何
【发布时间】:2022-01-19 08:05:29
【问题描述】:

我的 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]}}

【问题讨论】:

    标签: python geopandas shapely


    【解决方案1】:

    我不知道你为什么想要一个循环。

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

    【讨论】:

    • 嗨,感谢@Urban87 的回答!我绝对不想要一个循环。我试过你在那里做了什么。这有两个问题:1)看点。它们只有 lon/lon 和 lat/lat POINT (16.34203 16.34189) & POINT (48.21717 48.21719)。 2)对于你的最后一行,我得到SyntaxError: EOL while scanning string literal (<string>, line 1)
    • @D.J 哦,对不起。当列表位于 pandas 列中时,您可以将每个列表元素转换为列。我更新了我的答案。
    • 是的!有一些错别字/遗留位,但总而言之,这似乎有效。谢谢并记分:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多