unvt を つかって GeoJSONやシェープファイルからPMtilesを簡単につくる（Docker利用）

# はじめに
tippecanoe ([felt/tippecanoe](https://github.com/felt/tippecanoe))の v2.17 から　PMTilesがサポートされたというつぶやきをみました。

https://mobile.twitter.com/bdon/status/1608668759035904001

私はまだPMTiles初心者ですが、最近注目の技術ということもあり、簡単にPMtilesを作ってみる実験をしてみました。

Docker環境ですぐにできます。unvt/nanban と　それに含まれる　unvt/kata と felt/tippecanoe を使うと簡単です。

# 環境
* Windows 10
* Docker
  * unvt/nanban　イメージを使います
    * unvt/kata v1.0.4
    * tippecanoe v2.17.0
    * gdal(ogr2ogr) GDAL 3.4.1, released 2021/12/27

# 手順
## Docker コンテナ起動とデータの準備
今回は、もともとGeoJSON形式でインターネット上にあるファイル２つと、ダウンロードしてきた海岸線のシェープファイルを使います。

シェープファイルは[NaturalEarth](https://www.naturalearthdata.com/downloads/50m-physical-vectors/)の50mスケールの海岸線をダウンロードしてsrcフォルダに入れておいてから、gdalでGeoJSONに変換します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/77ac6723-188c-fe5a-8297-a21957387892.png)

Dockerのunvt/nanbanイメージを起動して、シェープファイルをGeoJSONに変換するために以下のようにコマンドを実行します。（拡張子をgeojsonsにするとGeoJSONseq形式になりますが、unvt/kataがGeoJSONseqのファイルをよまないので今回はgeojsonに出力します。）

```bash
docker run -it --rm -v ${PWD}:/data unvt/nanban
cd /data
mkdir src
# srcフォルダにデータを入れておく
ogr2ogr coastline.geojson src/ne_50m_coastline.shp
```

これで使うデータが以下の通りで準備できました。
* 変換したGeoJSONはローカルに: coastline.geojson
* インターネット上のGeoJSON（１）- セネガル: https://geoportal.un.org/arcgis/sharing/rest/content/items/3b628266c28345ecbcac152255eba4be/data
* インターネット上のGeoJSON（２）- コンゴ民主共和国: https://geoportal.un.org/arcgis/sharing/rest/content/items/2b37e02f41f942e69892b95ea49b56f0/data



## ソース、レイヤ、ズームレベルを整理してYAMLファイルにする
YAMLファイルに書いた通りですが、ソース名（キーというか、これがベクトルタイルのレイヤ名になる）、URL、ズームレベルなどを決めます。以下のように整理しました。本当はsalb-senとsalb-codは同じsalbというレイヤにしたかったのですが、キーが同じだとエラーになるのでできませんでした。今後のkataの改良ポイントですね。

```YAML:kata.yml
coastline: #this will be a layer name
  source: ./coastline.geojson
  minzoom: 0
  maxzoom: 5
salb-sen:
  source: https://geoportal.un.org/arcgis/sharing/rest/content/items/3b628266c28345ecbcac152255eba4be/data
  properties:
    country: SEN
  minzoom: 0
  maxzoom: 5
salb-cod: 
  source: https://geoportal.un.org/arcgis/sharing/rest/content/items/2b37e02f41f942e69892b95ea49b56f0/data
  properties:
    country: COD
  minzoom: 0
  maxzoom: 5
```

## 出力をテスト
作ったYAMLファイルを使ってkataのフィルタ機能を試します。まずは、stdoutのまま、画面で確認します。

```bash
kata filter kata.yml
```
きちんと出力されていそうなことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/57cd3758-44ba-7942-d466-4adb7df09f48.png)

## 出力をtippecanoeにパイプする
今度は出力をベクトルタイル作成ツールのtippecanoeにつなぎます。TippecanoeでPMTilesを作るためには、-o　オプションで拡張子をmbtilesの代わりにpmtilesにすればよいみたいです。試しに圧縮なしとありで出力してみました。

```bash
kata filter kata.yml | tippecanoe -o test.pmtiles --no-tile-compression --no-feature-limit --no-tile-size-limit
kata filter kata.yml | tippecanoe -o test2.pmtiles --no-feature-limit --no-tile-size-limit
```
若干ファイルサイズが違いますが、PMtilesができました。

## Protomapsのページでプレビューしてみる

作成したPMtilesをドラッグ、ドロップするだけでプレビューできるそうなのでためします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/970e6b45-3d35-ec8a-70b7-7d317fab4153.png)



https://protomaps.github.io/PMTiles/ のページでプレビューしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/e066b7ae-3611-c53f-4521-a84f32b32d26.png)

圧縮なしでもありでも同じように見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/00eb6f3d-3bf0-5c30-aa8e-5aae71bde25f.png)

ポップアップも見られて便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/8f468ec6-30bd-01e3-c651-d74156b2c214.png)


# まとめ
すごく簡単に、PMtilesの作り方をまとめました。
Dockerが使えれば、すぐにできます。

# 参考ページ
https://github.com/felt/tippecanoe

https://mobile.twitter.com/bdon/status/1608668759035904001

https://github.com/unvt/kata

https://qiita.com/T-ubu/items/12aab148bfd293bd0fd0