2

我正在尝试使用https://github.com/dcodeIO/ProtoBuf.js来解析 triments gtfs 数据。

这是我到目前为止的代码,它正确解析 .proto 文件并创建构建器并具有所有预期的属性和方法,当我尝试使用它解码任何数据时会引发错误。

Error: Data must be corrupt: Buffer overrun

原型文件来自https://developers.google.com/transit/gtfs-realtime/gtfs-realtime-proto

var ProtoBuf = require('protobufjs')
  , request = require('request')

var transit = ProtoBuf.protoFromFile('gtfs-realtime.proto').build('transit_realtime')

request('http://developer.trimet.org/ws/V1/FeedSpecAlerts/?appID=618F30BB3062F39AF24AED9EC', parse)

function parse(err, res, body) {
  try {
    console.log(transit.FeedMessage.decode(res.body))
  } catch(e) {
    console.log(e)
  }
}

感谢 Brian Ferris,我能够解析标题的第一部分,gtfs_realtime_version: "1"但解析器在下一个组件上失败(时间戳 uint64)

谢谢

4

5 回答 5

3

在搜索您遇到的相同问题时,我一直在寻找您的问题,希望我可以帮助其他人。在互联网上搜索了比我应该拥有的时间更长的时间之后,我想出了一些可行的方法。在我对工作提要进行解码之前,我不太了解这些数据。

这在很大程度上似乎与读取数据的方式有关。我不是 NodeJS 的人,所以我不知道为什么,但这取决于如何读取数据http而不是request解码。我无法使用相同的方法来处理request数据。

我从https://github.com/dcodeIO/ProtoBuf.js/wiki/How-to-read-binary-data-in-the-browser-or-under-node.js%3F找到了其中的一部分,但我没有还不太了解如何使用protobufjs,所以我在这里为其他人提供了一个工作示例。希望能帮助到你。

var ProtoBuf = require('protobufjs');
var http = require("http");

// create a protobuf decoder
var transit = ProtoBuf.protoFromFile('gtfs-realtime.proto').build('transit_realtime');
// your protobuf binary feed URL
var feedUrl = "...";    

// HTTP GET the binary feed
http.get(feedUrl, parse);

// process the feed
function parse(res) {
    // gather the data chunks into a list
    var data = [];
    res.on("data", function(chunk) {
        data.push(chunk);
    });
    res.on("end", function() {
        // merge the data to one buffer, since it's in a list
        data = Buffer.concat(data);
        // create a FeedMessage object by decooding the data with the protobuf object
        var msg = transit.FeedMessage.decode(data);
        // do whatever with the object
        console.log(msg);
    }); 
});
于 2014-09-08T22:15:12.077 回答
2

从位于developers.google.com/transit/gtfs-realtime/examples/nodejs-sample的 Google Developers 页面。Google 现在提供了一个Node.js npm 模块,让事情变得非常简单:

npm install gtfs-realtime-bindings

这是 Google 的代码片段(Apache 2.0 许可证

var GtfsRealtimeBindings = require('gtfs-realtime-bindings');
var request = require('request');

var requestSettings = {
  method: 'GET',
  url: 'URL OF YOUR GTFS-REALTIME SOURCE GOES HERE',
  encoding: null
};
request(requestSettings, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var feed = GtfsRealtimeBindings.transit_realtime.FeedMessage.decode(body);
    feed.entity.forEach(function(entity) {
      if (entity.trip_update) {
        console.log(entity.trip_update);
      }
    });
  }
});
于 2015-09-13T09:28:27.063 回答
1

request通过强制模块具有空编码,我能够使其工作(无论如何,与纽约 MTA 提要) ,从而确保它返回缓冲区而不是字符串。像这样:

request({
    url: 'http://developer.trimet.org/ws/V1/FeedSpecAlerts/?appID=618F30BB3062F39AF24AED9EC'
    encoding: null
}, parse)

然后解析似乎工作正常。

于 2014-07-03T14:30:53.047 回答
0

我不是节点专家,但 GTFS 实时提要的根消息类型是“FeedMessage”:

https://developers.google.com/transit/gtfs-realtime/reference

您似乎正在尝试将提要解析为“警报”消息:

console.log(transit.Alert.decode(res.body))

也许尝试将 Alert 更改为 FeedMessage 看看会发生什么?

于 2013-08-30T05:43:21.007 回答
0

这不能回答您的问题,但您可以使用http://developer.trimet.org/ws/V1/FeedSpecAlerts/appid/618F30BB3062F39AF24AED9EC/text/true之类的 url 获取文本中的 RT 提要

还可以查看node-gtfs模块。

于 2013-08-30T03:09:49.770 回答