【NYC OPENDATA】抓取MTA(纽约地铁)实时列车数据

今天偶然看到以前的一个关于大数据的TED演讲[Bilibili][如何找到纽约市最差的停车位——用大数据说话]*,刚好是关于纽约市的。里面提到了2012年纽约市长彭博签署了一个开放数据法案(OpenData Legislation),从此有了NYC OpenData门户网站,并据说开放了近1000个数据库。那个TED演讲是15年2月的了,至今厾4年,有啥变化呢现在。

好奇心驱使下,我来到了NYC OpenData的门户网站,首先搜的就是MTA的数据。为啥呢,因为我们这边有款第三方APP叫transit,能看到纽约地铁和巴士的实时位置,当时一开始用的时候很震惊,就已经隐约觉得MTA应该是提供了一个实时数据的API,但是是私有还是公开就不确定了。

门户网站上查到了多个关于纽约地铁的API,其中MTA Data是MTA的实时数据。

这里点进去是跳转到MTA的官网并要求填写基本信息,实测填写基本信息并验证邮箱后就能获得APIKey

之后就能到达Feed Documention页面,页面上基本可以知道就是MTA的这个实时数据是使用谷歌的GTFS标准,而根据谷歌的文档,GTFS又是基于Protocol Buffers序列化数据结构。

这里我用NodeJS进行数据收集,所以需要用到protobuf.js这个NodeJS的ProtocolBuffers组件对数据进行解码。

Feed API列表

获取到我们的APIKey之后,因为接口返回的是GTFS数据,所以我们无法直接用浏览器去预览。所以就要愉悦地运行我们的 npm init 去新建项目了

数据下载我们直接用request组件即可。

引入protobufjs组件后,直接使用其load方法加载MTA官网上提供的Proto模板[nyct-subway.proto]文件,记得要在谷歌的官方GTFS模板[gtfs-realtime.proto]也下了和nyct-subway.proto放在同一目录下

代码如下

然后使用root的 lookupType方法去创建一个叫FeedMessage的数据类型,这个数据类型是在GTFS的Proto里定义的。

然后就可以使用这个类型的 decode 方法对下载下来的内容进行解码,注意 decode 方法只能接受Buffer类型的数据,所以在request的时候要设定encoding为null,他才会返回一个Buffer类型数据,否则一律返回utf-8编码后的数据。

这样就能获得Object类型的数据了。

(以上数据因数量过多已经删减)

分享到:

4 条评论

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  1. saber

    sakura,樱,背景是工口先生~OωO

    1. Y2Nk4

      OωO GHS?

  2. repostone

    非技术的路过。

    1. Y2Nk4

      OωO