gtfs / csa-php
基于CSA和GTFS的简单路由算法
This package is auto-updated.
Last update: 2024-09-09 18:13:16 UTC
README
这是一个简单的库,可以直接根据时间表数据计算公共交通路线。
概述
此库提供了CSA(连接扫描算法)的基本实现,该算法于2013年提出。要使用此算法与公共交通机构的数据进行交互,无需像使用Dijkstra或A*算法那样将它们构建成图。
遗憾的是,目前只有少数几个项目在实际中使用了这个算法。开发这个库的意图不是为了重新发明轮子,而是为了了解使用“真实数据”时的问题以及如何解决这些问题,同时保持一个简单且可扩展的PHP实现,可以在其他项目中使用。
安装
要使用此库,请通过以下命令将其添加到您的composer依赖项中:
composer require gtfs/csa-routing
或者,如果从头开始,只需克隆此存储库并输入以下命令:
composer install
到您的命令行环境。
用法
对于用法,有两个主要的类,分别是Scanner
(用于计算连接)和Journey
(用于反向路由和计算您的路线)。
<?php $connectionsList = []; // read the connections from database or file - must not be empty! try { $scanner = new \CSA\Scanner($connectionsList); $connectionsIndex = $scanner->computeConnections('8000299', '8002549', '06:15:00'); $journey = new \CSA\Journey($connectionsIndex); print_r($journey->computeLegs('8002549')); } catch (\CSA\Exception\RoutingException $e) { print_r($e); }
以下示例计算从Pforzheim Hbf (8000299)
到Hamburg Hbf (8002549)
的路线。输出显示在以下部分。您可以看到有两个部分:第一个部分从Pforzheim Hbf (8000299)
到Karlsruhe Hbf (8000191)
,第二个部分从Karlsruhe Hbf (8000191)
到Hamburg Hbf (8002549)
,开始时间为06:15:00
。
Array
(
[0] => CSA\Data\TimetableLeg Object
(
[tripId:protected] => 7282
[sourceId:protected] => 8000299
[destinationId:protected] => 8000191
[departureTime:protected] => 06:22:00
[arrivalTime:protected] => 06:45:00
)
[1] => CSA\Data\TimetableLeg Object
(
[tripId:protected] => 13778
[sourceId:protected] => 8000191
[destinationId:protected] => 8002549
[departureTime:protected] => 06:51:00
[arrivalTime:protected] => 11:35:00
)
)
输入数据结构
输入连接必须是类型为\CSA\Data\Connection
或其子类的数组。您可以直接从GTFS中的stop_times.txt
文件中获取这些连接。当然,您可以使用任何其他任意的时刻表数据格式。
每个连接都包含一个出发站点ID
和一个匹配的出发时间
,以及一个到达站点ID
和一个匹配的到达时间
。此外,类型为\CSA\Data\TimetableConnection
的连接还包含一个名为tripID
的字段,用于确定是否需要在两个连接之间进行换乘。这对于反向路由来说非常重要,以确保正确返回一致的行程。
重要提示:输入列表中的连接必须按照其到达时间排序,以确保算法正常工作!为了避免与一致行程相关的问题,它们还应按其行程ID进行排序。
性能
众所周知,PHP不是在大数据流和可能长时间运行的算法中谈论性能时的首选。还有一些限制,如内存限制和最大执行时间。
出于实验目的,我们使用了两个不同的数据集,称为数据集A和数据集B。数据集A由德国所有长途火车的一个运营日组成,大约有8,500个连接。数据集B由一个德国地方交通部门的运营日组成,大约有180,000个连接。
内存
由于此库采用面向对象实现,因此它非常节省内存。(参见此gist:https://gist.github.com/nikic/5015323)使用数据集A时,最大内存消耗约为4 MB,使用数据集B时约为55 MB。
运行时间
本实现的实际运行时间低于预期:对于数据集A的平均路线计算在最大值时约为60毫秒,对于数据集B则达到最大200毫秒。与原始论文中提到的运行时间相比,这非常慢,但在Web环境中实际应用仍然足够。
改进与注意事项
有一些可能性可以帮助您略微提高性能。
- 仅处理在您指定日期运行的连接
- 修剪在您开始时间之前的到达连接:这些永远无法到达
贡献
欢迎为本项目做出贡献!请将您的代码格式化为原始作者编写的代码类似,并在文档中记录您所做的工作。这不仅对您自己有益,也对所有其他贡献者都有帮助 :-)
如果您发现了任何问题或想要告知一些改进,请在此存储库中创建一个问题。您还可以在那里找到已知问题和计划扩展。如果您修复了一个错误或创建了一个新功能,请自由创建一个pull request。
许可
本项目采用MIT许可证。有关更多信息,请参阅LICENSE。