关于GTFS数据集中单向行程识别方法的技术问询
关于GTFS数据集中单向行程识别方法的技术问询
嗨,这个问题戳中了GTFS数据处理里的一个常见坑——靠单条trip的下一站固定来判断单向确实不靠谱,毕竟很多路线会有中途转向的设计。我结合GTFS的核心数据结构,给你几个更准确的思路:
1. 先借助trips表的direction_id字段快速筛查
GTFS规范里,direction_id(一般取值为0或1)是用来标记同一条路线的往返方向的。如果某条route_id对应的所有trip,其direction_id只有唯一值(比如全是0,从来没出现过1),那基本可以判定这条路线是单向运营的(包括你说的单向环线)。
不过要注意:有些数据源可能没严格填充这个字段,或者把环线的direction_id统一设为0,这时候就得结合下面的方法进一步验证。
2. 对比同路线下的站点序列反向匹配(最可靠的核心方法)
这是判断单向行程的黄金标准:
- 先从
stop_times表中,按trip_id分组,把每个trip经过的stop_id按stop_sequence排序,生成一个站点序列(比如用R的话,可以把每个trip的stop_id拼接成字符串,或者存成向量) - 然后按
route_id分组,检查组内有没有两个trip的站点序列是完全反向的:比如trip1的序列是A→B→C→D,trip2的序列是D→C→B→A - 如果同一条route下找不到任何一对这样的反向序列,那这条路线就是单向的(包括单向环线,因为环线的序列是
A→B→C→A,反向序列是A→C→B→A,若没有这样的trip,就是单向循环)
给你一个R里的简单实现思路(用dplyr):
library(dplyr) # 生成每个trip的站点序列字符串 trip_stop_sequences <- stop_times %>% arrange(trip_id, stop_sequence) %>% group_by(trip_id) %>% summarise(stop_seq_str = paste(stop_id, collapse = "→"), route_id = first(route_id)) %>% ungroup() # 按route分组,检查是否存在反向序列 one_way_routes <- trip_stop_sequences %>% group_by(route_id) %>% mutate(has_reverse = any(sapply(stop_seq_str, function(x) { rev_str <- paste(rev(strsplit(x, "→")[[1]]), collapse = "→") rev_str %in% stop_seq_str }))) %>% filter(!has_reverse) %>% distinct(route_id)
3. 结合routes表的辅助信息做补充验证
有些GTFS数据源会在routes表的route_short_name或route_desc里标注“单向环线”“单向运营”这类信息,可以作为补充判断,但不能作为核心标准——毕竟不同机构的标注规范差异很大。
最后补充下你之前的误区:单条trip的下一站固定只适用于那种极端的“定点循环”路线,但大部分单向路线(比如单向贯穿城市的线路)的下一站是依次变化的,只是没有反向的对应行程,所以必须从同路线的多trip对比入手才行。
备注:内容来源于stack exchange,提问作者lena
相关产品推荐
相关产品推荐

