GTFS数据库 - “收入里程”和“收入小时”

时间:2015-06-28 22:45:28

标签: sql database gtfs transit revenue

我试图通过以下方式找到“路线”的收入里程/公里数:日,月和年;通过查询具有此处描述结构的GTFS数据库:

https://developers.google.com/transit/gtfs/reference

在这里看到一个非常清晰的结构草图:

http://blog.openplans.org/2012/08/the-openplans-guide-to-gtfs-data/

  

“行程的收入距离”定义:

     

(“可供乘客使用”距离)

     

从第一个实际巴士站开出的里程/公里数   乘客可以登机,到最后一班车的最后一次下车   停止,为特定的路线和公共汽车运行。 (然后汇总在一起   对于特定路线的所有公共汽车的所有服务运行)

-

  

“收入时间”定义:

     

(“可供乘客使用”时间跨度)

     

从车辆到达第一辆车的那一刻起的小时数   巴士站,直到最后一班乘客下车   巴士车站。 (然后将所有服务运行的所有服务运行汇总在一起   该特定路线的公共汽车)

我正在使用SQL Server / MSSQL。虽然SQL Lite,MySQL或任何SQL示例都可以完美无缺。

基本上,我需要能够选择路线,然后关联routescalendar_datescalendarstop-times,{{1}中的数据}和stops表,用于查找从第一站(tripsstop_times表)到最后一站(已经过了多少小时)覆盖了多少里程/公里,并找到了特别是stops(在service_idtrips表中),然后是特定路线的所有calendar,并且能够为特定的{{service_id获得所有这些1}}(在date表中),或日期跨度(日,月,3个月,年等)。

如果需要一些不同的查询,那很好。每条路线的收入距离以及每条路线的收入时数可以是单独的查询。

之前是否有人愿意为此分享他们的查询结构或是否有人想出这个?有没有关于如何编写此查询的示例?我已经在网上找了好几个星期。

这是我创建的数据库的图表图像,其中显示了所有关系:

GTFS Database Diagram

2 个答案:

答案 0 :(得分:1)

我通过以下方式为预定的公里做了这个:

  1. 通过GTFS SQL importerPostGIS
  2. 将GTFS加载到数据库中
  3. 使形状表空间化
  4. Calculate distance for each shape
  5. 汇总如下(请参阅服务ID说明)。
  6. select t.route_id as id, r.route_short_name as route, sum(l.shape_dist/1000) as sched_kms 
    from gtfs_shape_lengths l
    
    inner join gtfs_trips t on t.shape_id = l.shape_id
    inner join gtfs_routes r on r.route_id = t.route_id
    inner join gtfs_calendar c on t.service_id = c.service_id
    
    where c.service_id ilike '%sat%'
    
    group by t.route_id, r.route_short_name
    
    union all
    
    select 'total' as id, 'total_' as name,
    sum(l.shape_dist/1000) as sched_kms
    
    from gtfs_shape_lengths l
    
    inner join gtfs_trips t on t.shape_id = l.shape_id
    inner join gtfs_calendar c on t.service_id = c.service_id
    
    where c.service_id ilike '%sat%'
    
    order by sched_kms desc
    

    原文如下: http://transitdata.net/using-gtfs-and-postgis-to-calculate-levels-of-scheduled-service/

答案 1 :(得分:0)

好的,我已经拿出以下内容来获得服务时间。在我的示例中,arrival_time表中的departure_timestop_times列是整数数据类型,其中存储的数字数据表示自午夜以来的"分钟" (例如"自午夜起29小时45分钟"将是" 1785分钟" ...午夜在服务日中午测量,减去12小时 - 根据规范要求。也是最好的方法)。另请注意:我已将trip_date列添加到trips表中,因为我使用此GTFS数据库进行操作/内部联邦报告使用,而不仅仅是向公众提供服务;所以有必要知道个人的旅行日期(并且我不想为calendar_dates为此目的每天进行一次参赛,正如一些代理商所做的那样)。此示例适用于MSSQL / SQL Server:

-- FIRST/LAST TRIPS OF THE DAY AND SPAN OF SERVICE

SELECT

    joinedTables.service_id                  AS 'Service Number',
    joinedTables.trip_date                   AS 'Date',
    joinedTables.route_id                    AS 'Route',

    MIN ( joinedTables.starting_departure )  AS 'First Departure in Minutes',
    MAX ( joinedTables.ending_arrival )      AS 'Last Departure in Minutes',

    -- Decimal hours of minutes integers.
    CAST (
                 (
                       (
                             MAX (ending_arrival) - MIN (starting_departure)
                       ) / 60.00
                 ) AS DECIMAL (9, 2)
         )                                 AS 'Service Hours'


FROM
    (
        SELECT
            SelectedTripsColumns.service_id,
            SelectedTripsColumns.trip_id,
            SelectedTripsColumns.route_id,
            SelectedTripsColumns.trip_date,
            MIN (departure_time) AS starting_departure,
            MAX (arrival_time) AS ending_arrival

        FROM
            stop_times AS stopTimesTable

        JOIN (
                 SELECT
                     service_id,
                     trip_id,
                     route_id,
                     trip_date
                 FROM
                     trips
             ) AS SelectedTripsColumns

        ON stopTimesTable.trip_id = SelectedTripsColumns.trip_id


        JOIN routes

        ON SelectedTripsColumns.route_id = routes.route_id


        GROUP BY
            SelectedTripsColumns.service_id,
            SelectedTripsColumns.trip_id,
            SelectedTripsColumns.route_id,
            SelectedTripsColumns.trip_date

    ) AS joinedTables

-- WHERE trip_date = '2015-07-27'

GROUP BY
    service_id,
    route_id,
    trip_date

ORDER BY
    service_id,
    route_id,
    trip_date;