【備忘録】農水省の筆ポリゴンからPMTilesを生成する方法

# はじめに

本記事では、農水省がオープンデータとして公開している、[筆ポリゴン（2022年度公開）](https://www.maff.go.jp/j/tokei/porigon/)から、[PMTiles形式](https://github.com/protomaps/PMTiles)のデータを生成する方法について説明します。

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

https://protomaps.com/blog/pmtiles-v3-hilbert-tile-ids

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

# 前提条件
- 以下の農水省の[筆ポリゴン公開サイト](https://open.fude.maff.go.jp/)よりJSONをダウンロード済みであること。

https://open.fude.maff.go.jp/

- [OSGeo4W](https://trac.osgeo.org/osgeo4w/wiki/OSGeo4W_jp)がインストール済みであること。
- WSL（Ubuntu-20.04）がインストール済みであること。
- [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です。

# JSONからFlatGeobufを生成
- JSONからFlatGeobufの生成にはOSGeo4Wのogrmerge.pyを使用します。
- JSONのフォルダ構成は以下のとおりです。
```
D:.
│  merge.bat
│
├─2022_01
│      2022_011011.json
│      2022_011029.json
│      2022_011037.json
（中略）
```
- merge.batを実行して、FlatGeobufを生成します。
- 実行後、都道府県ごとにFlatGeobufが生成されます。
- 下記の記事を参考にさせていただきました。

https://qiita.com/wata909/items/4ff94d953d21392d8329
```merge.bat
@echo off
 
setlocal enabledelayedexpansion

for /l %%a in (1,1,47) do (
  set num=0%%a
  set num=!num:~-2,2!
  dir .\2022_!num!\*.json
  python C:\OSGeo4W\apps\Python39\Scripts\ogrmerge.py -f FlatGeobuf -single -o .\2022_!num!\fude_2022_!num!.fgb .\2022_!num!\*.json
 )
```

# FlatGeobufのマージ
- FlatGeobufのマージには[QGIS](https://qgis.org/ja/site/)を使用します。
- この時に、あわせてベクタ＞ジオメトリツール＞重心で筆ポリゴンの重心データも作成します。

# FlatGeobufからPMTilesを生成
- FlatGeobufからPMTilesの生成には[feltのtippecanoe](https://github.com/felt/tippecanoe)を使用します。
- WSLを起動して、以下のコマンドを実行します。
- 使用するFlatGeobufは以下のとおりです。
fude_2022_01_47.fgb：筆ポリゴン
fude_2022_01_47_centroid.fgb：筆ポリゴンの重心
```
tippecanoe -o fude_2022_01_47.pmtiles fude_2022_01_47.fgb -Z12 -z16 -pf -pk -P
tippecanoe -o fude_2022_01_47_centroid.pmtiles fude_2022_01_47_centroid.fgb -Z2 -z13 -pf -pk -P
```
- tippecanoeのオプション
-z, -Z：ズームレベル指定（-Z12 -z16とすると、ズームレベル12-16の範囲でタイルを生成します。指定しない場合は自動的に設定されます。大文字のZが最小ズーム、小文字のzが最大を示すことに注意が必要です。）
-pf：地物数制限を無視する（1タイルあたり200,000フィーチャに制限しない）
-pk：ファイルサイズ制限を無視する（1タイルあたり500Kバイトに制限しない）
-P：並列読み込み
ただし、下記の記事によると、-Pオプションが有効なのは、GeoJSONSeqのみのようです。

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

# 生成したPMTilesの確認
- 生成したPMTilesの確認には、[PMTiles Viewer](https://protomaps.github.io/PMTiles/)が便利です。
- PMTilesをドラッグ&ドロップすると、フィーチャが地図上に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/7cde89fd-e705-cdb5-a56e-15f51fd843be.png)

# PMTilesの配布
- 上記の方法で作成した、PMTiles形式の筆ポリゴンは、以下のGitHubにて配布しています。
## Maff-FudePolygon-PMTiles
https://github.com/shi-works/Maff-FudePolygon-PMTiles

## デモサイト
- また、PMTiles形式の筆ポリゴンは、MapLibre GL JSで作成した、デモサイトにて閲覧ができます。

https://shi-works.github.io/Maff-FudePolygon-PMTiles/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/ce472cab-eee9-d001-32fd-75668883c207.png)

# 参考情報

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

https://github.com/protomaps/PMTiles

https://github.com/felt/tippecanoe