【问题标题】:how do you decode gtfs protobufs in node你如何在节点中解码 gtfs protobufs
【发布时间】:2013-08-30 00:51:17
【问题描述】:

我正在尝试使用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)

感谢

【问题讨论】:

  • 我用的是res.body,因为它是一个缓冲区,传入的body是一个字符串
  • 你发现这个问题了吗?查看 MTA 地铁 gtfs-r 提要时,我遇到了完全相同的问题。
  • 不抱歉,我放弃了,当时我的结论是 js 解析器不符合规范,但也许其中一些已经更新

标签: javascript node.js gtfs protocol-buffers


【解决方案1】:

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

这在很大程度上似乎与读取数据的方式有关。我不是 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);
    }); 
});

【讨论】:

    【解决方案2】:

    来自 Google Developers 页面developers.google.com/transit/gtfs-realtime/examples/nodejs-sample。 Google 现在提供了Node.js npm module,让事情变得非常简单:

    npm install gtfs-realtime-bindings
    

    这是 Google 的代码 sn-p (Apache 2.0 License)

    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);
          }
        });
      }
    });
    

    【讨论】:

    【解决方案3】:

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

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

    然后解析似乎工作正常。

    【讨论】:

      【解决方案4】:

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

      还可以查看node-gtfs 模块。

      【讨论】:

      • 感谢文本链接,我在文档中没有看到。它给了我一些工作,看看输出应该是什么可能会让我更容易调试问题。 node-gtfs 模块非常酷,但我主要是在做这个,因为我想看看 protobufs 如何与 node 一起工作。我并没有真正为任何特定目标而努力,但如果我让事情顺利进行,我可能会围绕 trimet api 编写一个简单的包装器并将其放在 npm 上
      【解决方案5】:

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

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

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

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

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

      【讨论】:

      • 谢谢!这是朝着正确方向迈出的一步。不幸的是,我现在收到一个新错误Error: Data must be corrupt: Buffer overrun 我即将更新问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2010-11-09
      • 2016-03-05
      • 2014-01-05
      相关资源
      最近更新 更多