【问题标题】:GTFS Database - SQL Queries for "Revenue Mileage" and "Revenue Hours"GTFS 数据库 - “Revenue Mileage”和“Revenue Hours”的 SQL 查询
【发布时间】:2015-09-15 07:37:32
【问题描述】:

我正在尝试按日、月和年查找“路线”的收入英里/公里数;通过查询具有此处描述的结构的 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-timesstopstrips 表中的数据以查找如何从第一站(stop_timesstops 表)到最后一站,经过了多少英里/公里,并为特定的 service_id 找到这个(在 tripscalendar 表中),然后还针对特定路线的所有service_ids,并且能够针对特定date(在calendar_dates 表中)或日期范围(日、月、3 个月期间、年)获得所有这些等)。

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

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

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

【问题讨论】:

  • 您自己尝试过任何查询吗?加入路线、行程、站点和日历信息的查询并不复杂。这应该会给你一个很好的起点。
  • Something like this 让您开始?
  • 我一直在尝试,但我对此很陌生。所以我还没有任何有用的东西。我可以加入表格,但是查找并汇总从第一个服务站到特定路线的最后一个服务站的英里数,然后在特定时间跨度内组合该路线上的所有运行,有点超越我。即使是部分示例也将不胜感激。
  • 我已经看了几天你链接到的那个帖子(以及所有其他关于 SO),但还不能适应我的需要......
  • @jpw stop_times 表有一个 shape_dist_traveled 字段,用于给出停靠点之间的距离

标签: sql database gtfs transit revenue


【解决方案1】:

我已经为预定的公里数做到了这一点,作者:

  1. 通过GTFS SQL importerPostGIS 将GTFS 加载到数据库中
  2. 使形状表具有空间感
  3. Calculate distance for each shape
  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/

【讨论】:

  • 谢谢!我正在尝试使其适应我必须使用的 Microsoft SQL Server 实现。如果我能让它工作,我会标记为答案。因为我正在使用的客户尚未以 GPS 数据记录格式收集所有数据来创建路径。在短期内,我可能需要以更简单的方式进行此查询,让他们只需将每条路线的距离输入为纯整数,然后再进行空间路径距离输入和计算。 SQL Server 2014(我正在使用)确实有地理数据类型,但我对此很陌生,任何更多的指针都会有所帮助。
  • 如果特定行程不遵循整个相应的形状,这将不起作用。这在较大的机构中较为常见(例如短途旅行或其他不规则的停车模式)。我不确定这种用法是否与 GTFS 规范一致,但我已经在几个地方看到过。
  • 问题:这可以从stop_times 中的shape_dist_traveled 列计算出来,还是因为某些原因它必须是shapes
  • 另外:使数据空间化的主要原因是因为地球的曲率(这会拉长路径并给出不同/更长的距离结果),还是还有其他原因?例如。 能否通过“简单地”将stop_times->shape_dist_traveled 中停靠点之间的距离相加来完成查询? (唯一的缺点是距离缩短有点不准确?)
  • 这取决于与旅行模式相匹配的形状。从我自己(许多美国大型机构)的经验来看,大型调度包(HASTUS、Trapeze 等)非常擅长制作符合他们对旅行模式理解的形状,有时会生成太多不相关的形状,有时错误地由于拓扑错误。如果您正在使用手动生成的不带形状的 GTFS,这不是您的直接解决方案。您可以天真地使用停靠点、路由引擎(例如 PgRouting)和街道数据集构建形状,但我从未为 GTFS 这样做过。
【解决方案2】:

好的,我想出了以下方法来获取服务时间。在我的示例中,stop_times 表中的arrival_timedeparture_time 列是整数数据类型,其中存储的数字数据表示“自午夜以来的分钟数”(例如,“自午夜以来的 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-15
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多