shpファイルからベクトルタイルを作成する

# はじめに
[こちらの記事](https://qiita.com/T-ubu/items/76a60bfd4a27d11521e2)を参考にしながらshpファイルからベクトルタイルを作成していましたが、自分自身の整理のためにも、ベクトルタイル作成方法を記録するため本記事を執筆しました。ベクトルタイルへの変換の記事は数が限られているので、どなたかのお役に立てれば幸いです。

## tippecanoe
tippecanoeとは、GeoJSONやFlatGeobufなどのファイルからベクトルタイルを効率的に作成することが出来るツールです。ライセンスは、2条項 BSD License(BSD 2-Clause "Simplified" License)で、商用利用も含め自由に使う事ができます。Mapbox社が開発・メンテナンスしていましたが、現在はfeltという地図サービスを提供する組織にフォークされ、そちらで開発が続けられているようです。

# 作業環境
私はMacを使用しているので、上記参考記事のようにDockerを使用していません。Windowsユーザーの方は上記参考記事を見ていただいたらと思います。

macOS Sonoma 14.5
[tippecanoe](https://github.com/felt/tippecanoe) 2.56.0
[GDAL](https://gdal.org/) 3.9.1

# ソースデータ
[Natural Earth](https://www.naturalearthdata.com/) のデータを使用します。このサイトのデータは全ての権利が放棄されている状態であるパブリックドメインのデータです。Natural Earthのデータは、WGS84・緯度経度座標：EPSG（4326）の空間参照系を使用しています。
ダウンロードページから、「1:110m Physical Vectors」の「Coastline」、「Land」、「Rivers,Lake Centerlines」をダウンロードします。ダウンロードしたshpファイルをQGISで表示させてみると以下のようになります。

![スクリーンショット 2024-07-31 16.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3684675/cd02698f-158a-ac3e-bcb8-ab954edbd535.png)

# ベクトルタイルの構成
以下のようなベクトルタイル構成とします。後にスタイル付けをする際に必要になってくるので、この時点で整理しておきます。

| レイヤ名 | ソース | Min Zoom | Max Zoom |
|:-:|:-:|:-:|:-:|
| coastl | ne_110m_coastline.shp  | 0 | 4 |
| landmass  | ne_110m_land.shp  | 0 | 4 |
| riverl  | ne_110m_rivers_lake_centerlines.shp  | 0 | 4 |

# shpからGeojsonへの変換
GDALを使用して変換します。shpファイルが保存されているフォルダに移動して、以下のコードを実行します。

```
ogr2ogr -f GeoJSON coastl.geojson ne_110m_coastline.shp
ogr2ogr -f GeoJSON landmass.geojson ne_110m_land.shp
ogr2ogr -f GeoJSON riverl.geojson ne_110m_rivers_lake_centerlines.shp
```

例として、一番上の一行を解説すると以下となります。
ogr2ogr: ファイルフォーマット変換の実施
-f GeoJSON: -fがアウトプットフォーマットの指定。この場合は、GeoJSONファイルをアウトプットフォーマットと指定
coastl.geojson: アウトプットファイルの名前を指定
ne_110m_coastline.shp: 変換元（インプット）ファイルの指定

# Geojsonからベクトルタイルへの変換
作成したGeojsonファイルが存在するフォルダに移動し、tippecanoeを使用して以下のコードを実行します。

```
tippecanoe -e VTpractice --no-tile-compression --no-feature-limit --no-tile-size-limit --drop-rate=1 -Z0 -z4 -L coastl:coastl.geojson -L landmass:landmass.geojson -L riverl:riverl.geojson
```
### オプションの解説
-e VTpractice: VTpraceticeというディレクトリにpbfファイルを保存（mbtilesを指定する場合は、「-o VTpracetice.mbtiles」として、さらに「--no-tile-compression」オプションを含めないようにする）。-eオプションでディレクトリに保存する事ができる。

--no-tile-compression： pbfベクトルタイルを圧縮形式にしない

--no-feature-limit：　20万地物という制限を設けない

--no-tile-size-limit： 500キロバイトという制限を設けない

--drop-rate=1： 地物を簡略化しない。

-Z0： タイルが作成される最小ズームレベル（今回はズームレベル0）

-z4： タイルが作成される最大ズームレベル（今回はズームレベル4)
※小文字のzが最大ズームレベルを表し、大文字のZが最小ズームレベルを表すため、直感と異なるので注意。（逆にした方が分かりやすかったのでは。。）

「-L coastl:coastl.geojson」: coastl.geojsonから作成されるベクトルタイルのレイヤ名をcoastlとする。 

「-L landmass:landmass.geojson」： landmass.geojsonから作成されるベクトルタイルのレイヤ名をlandmassとする。

「-L riverl:riverl.geojson」： riverl.geojsonから作成されるベクトルタイルのレイヤ名をriverlとする。

今回作成したデータを利用して、[こちらの記事](https://qiita.com/k96mz/items/588a5241327f51cb5f9f)でスタイルファイルを作成し地図を表示しています。

## Mbtilesファイルでベクトルタイルを作成する
Mbtilesファイルでもベクトルタイルを作成します。以下のコマンドで作成できます。

```
tippecanoe -o VTpractice.mbtiles --no-feature-limit --no-tile-size-limit --drop-rate=1 -Z0 -z4 -L coastl:coastl.geojson -L landmass:landmass.geojson -L riverl:riverl.geojson
```

-o VTpractice.mbtiles: 出力ファイルの名前を指定しています。
--no-tile-compressionの記載は削除して、圧縮しています。


# Reference

https://qiita.com/T-ubu/items/76a60bfd4a27d11521e2

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

https://qiita.com/k96mz/items/588a5241327f51cb5f9f