1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Node.js で osm-pbf-parser を使うときのメモ

Posted at

はじめに

Node.js で OpenStreetMap の PBF をパースするときに osm-pbf-parser を使うことが多いのですが、example の書き方が 2015年当時のものでちょっと扱いに困ることがあるので、2022年ならこう書くかな?というものを記録しておきます。

Before (official example)

var fs = require('fs');
var through = require('through2');
var parseOSM = require('osm-pbf-parser');
 
var osm = parseOSM();
fs.createReadStream(process.argv[2])
    .pipe(osm)
    .pipe(through.obj(function (items, enc, next) {
        items.forEach(function (item) {
            console.log('item=', item);
        });
        next();
    }))
;

After

const fs = require("fs");
const Transform = require("stream").Transform;
const parseOSM = require('osm-pbf-parser');

function parse(input) {
  return input.pipe(parseOSM())
    .pipe(new Transform({
      objectMode: true,
      transform(items, enc, next) {
        for (const item of items)
          this.push(item);
        next();
      }
    }));
}

(async function() {
  for await (const item of parse(fs.createReadStream(process.argv[2]))) {
    console.log(item);
  }
})();

まとめ

たまに思い出したように osm-pbf-parser を使うことがあるのですが、そのたびに through2 依存やめたい、とか、 イベントベースのコード書きたくない、と思いつつ放置していました。

through2 は公式が言うように stream.Transform で代替可能。また、イベントベースのコードも Node.js v10 あたりで導入された、readable の asyncIterator を使うことで for await でさっぱりと書くことができるようになりました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?