Конвертировать точки в линии Geopandas
Здравствуйте, я пытаюсь преобразовать список координат X и Y в строки. Я хочу сопоставить эти данные groupby
идентификаторы, а также по времени. Мой код выполняется успешно, пока я grouby
один столбец, но два столбца, где я сталкиваюсь с ошибками. Я ссылался на этот вопрос.
Вот некоторые примеры данных:
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 должен иметь как минимум 2 кортежа координат
Это конечный результат, который я пытаюсь получить:
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....
Пожалуйста, любые предложения или идеи будут хороши о том, как сгруппировать несколько параметров.
1 ответ
Ваш код хорош, проблема в ваших данных.
Вы можете видеть, что если вы группируете по ID и часу, то есть только 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')