PBFデータをGeoJSONとMBTilesに変換する方法

## はじめに

[以前の記事](https://qiita.com/AshMap/items/b6f7177ea75584619f0f)で、PBF（Protocolbuffer Binary Format）形式のデータをPostGISにインポートし、QGISで表示する方法を解説しました。今回はその続編として、PBFデータをGeoJSON形式とMBTiles形式に変換する手順を紹介します。
この手法では、ローカル環境でのデータ確認やWeb地図でのタイル配信を見据えた準備として有用です。今後の記事では、このMBTiles形式を活用してWeb(ブラウザ)地図として表示する方法についても紹介していきたいと思います。

本記事ではMac環境を前提に説明しますが、Windows環境での注意点も各セクションで補足します。


## 必要なツール
以下のツールを事前に準備してください：
	•	osmium-tool：PBFデータのフィルタリングや変換に使用
	•	tippecanoe：GeoJSONデータをMBTilesに変換するツール

>注意：各ツールのインストール方法は公式サイトやパッケージマネージャ（Homebrewなど）をご参照ください。



## 手順概要

1. PBFデータから必要な情報を抽出（例: 道路データ）。
2. 抽出したデータをGeoJSONに変換。
3. GeoJSONをMBTilesに変換。

以下、各ステップについて詳細に解説します。


## 1. PBFデータから必要なデータを抽出

まず、osmium-tool を使ってPBFデータをフィルタリングし、必要なデータだけを抽出します。ここでは、例として道路データ（highway タグ）を抽出します。

コマンド例(Mac)
```bash
osmium tags-filter input.osm.pbf -o roads.osm.pbf w/highway
```
- input.osm.pbf：元のPBFデータファイル。
- roads.osm.pbf：抽出結果（道路データ）のPBFファイル。
- w/highway：highway タグを持つウェイ（ライン）データを抽出。
>nodeの場合は`n/highway` 等適宜フィルタしたいものに合わせて変更ください。

#### Windowsの場合の補足
- コマンドのファイルパスを**絶対パス形式** **（C:\path\to）** **またはスラッシュ形式** **（C:/path/to）** で指定してください。

- WSL（Windows Subsystem for Linux）を使用する場合、以下のようにパスを記述します：

```bash
osmium tags-filter /mnt/c/path/to/input.osm.pbf -o /mnt/c/path/to/roads.osm.pbf w/highway
```
 
## 2. PBFデータをGeoJSONに変換

次に、osmium export を使用して、PBFデータをGeoJSON形式に変換します。

コマンド例(Mac)
```bash
osmium export roads.osm.pbf -o roads.json
```
- roads.osm.pbf：抽出済みのPBFデータ。
- roads.json：変換後のGeoJSONデータ。

GeoJSON形式は、軽量なデータ構造で多くのGISツールやWeb地図ライブラリ（例: MapLibre、Leafletなど）で利用できます。
>PBFを直接変換することも可能ですが、今回は軽量な中間ファイルを介してデータを途中で確認、加工することも想定してGeojsonを経由しています。

#### Windowsの場合の補足
ファイルパスの指定に注意してください。WSLを使う場合は次のように記述します：
```bash
osmium export /mnt/c/path/to/roads.osm.pbf -o /mnt/c/path/to/roads.json
```

## 3. GeoJSONをMBTiles形式に変換

最後に、tippecanoe を使用してGeoJSONをMBTiles形式に変換します。

コマンド例(Mac)
```bash
tippecanoe -o roads.mbtiles --minimum-zoom=0 --maximum-zoom=14 roads.json
```

- roads.json：GeoJSON形式のデータ。
- roads.mbtiles：出力されるMBTilesファイル。
- --minimum-zoom と --maximum-zoom：生成するタイルのズームレベルを指定。

#### データ量が多い場合の対処策

大量のデータを処理する際、tippecanoe で失敗することがあります。以下のオプションを使用すると、タイル生成時にデータ量を間引いて処理が可能です：
- フィーチャをランダムに間引く：
```bash
--drop-fraction-as-needed
```

- 密集している部分を優先的に間引く：
```bash
--drop-densest-as-needed
```

- フィーチャの削減率を指定（例: 50%削減）
```bash
--drop-rate=0.5
```

例：
```bash
tippecanoe -o roads.mbtiles --minimum-zoom=0 --maximum-zoom=14 --drop-densest-as-needed roads.json
```

## Windowsでのツールインストールについて

1. osmium-tool
- Windows用のネイティブバイナリは提供されていないため、WSLまたはDockerを使用することを推奨します。
- WSL環境でUbuntuをインストールし、以下を実行してosmium-toolをセットアップ：

```bash
sudo apt update
sudo apt install osmium-tool
```

2. tippecanoe
Windowsでもソースコードをビルドして使用可能ですが、手間がかかるためWSLでインストールするのがおすすめです：
```bash
sudo apt install tippecanoe
```

WSL内でのファイルパス指定
WindowsのファイルをWSL上で操作する場合、以下のように指定します：

```bash
/mnt/c/path/to/input.osm.pbf
```

## まとめ

PBFから必要なデータを抽出：
```bash
osmium tags-filter input.osm.pbf -o roads.osm.pbf w/highway
```

GeoJSONに変換：
```bash
osmium export roads.osm.pbf -o roads.json
```

MBTilesに変換：
```bash
tippecanoe -o roads.mbtiles --minimum-zoom=0 --maximum-zoom=14 roads.json
```

これで、PBFデータをGeoJSONやMBTiles形式に変換する手順が完了しました。今後の記事では、生成したMBTilesファイルを使ってWeb地図としての配信方法も解説してみたいと思います。

この手順が少しでも参考になれば幸いです。