Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

この記事では 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 にしたものを処理するのがいいと思います。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away