ベクターデータからPMTilesを生成する方法

# はじめに
:::note info
この記事は [FOSS4G Advent Calendar 2023](https://qiita.com/advent-calendar/2023/foss4g) 11日目の記事です。
:::
GIS界隈ではCloud Optimizedが重要なキーワードになっています。Cloud Optimizedとは、特別なサーバ実装を必要とせず、大きな位置情報データの一部分を配信することを可能とするファイル形式の総称です。本記事は、Cloud Optimized形式のうち、[PMTiles（ベクトルタイル）](https://github.com/protomaps/PMTiles)の生成方法に焦点を当てた記事になります。具体には、京都市がオープンデータとして公開している、[京都市固定資産税（土地）地番図データ](https://data.city.kyoto.lg.jp/dataset/00652/)からPMTilesを生成する方法について説明します。PMTilesの生成方法については、Zennでも記事を書いていますので、あわせてご覧ください。

https://zenn.dev/shi_works/articles/8b2b71f7d3132c

https://zenn.dev/shi_works/articles/e8ae68ee9d8310

# PMTilesの特徴
- 単一ファイル形式のタイルデータ
- ラスタータイル、ベクトルタイルともに対応
- 地球規模のタイルマップの保存
- S3 のようなストレージとHTTP Range Requestsのみを使用

https://protomaps.com/docs/pmtiles

# PC環境
OS：Windows 10 Pro
CPU：Intel Core i7-9700
メモリ：32GB

# 前提条件
- ベクターデータからPMTilesの生成は、手元にMBTilesがあるならProtomaps公式の[go-pmtiles](https://github.com/protomaps/go-pmtiles)を使用したほうが良さそうです。
- 一方で、手元にGeoJSONやFlatGeobufがあるならfeltの[tippecanoe](https://github.com/felt/tippecanoe)を使用したほうが良さそうです。
- 今回は、後者のfeltのtippecanoeを用いた、PMTilesの生成方法について説明します。

## 環境構築
- QGISがインストール済みであること。
- QGISのバージョンは、3.34.0です。

https://www.qgis.org/ja/site/

- WSL2（Ubuntu-20.04）がインストール済みであること。

https://learn.microsoft.com/ja-jp/windows/wsl/install

- feltのtippecanoeがインストール済みであること。

https://github.com/felt/tippecanoe

- Windows 10へのtippecanoeのインストール方法は下記のとおりです。

https://gist.github.com/ryanbaumann/e5c7d76f6eeb8598e66c5785b677726e

- ただし、上記に記載の`git clone https://github.com/mapbox/tippecanoe.git`の箇所を`git clone https://github.com/felt/tippecanoe.git`への変更が必要です。
- tippecanoeのバージョンはv2.23.0です。

- 下記のサイトより京都市固定資産税（土地）地番図データのシェープファイルをダウンロードし、解凍済みであること。

https://data.city.kyoto.lg.jp/dataset/00652/

# シェープファイルからFlatGeobufを生成
- シェープファイルからFlatGeobufの生成には[QGIS](https://www.qgis.org/ja/site/)を使用します。
- 地番図データの座標参照系（CRS）が平面直角座標系6系（EPSG：2448）なので、エクスポート時の座標参照系（CRS）をWGS84（EPSG：4326）にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/78c7ec6c-1346-e235-acd1-ba30b31ea85d.png)

# FlatGeobufからPMTilesを生成
- FlatGeobufからPMTilesの生成には[feltのtippecanoe](https://github.com/felt/tippecanoe)を使用します。
- WSLを起動して、下記のコマンドを実行します。
```
tippecanoe -o kyotoshi_chiban_r05.pmtiles kyotoshi_chiban_r05.fgb -pf -pk -P
```
- tippecanoeのオプション
-P：並列読み込み
ただし、下記の記事によると、-Pオプションが有効なのは、GeoJSONSeqのみのようです。

https://qiita.com/Kanahiro/items/ceeb20c158b4c70b62b6

-pf：地物数制限を無視する（1タイルあたり200,000フィーチャに制限しない）
-pk：ファイルサイズ制限を無視する（1タイルあたり500Kバイトに制限しない）

-z, -Z：ズームレベル指定
- ズームレベルを指定する場合は下記のとおりになります。
- -Z10 -z18とすると、ズームレベル10-18の範囲でタイルを生成します。
- 指定しない場合は自動的に設定されます（ズームレベル0～14）。
- 大文字のZが最小ズームレベル、小文字のzが最大ズームレベルを示すことに注意が必要です。
```
tippecanoe -o kyotoshi_chiban_r05.pmtiless -Z10 -z18 kyotoshi_chiban_r05.fgb -pf -pk -P
```

- 下記でズームレベルごとの地理分解能の概数がわかります。
- ズームレベル14で0.5m相当となり、これは一般的なWeb地図では十分な分解能と言えます。
- お好みでより高い精度を求めることは可能ですが、タイル数とのトレードオフになります。

https://github.com/felt/tippecanoe#zoom-levels

# 生成したPMTilesの確認
- 生成したPMTilesの確認には、PMTiles Viewerが便利です。
- PMTilesをドラッグ&ドロップすると、フィーチャが地図上に表示されます。

https://protomaps.github.io/PMTiles/

# 生成したPMTilesをMapLibre GL JSで表示する
- 上記の方法で生成したPMTilesと[MapLibre GL JS](https://maplibre.org/maplibre-gl-js/docs/)で作成したデモサイトを下記のGitHubにて公開しています。

https://github.com/shi-works/kyoto-chiban-map-on-maplibre-gl-js

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/e008e383-99fb-38ab-b637-834e2b5e2424.png)

# 参考文献

https://qiita.com/Kanahiro/items/ceeb20c158b4c70b62b6

https://github.com/protomaps/PMTiles

https://github.com/felt/tippecanoe