我试图通过以下方式找到“路线”的收入里程/公里数:日,月和年;通过查询具有此处描述结构的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示例都可以完美无缺。
基本上,我需要能够选择路线,然后关联routes
,calendar_dates
,calendar
,stop-times
,{{1}中的数据}和stops
表,用于查找从第一站(trips
和stop_times
表)到最后一站(已经过了多少小时)覆盖了多少里程/公里,并找到了特别是stops
(在service_id
和trips
表中),然后是特定路线的所有calendar
,并且能够为特定的{{service_id
获得所有这些1}}(在date
表中),或日期跨度(日,月,3个月,年等)。
如果需要一些不同的查询,那很好。每条路线的收入距离以及每条路线的收入时数可以是单独的查询。
之前是否有人愿意为此分享他们的查询结构或是否有人想出这个?有没有关于如何编写此查询的示例?我已经在网上找了好几个星期。
这是我创建的数据库的图表图像,其中显示了所有关系:
答案 0 :(得分:1)
我通过以下方式为预定的公里做了这个:
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_time
和stop_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;