2013-07-05 27 views
2

我使用一個應用程序,我的工作就一個GTFS飼料。我試圖列出所選路線的所有停靠點。目前,我試圖命令由stop_sequence名單,但這不能正常工作,因爲有些車次不要去每到一站和數據我已經每行程收到增量stop_sequence由1元止損。這樣做的意義在於,stop_sequence不考慮可能有更多或更少的站其他車次。確定不使用stop_sequence正確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訂閱其他數據的任何其他潛在的想法?

與現實世界的例子

這裏已更新爲一個數據庫查詢獲取所有站的路線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文件。的兩個列表不同,其中第一個實例是經過「哥倫比亞購物中心&南二環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 

從旅行產生的邊5

Lotte Plaza --> Columbia Mall 

一個拓撲排序,可確保的唯一事情是

爲從頂點u到頂點v每向邊紫外線,U自帶v在在訂貨

這意味着,有多個有效排序,但只有一個是實際正確一個我想要的(但我無法通過其他有效的順序來選擇這個順序,至少不是我能想到的)。

一個有效的排序可能是(這也是正確的):

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

甚至

Cedar Lane 
Gray Star 
... 
Lotte Plaza 
Columbia Mall 

正如你所看到的,根據拓撲排序,這兩個都是有效的,但其中只有一個是我想要的。我想不出一種基於GTFS提供的數據一致地選擇正確序列的方法。

請讓我知道如果我在看這個錯誤的方式。

+0

記住stop_sequence只能用於排序屬於同一行程(又名與stop_times.txt相同trip_id行)停止。正如我在下面提到的,爲了在不同的旅程中創建一個更一般的站點順序(又稱不同的站點順序),您需要使用下面概述的方法。 –

+0

我添加了另一個更新,爲什麼我無法想象拓撲排序如何實現我想要的。 – btse

+0

也許這個圖表將有助於:https://docs.google。com/file/d/0B2T8yNIP0VUQeG1fUVY2X25jcGs /編輯 我同意樂天廣場停下來是棘手的,關於如何訂購它相對於哈珀的農場變化。我在下面更新了我的答案,以自然的方式描述如何分叉,分支和其他變體。肯定會看看OBA代碼,因爲它已經處理了這種情況。 –

回答

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)當訂購兩個分支相對於彼此,先將分支更接近於在距離分支點。

+0

我會試試這個,讓你知道它是怎麼回事。當創建GTFS feed的人可以更加智能地使用stop_sequence字段時,所有這些額外的工作都是必需的,這是一件非常痛苦的事情。 – btse

+0

我不確定這是否會起作用,因爲如果從同一次旅程出發,每次從停止到停止的過渡只存在數據。因此,我不可能在不同的行程之間的停靠點之間正確繪製邊緣。爲了將這一點與我的例子聯繫起來,我沒有辦法確定'Stop C'應該在'Stop E'之前實際發生(至少我不能弄明白)。 – btse

+0

爲什麼要在停止E之前停止C(英文字母旁)?也許你的路線最後有一個分支,一半的公共汽車轉到C-D,另一半轉到E.在這種情況下,真的有一個「適當」的停車點排序? –