2017-10-28 47 views
0

我正在消耗幾個不同的GTFS & GTFS-RT訂閱源,即時將這些數據存儲到SQL數據庫。如何使靜態GTFS與GTFS-RT行程更新匹配

我應該如何將靜態GTFS數據與GTFS-RT行程更新進行匹配/鏈接?

我試圖顯示特定stop_id的停止時間。我能夠從靜態GTFS獲得停止時間,但我想用GTFS-RT行程更新停止時間更新「補丁」這些時間。

它看起來像GTFS-RT是非常鬆散的指定,只有幾個領域是強制性的。其中一個即時消費的GTFS-RT訂閱源在trip更新中有trip_id,另一個feed沒有trip_id。

更新2017年4月11日

我設法匹配GTFS-RT更新之行使用下面的查詢靜態GTFS。出於某種原因,無法爲所有行程更新獲取trip_id。也許問題出在數據本身,我的查詢有什麼問題嗎?

const trip = await knex('trips') 
    .select('trips.trip_id') 
    .innerJoin('routes', 'routes.route_id', 'trips.route_id') 
    .innerJoin('stop_times', 'stop_times.trip_id', 'trips.trip_id') 
    .whereIn('trips.service_id', *day active service ids*) 
    .andwhere('routes.route_id', tripUpdate.route_id) 
    .andWhere('stop_times.departure_time', tripUpdate.trip_start_time) 
    .andWhere('trips.direction_id', tripUpdate.direction_id) 
    .orderBy('stop_times.stop_sequence') 
    .first(); 
+0

是的,這是一個鬆散定義的標準。最近的GTFS-rt 2.0 Spec闡明瞭這一點,但這仍然是允許的。爲什麼?有一個用例可以爲短期中斷提供服務信息。這被濫用的一些飼料,使其正常。 您很可能必須編寫一些可以在Feed和GTFS之間進行匹配的邏輯。但很難說如果不知道你在談論什麼飼料,這是否可能。 –

+0

您正在使用哪個[DBMS](https://en.wikipedia.org/wiki/DBMS)產品? Postgres的?甲骨文? 「_SQL_」只是一種查詢語言,而不是特定數據庫產品的名稱。 –

+0

即時通訊使用mariadb。 – devha

回答

0

問題可能是在select語句的

.andWhere('stop_times.departure_time', tripUpdate.trip_start_time) 

條款。

的GTFS規範規定時間必須是HH八位數字:MM:SS格式(H:MM:SS也是可以接受的,如果小時從0開始)如果你的時間表有一個像5點37分00秒的時間並且TripUpdates中的start_time是05:37:00您的聲明將不會返回旅程ID。如果出現這種問題,您需要在將時間從stop_times.txt添加到數據庫時預先設置「0」,或者調整上述子句。

+0

在我的情況下,問題是沒有trip_id,我嘗試將trip-id與GTFS-RT TripUpdate匹配到靜態GTFS。我向第一篇文章添加了查詢,以解釋我如何嘗試進行匹配。 – devha