如何将向量点转换为遵循特定顺序的线-python

时间:2019-10-28 09:14:13

标签: python qgis geopandas

我正在处理代表公交线路不同站点的一组点。我有一个.csv文件,其中提供了stop_idlonlatstop_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.

0 个答案:

没有答案