我正在使用GTFS数据源开发一个应用程序。我正在尝试列出所选路线的所有站点。目前,我正尝试按照停靠顺序对列表进行排序,但由于某些行程不会经过每个站点,我收到的数据每个行程每个站点递增1,因此这种方法不能很好地工作。这意味着停靠顺序没有考虑到其他可能有更多或更少站点的行程。
现在这里有一些路线的示例旅行:
我的数据在做什么:
对于旅行1:
对于旅行2:
所以,当我尝试对路线的所有潜在停靠点进行排序时,最终得到了这个结果:
"明显是不正确的。有没有人知道其他可能的想法来正确地排序站点,也许使用与GTFS Feed一起提供的其他数据?
更新了一个真实世界的例子:
这是一个数据库查询的示例输出,获取915路线的所有站点。 这是早上的时间表。"
这是链接到许多通勤者目前正在使用的时间表的PDF文件。两个列表第一次不同的地方是在“COLUMBIA MALL&SOUTH RING RD eb”之后。
更新2: 我仍然看不到拓扑排序如何用于获取正确的顺序。是的,它可能给出一个有效的序列,但不能保证是通勤者容易识别的正确序列。让我们再看看我提供的pdf文件中的另一个例子。我们将查看旅程1和5,一直到“哥伦比亚购物中心”站。我会创建以下边缘:
从第五次旅行中创建的边缘。
甚至
如您所见,根据拓扑排序,这两个序列都是有效的,但只有其中一个是我想要的。我无法想到一种方法来根据GTFS数据提供的信息一致地选择正确的序列。
如果我看错了,请告诉我。
以下是一个例子:
这是一条路线的站点顺序(忽略不是每个行程都停靠在每个站点)
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路线的所有站点。 这是早上的时间表。"
+---------+---------+---------------+------------------------------------------------+
| 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,一直到“哥伦比亚购物中心”站。我会创建以下边缘:
Cedar Lane --> Gray Star Way
Gray Star Way --> White Cord Way
...
Harpers Farm Rd --> Columbia Mall
从第五次旅行中创建的边缘。
Lotte Plaza --> Columbia Mall
拓扑排序保证的唯一一件事情是:
对于每一条从顶点 u 指向顶点 v 的有向边 uv,在排序中 u 出现在 v 之前。
这意味着存在多个有效的排序方式,但只有一个是我想要的实际正确的排序方式(至少在我能想到的情况下,没有办法以编程方式选择这个正确的排序方式而不是其他有效的排序方式)。
一个有效的排序方式可能是(这也是正确的排序方式):
Lotte Plaza,
Cedar Lane
Gray Star
...
Columbia Mall
甚至
Cedar Lane
Gray Star
...
Lotte Plaza
Columbia Mall
如您所见,根据拓扑排序,这两个序列都是有效的,但只有其中一个是我想要的。我无法想到一种方法来根据GTFS数据提供的信息一致地选择正确的序列。
如果我看错了,请告诉我。