Javascript 如何解码节点中的gtfs协议
我正在尝试使用解析triments gtfs数据 这是我到目前为止的代码,它正确地解析了.proto文件并创建了构建器,并且具有所有预期的属性和方法,当我试图用它解码任何数据时,它会抛出一个错误Javascript 如何解码节点中的gtfs协议,javascript,node.js,gtfs,protocol-buffers,Javascript,Node.js,Gtfs,Protocol Buffers,我正在尝试使用解析triments gtfs数据 这是我到目前为止的代码,它正确地解析了.proto文件并创建了构建器,并且具有所有预期的属性和方法,当我试图用它解码任何数据时,它会抛出一个错误 Error: Data must be corrupt: Buffer overrun 原始文件来自 感谢Brian Ferris,我能够解析标题的第一部分gtfs\u realtime\u version:“1”,但解析器无法解析下一个组件(时间戳uint64) 多亏了这并没有回答您的问题,但您可以
Error: Data must be corrupt: Buffer overrun
原始文件来自
感谢Brian Ferris,我能够解析标题的第一部分gtfs\u realtime\u version:“1”
,但解析器无法解析下一个组件(时间戳uint64)
多亏了这并没有回答您的问题,但您可以使用类似url的url在文本中获取RT提要
还可以看看模块。我不是节点专家,但GTFS实时提要的根消息类型是“FeedMessage”: 您似乎试图将提要解析为“警报”消息:
console.log(transit.Alert.decode(res.body))
也许可以尝试将警报更改为FeedMessage,看看会发生什么?我可以通过强制
请求
模块使用空编码,从而确保它返回缓冲区而不是字符串来实现这一点(无论如何,对于纽约MTA源)。像这样:
request({
url: 'http://developer.trimet.org/ws/V1/FeedSpecAlerts/?appID=618F30BB3062F39AF24AED9EC'
encoding: null
}, parse)
然后,解析似乎工作正常。在搜索您遇到的同一问题时,我一直在查找您的问题,希望我能帮助其他人。在互联网上搜索了很长时间之后,我想出了一些有效的方法。直到有一个工作提要被解码,我才完全理解数据 这在很大程度上似乎与数据的读取方式有关。我不是NodeJS人,所以我不知道为什么,但这取决于如何使用
http
读取数据,而不是request
进行解码。我无法使用相同的方法来处理数据的request
其中一部分是我从中发现的,但我还不太了解如何使用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);
});
});
从谷歌开发者页面。 Google现在提供了Node.js npm模块,使事情变得非常简单:
npm install gtfs-realtime-bindings
下面是谷歌的代码片段()
我之所以使用res.body,是因为它是一个缓冲区,而传入的body是一个字符串。您解决了这个问题了吗?我在查看MTA subway gtfs-r提要时遇到了完全相同的问题。不,对不起,我放弃了,当时我的结论是js解析器不符合规范,但可能其中一些已经更新了,因为我没有在文档中看到文本链接。它给了我一些工作的依据,看看输出应该是什么可能会让我更容易调试这个问题。node gtfs模块非常酷,但我主要是在做这个,因为我想看看protobufs如何与node一起工作。我并没有真正朝着任何特定的目标努力,但如果我能让事情顺利进行,我可能会围绕trimet api编写一个简单的包装器,并将其放到npmThank上!这是朝着正确方向迈出的一步。不幸的是,我现在得到了一个新的错误:数据必须被破坏:缓冲区溢出。我将更新这个问题:我如何在我的angularjs项目中获得同样的好处?
npm install gtfs-realtime-bindings
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.FeedMessage.decode(body);
feed.entity.forEach(function(entity) {
if (entity.trip_update) {
console.log(entity.trip_update);
}
});
}
});