gtfs/csa-php

基于CSA和GTFS的简单路由算法

1.0.0 2020-02-09 07:35 UTC

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