事の経緯
農地ナビからせっせと落としてきたGeoJSON(140ファイル以上)をちまちまArcGISに入れるのはしんどいということでマージしたくなった. 調べてみるとこんなのがあるらしい.
早速入れてみたものの, こんな感じに怒られてマージ出来ない.
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
だった.
./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 消し方
とかでググるといい感じのやり方が出てくると思う, 知らんけど