ハンズオン準備３：モジュール化した osm.pbf を GeoJSON に変換する

[ハンズオン準備](https://qiita.com/hfu/items/6026eec6816465d7e7a9)の第３回です。osm.pbf ファイルを GeoJSON テキストシーケンスに変換します。シリーズの趣旨は[第１回](https://qiita.com/hfu/items/9dfc0ec57c98dffe6f23)をご参照ください。

# なぜ私は心配することをやめて GeoJSON テキストシーケンスという名前を愛することにしたか
osmium は、対応する export 形式として、[GeoJSON Text Sequences](https://tools.ietf.org/html/rfc8142) があるとしています。そして、オプションで RS　（レコードセパレータ）　を省略するというオプションをつけています。

他方、私は、この RS を省略した GeoJSON シーケンスと技術的に同一なファイルを、tippecanoe への入力ファイル形式として、またその他多くの地理空間情報処理のための基本形式として使ってきました。

概念の共通化の観点から、しっかりと IETF レベルで整理された、GeoJSON テキストシーケンスという名前を使った方が、みなさんにとってわかりやすそうですよね。よって以後、私も　GeoJSON テキストシーケンスという名前を積極的に使っていくことにします。他方、RS は多くの環境で見た目がとっつきにくくなるので、省略することにします。

私は、伝統的には、この形式を GeoJSON Features の [NDJSON](http://ndjson.org/) と考えてきたので、いまのところ、GeoJSON テキストシーケンスの拡張子は .ndjson を使っています。

# osmium extract
実際の変換は osmium extract でやりました。一般的な説明は [マニュアル](https://github.com/osmcode/osmium-tool/blob/master/man/osmium-extract.md)　に書いてあります。

私は次のコマンドを実行しました。いずれこの方法で本格的に生産することがあるとすれば、少しコマンドラインオプションは変えるかもしれません。このオプションづけは、試行錯誤段階でやるオプションづけですね。

```bash
$ osmium export --verbose --show-errors -i sparse_file_array -c /somewhere/config.json -f geojsonseq --omit-rs -o 6-43-30.ndjson 6-43-30.osm.pbf
```

うち、config.json については、次のセクションで説明します。 -i sparse_file_array も、いくつか計測してこれがよいと見つけたオプションです。特に計算機環境（たぶん、とくに　RAM）が貧弱な場合に、ある程度性能を犠牲にして、メモリ不足中断を防ぐのによいオプションだと思いました。

## config.json
osm.pbf からエクスポートするにあたっての設定を config.json に書きます。ここでは、QA Tiles を osmium を使って再現するような文脈も使われているらしい、[osmium-tool/export-example-config/example-config.json](https://github.com/osmcode/osmium-tool/blob/master/export-example-config/example-config.json)を使っています。引用すると、次の通りです。

```json
{
    "attributes": {
        "type":      true,
        "id":        "@id",
        "version":   false,
        "changeset": false,
        "timestamp": false,
        "uid":       false,
        "user":      false,
        "way_nodes": false
    },
    "linear_tags":  ["highway", "barrier", "natural=coastline"],
    "area_tags":    ["aeroway", "amenity", "building", "landuse", "leisure", "man_made", "natural!=coastline"],
    "exclude_tags": ["created_by", "source", "source:*"],
    "include_tags": []
}
```

## 取得した GeoJSON テキストシーケンス
この方法で取得した GeoJSON テキストシーケンスは次のようなものなります。

```json
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.223033,6.0452337]},"properties":{"bus":"yes","name":"Sarentukade Junction","junction":"yes","public_transport":"stop_position"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.217646,6.0577003]},"properties":{"bus":"yes","name":"Beligaha Junction","is_in":"Galle District","junction":"yes","public_transport":"stop_position"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.2067903,6.0524864]},"properties":{"railway":"level_crossing"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.1968387,6.0544634]},"properties":{"railway":"level_crossing"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.2138942,6.0441474]},"properties":{"name":"Kogalla Kade Junction;Koggala Kade Junction","is_in":"Galle District;Southern Province;Sri Lanka","place":"neighbourhood","population":"1000","is_in:country":"Sri Lanka","is_in:district":"Galle District","is_in:province":"Southern Province","is_in:continent":"Asia","is_in:country_code":"LK"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.5488612,5.9454529]},"properties":{"highway":"crossing","crossing_ref":"zebra"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.5413733,5.9492261]},"properties":{"highway":"crossing","crossing":"zebra"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.4752616,5.9396186]},"properties":{"highway":"crossing","crossing_ref":"zebra"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.5683876,5.9428884]},"properties":{"name":"Eliyakanda Junction","junction":"yes"}}
{"type":"Feature","geometry":{"type":"Point","coordinates":[80.9317384,6.1100208]},"properties":{"highway":"crossing","crossing_ref":"zebra"}}
```
(c) OpenSteeetMap contributors.

# GeoJSON テキストシーケンスをどのように圧縮しておくか
作った GeoJSON テキストシーケンスをいくつか圧縮してみて、ハンズオンで共有するファイルはどのように圧縮しておくべきか考えてみました。

- もともとの生ファイル 6-43-30.ndjson は 554MB になりました。
- bzip2 で圧縮した 6-43-30.ndjson.bz2 は 100MB になりました。
- gzip で圧縮した 6-43-20.ndjson.gz は 106MB になりました。

GitHub で持ってくれるファイルの一個の最大サイズは 100MB です。ただし、５０MB　から警告が出ます。ここは、さっぱりと、GitHub　におくことは諦めることにしましょう。

Node.js が標準で持っているのは zlib だけであることから、gzip 圧縮したもので持っておくことにします。

ホストは自分のドメインか、あるいは GitLab あたりで行うことを考えることにします。

# 次回
GeoJSON テキストシーケンスにフィルタをかけて、レイヤ名と minzoom, maxzoom を割り当てていくところを書いていくことにします。