雑な備忘録が多いブログ

ももクロとエビ中を推している弱いパソコンオタクです

GeoJSONをマージしたくてgeojson-mergeを使ったらBOMでハマった

事の経緯

農地ナビからせっせと落としてきたGeoJSON(140ファイル以上)をちまちまArcGISに入れるのはしんどいということでマージしたくなった. 調べてみるとこんなのがあるらしい.

qiita.com

github.com

早速入れてみたものの, こんな感じに怒られてマージ出来ない.

SyntaxError: Unexpected token  in JSON at position 0
    at JSON.parse (<anonymous>)
    at /mnt/c/Users/sioremon/Documents/UTM/project/nouchi_pin/merge/node_modules/@mapbox/geojson-merge/geojson-merge:19:19
    at Array.map (<anonymous>)
    at Object.<anonymous> (/mnt/c/Users/sioremon/Documents/UTM/project/nouchi_pin/merge/node_modules/@mapbox/geojson-merge/geojson-merge:18:52)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47

原因

農地ナビから取得したGeoJSONはUTF-8 with BOMだった.

note.com

./node_modules/.bin/geojson-mergeの中身はこうなっている.

#!/usr/bin/env node
var geojsonMerge = require('./'),
    stream = geojsonMerge.mergeFeatureCollectionStream,
    merge = geojsonMerge.merge,
    fs = require('fs'),
    argv = require('minimist')(process.argv.slice(2));

if (!argv._.length || argv.help) {
  console.log('usage: geojson-merge [-s] FILE FILE2 FILE3');
  console.log('\n  --stream (or -s): use streaming mode for large files');
  return;
}

if (argv.s || argv.stream) {
  stream(argv._).pipe(process.stdout)
} else {
  process.stdout.write(JSON.stringify(merge(argv._.map(function(n) {
      return JSON.parse(fs.readFileSync(n));
  })), null, 2));
}

18行目でJSON.parseしているが, ただ読んでいるだけなのでBOM付きだと読めなかったという話.

解決策

自分はWSLでnodeを動かしていたのでnkfでBOMをまとめて消した

nkf --overwrite --oc=UTF-8 dir/*.geojson

WSLじゃなくてもBOM 消し方とかでググるといい感じのやり方が出てくると思う, 知らんけど