Не удалось проанализировать ввод команды protoc буферов протокола Google для ``--decode_raw``

У меня есть файл Google protobuf из OpenStreetMap, в частности, у меня есть 1,4 МБ выписка из страны Лихтенштейн. от Геофабрик. Команда protoc говорит, что она «записывает необработанный тег/значения в стандартный вывод» с опцией --decode_raw. Однако я продолжаю получать эту ошибку:

$ cat liechtenstein-latest.osm.pbf | protoc --decode_raw
Failed to parse input.

Я скомпилировал и установил библиотеку protobuf прямо из Google, версия 2.6.1, которая является текущей.

Этот файл действителен, различные инструменты OpenStreetMap, которые читают файлы pbf (osm2pgsql, osmosis) может прочитать его нормально.

Что может быть не так? Как я могу заставить --decode_raw работать? Я делаю что-то неправильно?


person Rory    schedule 12.02.2016    source источник


Ответы (1)


Формат OpenStreetMap .osm.pbf не является необработанным буфером протокола. Формат описан здесь:

http://wiki.openstreetmap.org/wiki/PBF_Format

Ключевая цитата:

Формат представляет собой повторяющуюся последовательность:

  • int4: длина сообщения BlobHeader в сетевом порядке байтов.
  • сериализованное сообщение BlobHeader
  • сериализованное сообщение Blob (размер указан в заголовке)

Таким образом, вам нужно сначала прочитать четыре байта, интерпретировать их как целое число (с обратным порядком байтов), затем прочитать это количество байтов и проанализировать как BlobHeader, и это, в свою очередь, скажет вам, сколько байтов нужно прочитать и проанализировать как Blob.

Инструмент protoc не сделает этого автоматически, так как не знает этого формата. Вероятно, есть специальный инструмент OSM, который вы можете использовать.

person Kenton Varda    schedule 13.02.2016