Shapefileを簡素化とGeobufで軽量化する
容量の大きい地理情報データは重くてWebに載せられないので、軽量化が必要です。
今回は Shapefile を対象に、簡素化とBuffer(Geobuf)形式を使った軽量化の一連のステップを紹介します。
ちなみに、今回例として取り上げた全国市区町村界データを軽量化した結果(ファイルサイズ)は次の通りです。
Shapefile | GeoJSON | Buffer(簡素化済) |
---|---|---|
9MB | 25MB | 0.6MB |
ただし簡素化は、やるだけポリゴンが荒くなるので、やりすぎには注意が必要です。
手順
Shapefileを取得 → GeoJSONに変換 → GeoJSONを簡素化 → 自己交差エラーを解決 → Bufferに変換、といった手順で軽量化します。
1. Shapefileを取得
軽量化する Shapefile を用意しましょう。
例として、今回はEsriの全国市区町村界データを利用します。
(もし軽量化の対象がGeoJSONであれば、3. まで飛んでOKです)
2. GeoJSONに変換
色んな変換方法がありますが、この後の手順で使う QGIS を使う方法と、コマンド一発で手軽な shp2json を使う方法の2種類を紹介します。
A. QGISを使う方法
- QGIS をダウンロード/インストール
- インストールした QGIS を開き、変換する Shapefile をドラック&ドロップ
- 「レイヤー」ウィンドウに表示される Shapefile のレイヤーを右クリック → エクスポート → 地物の保存
- 適当なファイル名とCRSを入力し、形式を GeoJSON にしてOKボタンを押す
B. shp2jsonを使う方法
- shp2json をインストールまたはローカル or グローバルに配置
- PATHを通す
- 次のコマンドを実行
$ npx geobuf2json shapefile.shp > data.json
3. GeoJSONを簡素化
GeoJSONの容量の大部分を占めるのが、ポリゴンデータです。
次の図は、今回例として使う市区町村レベルのポリゴンデータの一部です。
ポリゴンデータがどれだけ容量喰い虫かわかるでしょう。
このステップでは、これらポリゴンデータを簡略化します。
要は、ポリゴンを荒くする処理です。
GeoJSONの簡略化には、mapshaper が便利です。
- mapshaper にGeoJSONをインポート
- 「Simplyfy」でどれくらい簡略化するか調整
- 「Export」で出力
(QGISにも簡略化ツールがありますが、各地域間のポリゴンを滑らかにつなげることを考慮していないアルゴリズムなので、ズームすると見た目がガタガタになります)
4. 自己交差エラーを解決
ポリゴンデータを簡略化すると発生する、自己交差エラーを解決します。
QGISの「妥当性チェック」というツールを使うと、どこでエラーが発生しているかわかります。
解決するには、同じくQGISの「ジオメトリの修正」を使うのがおそらく最善手です。
4.5 要らない属性データを削除
使わない属性データがあれば、QGISの属性テーブルを編集して、削除してしまいましょう。
5. Bufferに変換
geo2buf を使って、これまで加工してきたGeoJSONを、さらに軽量なbuffer形式に変換しましょう。
手順は次の通りです。
- shp2json をインストールまたはローカル or グローバルに配置
- PATHを通す
- 次のコマンドを実行
$ json2geobuf data.json > data.buf
おまけ
Bufferをフロントで使う
GeobufでBufferをデシリアライズして使いましょう。 github.com
ちなみに、Geobufに代わってFlatGeobufが最近巷で噂になっているようです。 gunmagisgeek.com
市区町村レベルと都道府県レベルの境界線を重ねて使う場合
市区町村/都道府県レベルそれぞれの境界がキレイに重なっている必要があります。 そこで、今回作った市区町村レベルのデータから、都道府県レベルのデータを作ります。
上記に記載する 5. の直前が良いでしょう。 4.5 で要らない属性データを消したのちに、QGISの「融合」というツールで都道府県の属性を使って融合(ディゾルブ)します。