[Turf.js]node.jsとturfで重い統計処理をバックエンドで行う。
フロントエンドで行うには重い統計処理をバックエンドで行い、出力された統計処理済データをフロントエンドで表示するってのをやってみました。
インストール
「turf」とコマンドラインでの引数の処理を行うライブラリ「argv」をインストールします。
1 2 |
> npm install turf > npm install argv |
今回は「環境GIS」からダウンロードした2013年度の「全国の自動車交通騒音の測定結果」をポイントデータに変換しヘックスグリッドを敷き詰めて各セルに含まれるポイントの「Leq昼間(dB)」の値から中央値を算出します。
対象とするポイントデータは3531個所、ヘックスを敷き詰める範囲は本州および北海度が含まれる範囲です。
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
var argv = require('argv'); var turf = require('turf'); var fs = require('fs'); // -i 読み込むポイントデータを指定 argv.option({ name: 'input', short: 'i', type : 'path', description :'読み込むファイル名(point)を指定します', example: "'script --option=value' or 'script -i filename(point)'" }); // -s ヘックス毎のサイズを指定 argv.option({ name: 'size', short: 's', type : 'number', description :'ヘックスのサイズ(km)を指定します', example: "'script --option=value' or 'script -s number'" }); var argvv = argv.run(); var input = argvv.options.input; var size = argvv.options.size; //引数チェック if (!input) { console.log("引数が正しく入力されていません:" + " 読み込むgeojsonファイルを-iオプションで指定してください"); process.exit(); } if (!size) { console.log("引数が正しく入力されていません:" + " ヘックスのサイズをを-sオプションで指定してください"); process.exit(); } fs.readFile(input, 'utf8', function (err, data) { var points = JSON.parse(data); //hexを敷き詰める範囲 var extend = [126.5942359828125,29.685822563270666, 152.8295875453125, 45.59686948624793]; //範囲内にhexgridを敷き詰める var grid = turf.hexGrid(extend, size, "kilometers"); //hexgridのセル毎に、セル内に含まれるポイントデータの統計処理を行う。 //今回は、各セル内のポイントデータから「Leq昼間(dB)」の中央値を算出する var grid = turf.median(grid, points, "Leq昼間(dB)", "pt_median"); console.log(JSON.stringify(grid)) }); |
実行
コマンドプロンプトでポイントデータを読み込みヘックスのサイズ(km)を指定して実行します。
例として50km単位のヘックスで統計処理を行う場合は以下となります。
1 |
> node hextest.js -i point.geojson -s 50 > hex50.geojson |
処理時間
ヘックスグリッドを敷き詰める範囲に対してヘックスのサイズを小さくすると(セルの数が増えると)当然、統計処理にかかる時間は増えます。以下は今回試してみた結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
・対象ポイント数 3531 point ・スペック OS: Windows 8.1 CPU: intel Core i5-3470 3.20GHz RAM: 8.00 GB ・実行結果 100km Hex 0.316 sec. //hexgrid生成にかかった時間 0.84 sec. //統計処理にかかった時間 output 235KB //出力されるhexデータのサイズ 50km Hex 0.318 sec. 2.215 sec. output 890KB 25km Hex 0.324 sec. 7.795 sec. output 3,531KB 10km Hex 0.372 sec. 45.525 sec. output 21,818KB 5km Hex 0.579 sec. 185.835 sec. output 87,101KB |
表示してみた
100km HEX
example
25km HEX
example
統計処理を短くする
海の上までヘックスを敷き詰めるのは無駄が多い。今回の場合なら、先に日本の地形データ(ポリゴン)を用意しておいてヘックスグリッドとintersectとさせて、日本列島上のヘックスだけ取り出してから統計処理を行えばかなり計算量が減らせると思うので、あとで試してみます。