11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Shapefile を node.js だけで GeoJSON にして GitHub で確認するまで

Posted at

はじめに

この記事では node.js で Shapefile を GeoJSON に変換するライブラリである shapefile の使い方を紹介します。
shapefile ライブラリは GDAL や iconv などのネイティブライブラリに依存しない pure javascript なライブラリなので導入が簡単です。あと GeoJSON のプロパティをいじったりするのもあまり悩まずに済む、というのもメリットかもしれません。

1. シナリオ

青森県の市区町村行政区域ポリゴンの shapefile を GeoJSON に変換、境界線を黒、中身を黄色で塗りつぶすようにプロパティを設定して、GitHub にアップして表示してみましょう。

行政区域ポリゴンの入手は http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html よりどうぞ。以下の例では N03-150101_02_GML.zip という2015年版を使います。

GitHub がサポートしている、GeoJSON のスタイリングプロパティは https://help.github.com/articles/mapping-geojson-files-on-github/ よりどうぞ。今回はポリゴンを扱うので fillstroke の関連をプロパティを使いますが、ポイントデータの場合には marker 関連のプロパティを使うこともできます。

2. インストール

以下の手順で環境を準備します

$ unzip N03-150101_02_GML.zip
Archive:  N03-150101_02_GML.zip
   creating: N03-20150101_02_GML/
  inflating: N03-20150101_02_GML/KS-META-N03-15_02_150101.xml
  inflating: N03-20150101_02_GML/N03-15_02_150101.dbf
  inflating: N03-20150101_02_GML/N03-15_02_150101.prj
  inflating: N03-20150101_02_GML/N03-15_02_150101.shp
  inflating: N03-20150101_02_GML/N03-15_02_150101.shx
  inflating: N03-20150101_02_GML/N03-15_02_150101.xml

$ npm install frogcat/shapefile
shapefile@0.3.1 node_modules/shapefile
├── d3-queue@1.2.3
├── iconv-lite@0.4.13
└── optimist@0.3.7 (wordwrap@0.0.3)

$
  1. 入手した zip ファイルを展開します
  2. npm を使って shapefile をインストールします

なお、ここでは筆者が fork した frogcat/shapefile をインストールしています。本家のライブラリだと Shift_JIS でエンコードされた Shapefile をうまく扱うことができないためです。

3. コーディング

以下のような node.js スクリプトを作成します

main.js
"use strict";
var shapefile = require("shapefile");
shapefile.read(process.argv[2], "shift_jis", function(error, geojson) {
  geojson.features.forEach(function(feature) {
    feature.properties["stroke"] = "#000";
    feature.properties["stroke-opacity"] = 0.8;
    feature.properties["stroke-width"] = 2;
    feature.properties["fill"] = "#ff0";
    feature.properties["fill-opacity"] = 0.5;
  });
  console.log(JSON.stringify(geojson, null, ""));
});

shapefile.read(filename,encoding,callback) によって、指定された SHP を指定されたエンコーディングでパースしつつ、変換された geojson をコールバック関数に渡す、という仕組みです。

コールバック関数の中では、geojson の各 feature に対してストロークとフィルのプロパティを設定しています。

最後に console.log を使って、geojson を標準出力に吐きます。

4. 実行

以下の手順で実行します

$ node main.js N03-20150101_02_GML/N03-15_02_150101.shp > out.geojson

できあがった geojson を Gist にアップロードするとこんなかんじになります。うまくいきました。

image

5. まとめ

npm の shapefile ライブラリを使って Shapefile を GeoJSON に変換する方法を紹介しました。GitHub のユーザであれば node や npm はだいたい導入されているでしょうから、結構手軽に shape2geojson の環境を用意できます。

http://turfjs.org/ の加工を挟むなど、応用もききます。

ただ、shapefile ライブラリはまだ開発途中なので文字化けや一部未サポートの機能があるなど問題もあります。その場合にはおとなしく GDAL を使って GeoJSON にしたものを処理するのがいいと思います。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?