Python 从.CSV格式的AVL(GPS)数据创建伪GTFS数据集

Python 从.CSV格式的AVL(GPS)数据创建伪GTFS数据集,python,r,csv,gps,gtfs,Python,R,Csv,Gps,Gtfs,我有一个城市公共交通系统的自动车辆定位(AVL)数据集,格式为.csv。我想使用这个AVL数据集来构建一个用于运行可访问性分析的数据库 我已经看到了如何基于存储在SQL数据库()中的GPS数据创建GTFS数据集的解决方案,但是当GPS数据存储在.csv格式时,我还没有找到解决方案,这里就是这种情况。我很乐意在这方面得到任何帮助,但如果解决方案是R或Python,我会很高兴 我已经有了GTFS的stops.txt文件,但我想我需要创建文件shapes.txt,tips.txt,routes.txt

我有一个城市公共交通系统的自动车辆定位(AVL)数据集,格式为
.csv
。我想使用这个AVL数据集来构建一个用于运行可访问性分析的数据库

我已经看到了如何基于存储在
SQL数据库
()中的GPS数据创建GTFS数据集的解决方案,但是当GPS数据存储在
.csv
格式时,我还没有找到解决方案,这里就是这种情况。我很乐意在这方面得到任何帮助,但如果解决方案是
R
Python
,我会很高兴

我已经有了GTFS的
stops.txt
文件,但我想我需要创建文件
shapes.txt
tips.txt
routes.txt
stop\u times.txt

这就是我的
GPS.csv
数据集的外观:

             timestamp  order  line      lat      long      speed route_name
1: 2016-02-24 00:04:56 B27084   905    -22.9     -43.3      32.00   12860326
2: 2016-02-24 00:05:07 B41878  2302    -22.9     -43.2       0.19   12860386
3: 2016-02-24 00:04:37 B75563   928    -22.9     -43.2       0.00   12867184
4: 2016-02-24 00:05:17 D86084   852    -23.0     -43.6      24.26   12860043
5: 2016-02-24 00:04:58 C41420          -22.9     -43.2       0.00         NA
6: 2016-02-24 00:04:47 C30084          -23.0     -43.3       0.00         NA

有五个必需的文件:
agency.txt
routes.txt
trips.txt
stop\u times.txt
,以及
stops.txt
。对于仅用于计算可访问性的伪GTFS,可以省略所需文件中的许多可选字段以及所有可选文件。然而,你可能想复制真实的或构造它们,因为它们可以用于这个目的(例如人们在选择如何旅行时会考虑票价,所以你可以用<代码>票价。TXT < /代码>)。 仔细阅读这本书

如果可以想象所有路线都由同一机构提供服务,那么您可以简单地:

agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone
XXX,My Awesome Agency,http://example.com,,,
i、 e.您只需要前三个字段

agency.txt
用于:

在此提要中提供数据的一个或多个中转机构

你需要:

  • 路由id
    (主键)
  • route\u short\u name
  • route\u long\u name
  • 路线类型
    (必须在0-7范围内;表示模式)
例如:

route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color
12860326,XXX,12860326,12860326,,3,,
12860386,XXX,12860386,12860386,,3,,
12867184,XXX,12867184,12867184,,3,,
route_id,service_id,trip_id,trip_headsign,direction_id,block_id,shape_id
12860326,1,1,,1,,12860326
12860326,1,2,,1,,12860326
12860386,1,1,,1,,12860386
12860386,1,2,,2,,12860386
trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled
1,00:05:07,00:05:54,22018,1,,1,1,0
1,00:07:16,00:08:01,22557,2,,1,1,39
1,00:10:56,00:10:56,22559,3,,1,1,76
shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
12860386,-22.9,-43.3,1,1
12860386,-22.0,-42.9,2,2
我不知道如何处理示例数据中未指定路线的路线。我也不知道
order
指的是什么。也许,
order
是路线的名称?只要你能想出与“路由”标识符相同的概念,你就可以使用它。作为参考,“路线”定义为:

路线是向乘客显示为单个路线的一组行程 服务

跳闸是在特定时间发生的两次或两次以上停车的序列

你需要:

  • 跳闸id
    (主键)
  • 路由id
    (外键)
  • 服务id
    (外键)
例如:

route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color
12860326,XXX,12860326,12860326,,3,,
12860386,XXX,12860386,12860386,,3,,
12867184,XXX,12867184,12867184,,3,,
route_id,service_id,trip_id,trip_headsign,direction_id,block_id,shape_id
12860326,1,1,,1,,12860326
12860326,1,2,,1,,12860326
12860386,1,1,,1,,12860386
12860386,1,2,,2,,12860386
trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled
1,00:05:07,00:05:54,22018,1,,1,1,0
1,00:07:16,00:08:01,22557,2,,1,1,39
1,00:10:56,00:10:56,22559,3,,1,1,76
shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
12860386,-22.9,-43.3,1,1
12860386,-22.0,-42.9,2,2
direction\u id
,虽然是可选的,但往往非常有用,我有几个应用程序接收GTFS,尽管它处于可选状态,但仍然需要它

service\u id
很棘手,与日历日期配合使用。它允许GTF轻松地表示,例如,“正常”工作日服务,以及假日在工作日时的假日服务。出于您的目的,您可能只需对所有内容使用
1
,但这取决于您的应用程序和收集AVL数据的时间。当我处理一个类似的应用程序时,我在数据库中维护了一个查找表,告诉我某个特定日期是否是公共假日和/或学校假日,和/或是在大学学期期间,因为巴士路线因学生而异

shape\u id
是可选的,但如果您想在地图上绘制路线,或使用类似OpenTripPlanner的工具,则这一点至关重要

每次行程中车辆到达和离开各个站点的时间

您将需要:

  • stop\u id
    (主键)
  • 跳闸id
    (外键)
  • 到达时间
  • 出发时间
  • 停止顺序
编写脚本时,这将需要最多的工作。它将比所有其他文件的总和大几个数量级

stop\u id
trip\u id
与已识别的站点和行程相关。
出发时间
到达时间
将位于AVL数据的两行,在许多情况下,实际识别服务何时到达站点是此任务最困难的方面。访问乘客智能卡数据更容易,当服务实际停止时,您可能会发现AVL记录的空间簇,因为车辆在特定时间段内不会移动。然而,如果一个站点是空的,没有人想下车,就很难确定服务何时真正“到达”该站点——特别是因为如果司机不打算在预定的时间停车(例如,如果他们看到没有人在等待,他们会走得更快或抄近路),他们的行为有时会发生变化。在您的情况下,
速度
值可能会有所帮助,但请注意不要将乘客停靠点与十字路口混淆

stop_sequence
是可选的,但也是应用程序通常希望它存在的另一种情况。无论如何,如果您的脚本无法识别
stop\u sequence
,那么您可能无法正确创建此文件

例如:

route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color
12860326,XXX,12860326,12860326,,3,,
12860386,XXX,12860386,12860386,,3,,
12867184,XXX,12867184,12867184,,3,,
route_id,service_id,trip_id,trip_headsign,direction_id,block_id,shape_id
12860326,1,1,,1,,12860326
12860326,1,2,,1,,12860326
12860386,1,1,,1,,12860386
12860386,1,2,,2,,12860386
trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_type,shape_dist_traveled
1,00:05:07,00:05:54,22018,1,,1,1,0
1,00:07:16,00:08:01,22557,2,,1,1,39
1,00:10:56,00:10:56,22559,3,,1,1,76
shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
12860386,-22.9,-43.3,1,1
12860386,-22.0,-42.9,2,2
指示停留时间是可选的,因此如果这太难计算,
到达时间
离开时间
可以有效地在同一时刻

实际上,
拾取类型
丢弃类型
非常有影响力,但通常无法仅从AVL数据确定,除非您的AVL收集器确实考虑过在其存档中支持GTF。。。不幸的是,这不太可能。除非您有其他信息,否则您可能必须始终允许这两种情况