0

我正在尝试按日、月和年查找“路线”的收入英里/公里数;通过查询具有此处描述的结构的 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-timesstops和表格中的数据关联起来,以找出从第一站(和表格)到最后trips一站的里程/公里数,多少小时经过,并为特定的(in和表)找到它,然后也为特定路线的所有 s 找到它,并且能够为特定的(在表中)或日期范围(日、月、3 - 月份、年份等)。stop_timesstopsservice_idtripscalendarservice_iddatecalendar_dates

如果需要几个不同的查询,那很好。每条路线行驶的收入距离和每条路线的收入小时数可以是单独的查询。

有没有人愿意为此分享他们的查询结构,或者有没有人知道这一点?有没有关于如何编写此查询的示例?几个星期以来,我一直在网上到处寻找。

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

GTFS 数据库图

4

2 回答 2

1

我已经通过以下方式为预定的公里数做到了这一点:

  1. 通过GTFS SQL 导入器PostGIS将 GTFS加载到数据库中
  2. 使形状表空间化
  3. 计算每个形状的距离
  4. 聚合如下(请参阅服务 ID 的注释)。

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/

于 2015-06-29T14:16:39.020 回答
1

好的,我想出了以下获取服务时间的方法。在我的示例中,表中的arrival_timedeparture_timestop_times是整数数据类型,其中存储的数字数据表示“自午夜以来的分钟数”(例如,“自午夜以来的 29 小时 45 分钟”将是“1785 分钟”......从中午开始测量午夜在服务日,减去 12 小时——根据规范的要求。这也是最好的方法)。另请注意:我将此列添加trip_datetrips表中是因为我将此 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;
于 2015-07-29T18:32:00.977 回答