我如何通过时间表和公交车来进行Yandex.Transport的运输



由DataArt .NET开发人员Mikhail Aksenov发布


一切如何开始


2014年秋天,好消息是Yandex.Transport在沃罗涅日(Voronezh)推出,显示了公共汽车和无轨电车的动向。 在公共汽车站很酷的地方,打开了时间表,然后发现您的巴士将在5分钟内开通。

但是几个月后,一切都在完全可预测的情况下进行了。 由于沃罗涅日从手推车到小巴的所有运输都是现金操作,因此每个驾驶员都希望尽可能多地运送乘客。 结果,他们之间安排了比赛。

驾驶员使用这项新服务在地图上互相跟踪,从而超越并吸引了竞争对手。 一些人开始损失收入,他们开始向路线所有者投诉,然后去找人出售带有GLONASS和GPS的设备,并将有关汽车行驶的数据发送给Yandex。 应车队所有者的要求,他们停止发送信息,公共汽车立即开始从地图上消失。 现在,它们的数量更多了,但这仍然比实际要少得多。



对于那些懒得进一步阅读的人,我提出了有关此主题的视频报告:

其余的-我将以文本形式描述该项目。

从哪里获取数据?


同时,在沃罗涅日有一个收集所有数据的地方- 道路交通组织中心 (DPC)。 他们的网站上有一个庞大而沉重的Web应用程序,其中包含不可持续的JavaScript和其他工件,而其中的所有内容都带有POST请求,并且不会缓存任何内容。 使用此站点本身,您可以轻松地放置一项收集公共汽车运行数据的服务。

有一个选项可以让您在地图上戳一下,找出巴士何时到达以及它将是什么。 只要您大约停下来(±50米)。 在菜单中,您可以打开路线列表,并确切地看到公交车的去向,但是有一个问题-他们开的很奇怪。 例如,沿着Koltsovskaya街(您无法特别提速的中心街道),公交车以大约200 km / h的速度前后移动。


为什么是Python?


我选择Python是因为它很酷,捆绑了电池,依此类推;还有3.6是因为存在字符串文字的格式化,输入等等。 让我们看一下我基本使用的内容:

  • 许多人抱怨说,使用各种标点符号来驾驶停车站的确切名称非常困难。 然后,我意识到了模糊搜索的可能性,并为此创建了第一个单元测试。
  • 整个系统托管在Heroku上。 它是免费的,因为我没有数据库-我希望可以使用数据中心数据库。 当我意识到通过Web界面收集的数据还不够时,我就同意中心使用它。
  • 实际上,托管是通过Tornado Web服务器进行的。 我认为对于使用Python遇到Web请求的任何人都是熟悉的。
  • 我需要Pytz软件包,因为Heroku服务器位于不同的时区,并且数据在没有指定时区的情况下传给我。 因此,我本人负责本地化。
  • 为了创建机器人,我使用了推荐的Python-telegram-bot库。 这里的文档非常充足,并且总体而言,该库满足了最低可行产品要求。 最初,整个项目是一个Telegram机器人,该机器人响应发送您的位置信息后发送了公交车时间表。
  • Firebird,以前是Interbase,是一个开源数据库,我认为你们中的许多人都在使用它。 当然,它不像同一个PostgreSQL那样酷,但是对于大量查询而言,这就足够了。 在我们的情况下,不需要更多。
  • Cachetools是一个非常简单的模块,允许您缓存计算。 当然,这与网页的Memecached或缓存无关,而与需要长查询记忆的情况有关。 只需接受它,添加适当的装饰器即可,一切正常。 缓存具有不同的选项,我使用的是TTL版本,该版本将数据保存指定的时间,因为我知道数据的更新频率不会超过特定间隔(在我的情况下为30秒)。


机器人功能


  • / nextbus站点名称-预计到达时间;
  • /最后的路线编号,以空格分隔-最后一站;
  • 位置发送-未来三站的预计到达时间;
  • 免费入场-路线号和到公共汽车的距离(发送位置时)。


我试图充分描述这些命令,以使人们不会问如何使用它们。 基本上有两个基本命令:nextbus,当您编写停靠站的名称时,以及发送位置。

网站功能


我使网站尽可能简约。 在第三方库中,我仅使用两个库来支持获取和承诺,因为电话中预装的浏览器的旧版本离不开它们。 如果您不支持这些方法,您将为请求本身获得非常沉重的回调面。 通过获取,一切看起来都更加优雅。



实际上,这里的功能包括4点:

  1. 到货 您可以观看停靠站。 通过单击按钮(顺便说一句,值得做更多的事情-我会考虑的!),发送您的位置,系统搜索距离您最近的三个停靠站并在其上显示信息。 您可以输入停靠站的名称并获取有关的信息。 由于几乎不需要所有20-30辆可以到达公交车站的公交车,因此可以按路线过滤它们。
  2. 巴士 第二页包含有关公共汽车的信息。 这是由于另一个故事将我推向了这个项目。 有一天,我忘记了公共汽车上的帽子,叫做控制室,解释了发生的地方。 调度员建议我在中心接我的公共汽车,他将回去,在终点站转身。 我记得我有来自交通管理中心系统的登录名和密码,但事实证明,我仍然无法通过Web界面跟踪所需汽车的位置。 我把帽子还给我,但困难很大。
    我以为找公车会容易得多。 我写下了路线编号,系统会向您显示线路上的汽车,它们的当前位置以及通过的时间。 即使您知道路线号,但您知道公交车号(这种情况也会发生),您仍然可以找到它。
  3. 地图。 无需动画即可在网站上映射。 在这里,您可以从列表中选择总线,也可以手动输入数字,然后进行过滤。 地图上最多可以显示600辆公交车,尽管20辆以后很难在中心找到东西,仅是因为路线都集中在这里。 因此,最好将搜索限制为更严格的参数。
  4. 关于项目。 现在该项目有一个网站,还有一个Telegram机器人,社交网络中的群组。


***
幸运的是,Python是一门开箱即用的语言。 对于简单的事情,您甚至不需要下载任何内容,只需仔细阅读文档即可。

当然,这些服务可以在其他已经使用的城市中完成。 在很大程度上取决于本地数据中心,例如在某些地方,在圣彼得堡甚至为开发人员提供了API。 但是,最重要的是想要改变城市的城镇居民。

Source: https://habr.com/ru/post/zh-CN411249/


All Articles