gpt4 book ai didi

python - 将点转换为线 Geopandas

转载 作者:行者123 更新时间:2023-11-28 18:10:24 25 4
gpt4 key购买 nike

您好,我正在尝试将 X 和 Y 坐标列表转换为直线。我想通过 groupby ID 和时间来映射这些数据。只要我 grouby 一列,我的代码就可以成功执行,但是两列是我遇到错误的地方。我引用了这个question .

这是一些示例数据:

ID  X           Y           Hour
1 -87.78976 41.97658 16
1 -87.66991 41.92355 16
1 -87.59887 41.708447 17
2 -87.73956 41.876827 16
2 -87.68161 41.79886 16
2 -87.5999 41.7083 16
3 -87.59918 41.708485 17
3 -87.59857 41.708393 17
3 -87.64391 41.675133 17

这是我的代码:

df = pd.read_csv("snow_gps.csv", sep=';')

#zip the coordinates into a point object and convert to a GeoData Frame
geometry = [Point(xy) for xy in zip(df.X, df.Y)]
geo_df = GeoDataFrame(df, geometry=geometry)

# aggregate these points with the GrouBy
geo_df = geo_df.groupby(['track_seg_point_id', 'Hour'])['geometry'].apply(lambda x: LineString(x.tolist()))
geo_df = GeoDataFrame(geo_df, geometry='geometry')

这是错误:ValueError: LineStrings must have at least 2 coordinate tuples

这是我想要得到的最终结果:

ID          Hour     geometry
1 16 LINESTRING (-87.78976 41.97658, -87.66991 41.9...
1 17 LINESTRING (-87.78964000000001 41.976634999999...
1 18 LINESTRING (-87.78958 41.97663499999999, -87.6...
2 16 LINESTRING (-87.78958 41.976612, -87.669785 41...
2 17 LINESTRING (-87.78958 41.976624, -87.66978 41....
3 16 LINESTRING (-87.78958 41.97666, -87.6695199999...
3 17 LINESTRING (-87.78954 41.976665, -87.66927 41....

请就如何对多个参数进行分组提出任何建议或想法。

最佳答案

你的代码很好,问题是你的数据。

你可以看到,如果按 ID 和 Hour 分组,则只有 1 个 ID 为 1,小时为 17 的点。一个 LineString 必须由 1 个或多个点组成(必须至少有2 个坐标元组)。我在您的示例数据中添加了另一点:

ID   X          Y           Hour
1 -87.78976 41.97658 16
1 -87.66991 41.92355 16
1 -87.59887 41.708447 17
1 -87.48234 41.677342 17
2 -87.73956 41.876827 16
2 -87.68161 41.79886 16
2 -87.5999 41.7083 16
3 -87.59918 41.708485 17
3 -87.59857 41.708393 17
3 -87.64391 41.675133 17

正如您在下面看到的,下面的代码几乎与您的相同:

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point, LineString, shape

df = pd.read_csv("snow_gps.csv", sep='\s*,\s*')

#zip the coordinates into a point object and convert to a GeoData Frame
geometry = [Point(xy) for xy in zip(df.X, df.Y)]
geo_df = gpd.GeoDataFrame(df, geometry=geometry)

geo_df2 = geo_df.groupby(['ID', 'Hour'])['geometry'].apply(lambda x: LineString(x.tolist()))
geo_df2 = gpd.GeoDataFrame(geo_df2, geometry='geometry')

关于python - 将点转换为线 Geopandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51071365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com