はじめに
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 でさっぱりと書くことができるようになりました。