Как преобразовать векторные точки в линии, соответствующие определенному порядку-Python - PullRequest
0 голосов
/ 28 октября 2019

Я работаю с набором точек, которые представляют различные остановки автобусной линии. У меня есть файл .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, и я получаю следующий результат:

image

Это не то, что я имел в виду. Мне нужно, чтобы зеленые точки были преобразованы в линию, которая учитывает порядок 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.
...