我正在处理代表公交线路不同站点的一组点。我有一个.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)
我将此数据框转换为地理数据框,并使用找到的方法here将点转换为线。
尽管它没有考虑gdf的stop_sequence
,但我得到以下结果:
这不是我的初衷。我需要将绿点转换为考虑了stop_sequence
顺序的行。
我需要的是在一个停靠点0到停靠点1,停靠点1到停靠点2,停靠点2到停靠点3之间的一条线,依此类推,直到该行的最后一个停靠点为止,对于一个direction_id,然后是另一方向。
有没有办法用python做到这一点?我也可以使用qgis,但最好使用python。
编辑:这是我使用的代码的简化版本。
在上面的示例中,我仅展示了一条仅与一条总线相关的示例,其中涉及的工作更多,并且每条总线都链接到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.