不使用stop_sequence确定正确的GTFS停止顺序?

时间:2013-07-05 20:29:44

标签: google-maps-api-3 google-api gtfs

我正在使用GTFS Feed来处理我正在使用的应用。我试图列出所选路线的所有站点。目前,我正在尝试通过stop_sequence对列表进行排序,但这不能正常工作,因为有些行程不会到达每个站点,而且我收到的数据会在每次行程时每秒停止一次stop_sequence。这样做的意义在于stop_sequence不会考虑可能有更多或更少停顿的其他旅行。

以下是一个例子:

这是路线停靠点的顺序,(忽略每次行程不会在每次停靠时停止的事实)

Stop A
Stop B
Stop C
Stop D
Stop E

现在这里有一些路线示例:

Trip 1: A, B, C, D
Trip 2: A, B, E

我的数据在做什么:

对于旅行1:

Stop A: stop_sequence = 1
Stop B: stop_sequence = 2
Stop C: stop_sequence = 3
Stop D: stop_sequence = 4

对于旅行2:

Stop A: stop_sequence = 1
Stop B: stop_sequence = 2
Stop E: stop_sequence = 3

因此,当我尝试为路线订购所有潜在的停靠点时,我最终会这样:

Stop A
Stop B
Stop C
Stop E
Stop D

显然不正确。

有没有人知道正确订购止损的任何其他潜在想法,也许使用GTFS Feed附带的其他数据?

更新了真实世界的例子

以下是获取路由915的所有停靠点的数据库查询的示例输出。 这是针对AM计划的。

+---------+---------+---------------+------------------------------------------------+
| stop_id | trip_id | stop_sequence | stop_name                                      |
+---------+---------+---------------+------------------------------------------------+
| 11771   | 1269287 |             1 | LOTTE PLAZA US 40 & US 29                      |
| 11772   | 1269280 |             1 | HARPER'S FARM RD & CEDAR LA eb                 |
| 11773   | 1269280 |             2 | LITTLE PATUXENT & GRAY STAR wb                 |
| 11774   | 1269280 |             3 | LITTLE PATUXENT & WHITE CORD WAY wb            |
| 11775   | 1269280 |             4 | LITTLE PATUXENT & BRIGHT PASSAGE eb            |
| 11776   | 1269280 |             5 | LITTLE PATUXENT & HICKORY RID nb               |
| 11777   | 1269280 |             6 | LITTLE PATUXENT & CEDAR LA eb                  |
| 11778   | 1269280 |             7 | LITTLE PATUXENT & HARPER'S FARM opp eb         |
| 11779   | 1269280 |             8 | COLUMBIA MALL & SOUTH RING RD eb               |
| 11782   | 1269280 |             9 | BROKEN LAND & HICKORY RIDGE sb                 |
| 11780   | 1269289 |             9 | LITTLE PATUXENT & GOV WARFIELD nb              |
| 11783   | 1269280 |            10 | BROKEN LAND PARK & RIDE                        |
| 11781   | 1269289 |            10 | LITTLE PATUXENT & VANTAGE PT nb                |
| 11784   | 1269280 |            11 | SCAGGSVILLE PARK & RIDE                        |
| 11785   | 1269280 |            12 | BURTONSVILLE PARK & RIDE                       |
| 11786   | 1269280 |            13 | COLESVILLE RD  & FENTON ST sb                  |
| 11787   | 1269280 |            14 | SILVER SPRING METRO STATION                    |
| 11788   | 1269280 |            15 | WALTER REED HOSP & 16TH ST NW                  |
| 11789   | 1269280 |            16 | 16TH ST & P ST NW                              |
| 11790   | 1269280 |            17 | 16TH ST & M ST NW                              |
| 11718   | 1269280 |            18 | K ST & 16TH ST NW fs eb                        |
| 11719   | 1269280 |            19 | K ST & 14TH ST NW eb                           |
| 11791   | 1269280 |            20 | 13TH ST & H ST NW sb                           |
| 11759   | 1269280 |            21 | PENNSYLVANIA AVE & 12TH ST NW eb               |
| 11793   | 1269280 |            22 | CONSTITUTION AVE & 10TH ST NW fs eb            |
| 12046   | 1269280 |            23 | 7TH ST NW & CONSTITUTION AVE eb                |
| 11650   | 1269280 |            24 | INDEPENDENCE AVE & 7/6 ST SW mid eb            |
| 11601   | 1269280 |            25 | INDEPENDENCE AVE & 4TH/3RD ST SW eb            |
| 13627   | 1269280 |            26 | M ST & 1st ST SE (NAVY YARD) sb                |
| 13628   | 1269280 |            27 | M ST & 4th ST SE (SOUTHEAST FEDERAL CENTER) eb |
| 11569   | 1269280 |            28 | M ST & ISAAC HALL AVE SE eb                    |
| 11795   | 1269280 |            29 | M ST & 8/9TH STS mid eb                        |
+---------+---------+---------------+------------------------------------------------+

以下是许多通勤者目前使用的时间表的pdf链接。两个列表的不同之处在于“COLUMBIA MALL& SOUTH RING RD eb”

http://mta.maryland.gov/sites/default/files/915May2011B.pdf

我试图让这个应用程序尽可能通勤友好,但是当与通勤者通常使用的相比,当停靠点出现故障时,可能会引起很多混乱。

更新2:

我仍然没有看到如何使用拓扑排序来获得正确的序列。是的,它可能会提供有效的序列,但不能保证通勤者能够轻松识别的正确序列。让我们看一下使用我提供的pdf的另一个例子。我们将看看第1和第5旅行,直到停止“哥伦比亚购物中心”。我会创建以下边缘:

从第1行创建的边缘

Cedar Lane --> Gray Star Way
Gray Star Way --> White Cord Way
...
Harpers Farm Rd --> Columbia Mall

从Trip 5

创建的边缘
Lotte Plaza --> Columbia Mall

拓扑排序唯一确保的是

  

对于从顶点u到顶点v的每个有向边uv,u在排序之前出现

这意味着有多个有效的排序,但只有一个是我想要的实际的正确的(但是我没有办法按顺序选择这个超过其他有效的排序,至少不是我能想到的。)

有效排序可能是(这也是正确的顺序):

Lotte Plaza,
Cedar Lane
Gray Star
...
Columbia Mall

甚至

Cedar Lane
Gray Star
...
Lotte Plaza
Columbia Mall

正如您所看到的,根据拓扑排序,这两个都是有效的,但只有其中一个是我想要的。我想不出根据GTFS提供的数据一致地选择正确序列的方法。

如果我以错误的方式看这个,请告诉我。

2 个答案:

答案 0 :(得分:3)

您可以构建有向图(DAG),其中属于路径的每个停靠点是一个节点,并且行程中两个停靠点之间的每个过渡都是边。然后,您可以对图形(http://en.wikipedia.org/wiki/Topological_sorting)执行拓扑排序以获得停靠点的排序。请注意,拓扑排序仅适用于没有循环的图形,但有些行程实际上具有循环,因此如果创建循环,则不希望添加边缘。

这恰好是OneBusAway应用程序套件用于订购停靠点的算法: https://github.com/OneBusAway/onebusaway-application-modules/blob/master/onebusaway-transit-data-federation/src/main/java/org/onebusaway/transit_data_federation/impl/beans/RouteBeanServiceImpl.java#L281

请注意,有时路线会有叉子或分支,其中有两组停靠点(每个分支一个)不相互交互。一个天真的拓扑排序可能会随意交错这些停靠点,但OBA代码使用以下两种启发式方法来获得更自然的排序:

1)组在同一分支中停在一起。

2)当相对于彼此排序两个分支时,首先将分支放置得更靠近分支点。

答案 1 :(得分:0)

对于遇到此问题的任何人,这就是几年前我如何解决问题的方法。

没有一个正确的序列-这里的目标是产生一个“视觉上最佳”的序列(在大多数情况下)。而不是查看各个停靠点-我将停靠点分组为逻辑部分,然后以与拓扑排序不太相似的过程将这些部分合并在一起。

然后可以将其他规则/权重添加到不相关的部分,然后确定哪个部分应优先于其他部分。例如ABC ---> CDE或GHI

https://github.com/mhkey/supersequence