【问题标题】:Determine correct GTFS stop order without using stop_sequence?在不使用 stop_sequence 的情况下确定正确的 GTFS 停止顺序?
【发布时间】:2013-07-05 20:29:44
【问题描述】:

我正在为我正在开发的应用程序使用 GTFS 提要。我正在尝试列出所选路线的所有站点。目前,我正在尝试按 stop_sequence 对列表进行排序,但这无法正常工作,因为某些行程不会到达每个站点,并且我收到的数据会在每次 行程 的每个站点将 stop_sequence 增加 1。这样做的意义在于,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 提要附带的其他数据?

更新了一个真实的例子

这是获取路线 915 的所有停靠点的数据库查询的示例输出。 这是上午的时间表。

+---------+---------+---------------+------------------------------------------------+
| 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 在排序中排在 v 之前

这意味着有多个 valid 排序,但只有一个是我想要的实际 正确 一个(但我无法以编程方式选择这个超过其他有效的顺序,至少不是我能想到的)。

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

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

甚至

Cedar Lane
Gray Star
...
Lotte Plaza
Columbia Mall

如你所见,根据拓扑排序,这两个都是有效的,但只有一个是我想要的。我想不出一种方法可以根据 GTFS 提要提供的数据始终如一地选择正确的序列。

如果我看错了,请告诉我。

【问题讨论】:

  • 请记住,stop_sequence 只能用于对属于同一行程的停靠点进行排序(即 stop_times.txt 中具有相同 trip_id 的行)。正如我在下面提到的,要在不同的行程中创建更一般的停靠顺序(也就是不同的停靠序列),您需要使用我在下面概述的方法。
  • 我添加了另一个更新,说明为什么我无法想象拓扑排序将如何实现我想要的。
  • 也许这张图会有所帮助:docs.google.com/file/d/0B2T8yNIP0VUQeG1fUVY2X25jcGs/edit 我同意乐天广场站是棘手的,关于如何订购它相对于哈珀农场的变化。我在下面更新了我的答案,以描述如何以自然的方式分叉、分支和其他变体。一定要看看 OBA 代码,因为它已经处理了这种情况。
  • 感谢您的所有帮助。我会仔细研究 OBA 代码并尝试自己解决这个问题,然后再打扰您!
  • @btse 废话,美国宇航局!恭喜!无论如何,我最后的手段(以防万一有人读到这个)是列出每条路线的每一次旅行并收集结果。到目前为止,它运行良好,尽管运行 700Mb GTFS 数据库需要几分钟。

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


【解决方案1】:

您可以构建一个有向图 (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) 对两个分支进行相对排序时,首先将分支放在离分支点较近的位置。

【讨论】:

  • 我会试试这个,让你知道它是怎么回事。当创建 GTFS 提要的人可以更智能地使用 stop_sequence 字段时,需要所有这些额外的工作,这真是太痛苦了。
  • 我不确定这是否会奏效,因为只有来自同一行程的从站到站的每次转换都存在数据。因此,我无法在不同行程的停靠点之间正确绘制边缘。将此与我的示例联系起来,我无法确定 Stop C 实际上应该在 Stop E 之前(至少我无法弄清楚)。
  • 为什么停止 C 应该在停止 E 之前(除了英文字母)?也许你的路线最后有一个分支,一半的公共汽车去 C-D,另一半去 E。在这种情况下,真的有“正确”的停靠顺序吗?
  • 哈哈对不起布赖恩!我并不想对我在 Google 群组上的帖子不尊重。我将用另一个示例更新我的原始帖子,因为我无法在此评论中正确回复。
【解决方案2】:

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

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

然后,您可以向不相关的部分添加额外的规则/权重,然后确定哪个部分应该优先于另一个部分。例如ABC --->CDE 或 GHI

https://github.com/mhkey/supersequence

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2021-10-19
    • 1970-01-01
    • 2014-10-05
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多