読者です 読者をやめる 読者になる 読者になる

csv2geojson.js でエラーとして出力された JSON を GeoJSON に変換する

node.js のパッケージとして csv2geojson が公開されています。
コマンドイッパツで CSV や TSV を GeoJSON にしてくれる優れものです。

$ npm install -g csv2geojson
$ csv2geojson geodata.csv > geodata.geojson

非常に便利なのですが、変換できる位置情報の投影法が緯度経度で示されているもの(WGS84)に限られてしまうようで、平面直角座標系の CSV を渡すと緯度と経度が入ってねーよ(意訳)という旨の入った、 JSON標準エラー出力に返されます。

{
  "type": "Error",
  "message": "Latitude and longitude fields not present",
  "data": [
    {......

この返ってきた JSON を再パースして GeoJSON にする Ruby スクリプトを書いてみました。

json2gejson

csv2geojson のエラー出力を JSON として保存して json2gejson に渡せば GeoJSON に変換できます。

$ csv2geojson geodata.csv 2> geodata.json
$ ./json2geojson.rb -i geodata.json -c 9
=> geodata.geojson

csv2geojson に対して WGS84 にしか対応してないと言っておきながらこのスクリプト世界測地系2000にしか対応していない上、座標カラムの指定が間違っていても GeoJSON 風 JSON を返してしまうアホ仕様です。
昨日一部のコードを晒したところ、いくつかのアドバイスも頂いたのですが、それはまだ反映できていません。

今回はコマンドラインから渡されるオプションの処理とかを加えてみたりしたのでサンデープログラマーとして亀の歩みで覚えていっている感じです。
メソッド化とかエラー処理とか甘い部分はまだまだ多いですけどね…。

ところで、 Rubygems には csv2json というパッケージがあるので、これを使えば node.js の csv2gejson を通さなくても Ruby だけでダイレクトに GeoJSON 作れそうです。
そんなわけで、実用性とかじゃなくて習作に近い位置づけです。 というか、数ファイル程度なら QGISデリミティッドテキストレイヤの追加を使った方が確実で楽だと思います。