Я работаю с набором точек, которые представляют различные остановки автобусной линии. У меня есть файл .csv
, который дает stop_id
, lon
, lat
, stop_sequence
(который определяет ордера остановок вдоль автобусной линии) и direction_id
(который равен 1 или 0и представляет направление движения автобуса.)
stop_id lat lon stop_sequence direction_id geometry
231519 StopPoint:59:3730058 48.770247 2.348581 5 1 POINT (2.348581 48.770247)
231520 StopPoint:59:3730064 48.759449 2.369324 2 1 POINT (2.369324 48.759449)
231521 StopPoint:59:3730062 48.759647 2.365572 3 1 POINT (2.365572 48.75964699999999)
231522 StopPoint:59:3730068 48.752867 2.377503 0 1 POINT (2.377503 48.75286699999999)
231523 StopPoint:59:3730066 48.756454 2.374298 1 1 POINT (2.374298 48.756454)
Я превратил этот массив данных в геоданный и преобразовал точки в линии с помощью метода, найденного здесь .
Это не принимает во внимание stop_sequence
gdf, и я получаю следующий результат:
Это не то, что я имел в виду. Мне нужно, чтобы зеленые точки были преобразованы в линию, которая учитывает порядок stop_sequence
. Что мне нужно, так это линия между остановкой 0 до остановки 1, остановкой 1 до остановки 2, остановкой 2 до остановки 3 и т. Д. До последнего останова линии для одного direction_id, а затем для другого.
IsЕсть ли способ сделать это с Python? Я мог бы также работать с qgis, но Python был бы предпочтительным.
РЕДАКТИРОВАТЬ: Вот упрощенная версия кода, который я использовал.
Я показал -above-пример, относящийся только к одной шинной линии, с которой я работаю, и каждая шинная линия связана с route_id
.
Полный gdf
следующий:
# Since I have to consider many bus line I thought it would be easier to first work with one of them: line_a.
test = gdf.loc[(gdf['route_id'] == 'line_a') & (gdf['direction_id'] == 1)].sort_values('stop_sequence')
test.head()
stop_id lat lon route_id stop_sequence direction_id geometry
494867 StopPoint:59:3730102 48.806131 2.472466 line_a 0 1 POINT (2.472466 48.806131)
246032 StopPoint:59:3730102 48.806131 2.472466 line_a 0 1 POINT (2.472466 48.806131)
233510 StopPoint:59:3730102 48.806131 2.472466 line_a 0 1 POINT (2.472466 48.806131)
246062 StopPoint:59:3730102 48.806131 2.472466 line_a 0 1 POINT (2.472466 48.806131)
246092 StopPoint:59:3730102 48.806131 2.472466 line_a 0 1 POINT (2.472466 48.806131)
И затем я использовал следующую строку кода, чтобы преобразовать точки lon / lat в LineStrings:
gdf2 = test.groupby(['route_id'])['geometry'].apply(lambda x: LineString(x.tolist()))
gdf2 = gpd.GeoDataFrame(gdf2, geometry='geometry')
gdf2['route_id'] = gdf2.index #I added this line because route_id was the gdf index and I couldn't .loc[] with it.
geometry route_id
route_id
line_a LINESTRING (2.472466 48.806131, 2.472466 48.80... line_a
И я наконец все построил с помощью:
gdf2.plot(ax=ax, color='mediumaquamarine', alpha=0.7, zorder=0) # Plot of the LineString.
gdf.loc[gdf['direction_id'] == 1].plot(ax=ax, color='green', alpha=0.7, zorder=1) # Plot of the station stops.