データ変換済み地図XML（GeoJSON）2023年度版をWindowsパソコン（WSL）でPMtiles形式のベクトルタイルにする

# はじめに
## 目的
2022年度以降、G空間情報センターから公開されている法務省の法務局登記所備付データ（地図XML）が公開され、これまでにいろいろな方が作業されています。特に、公共座標系の筆のデータはベクトルタイル（Pmtiles形式）に変換することでウェブ地図で容易に閲覧することが可能ということも実証されています（たとえばamx-project）。

私もamx-project/aのレポジトリで作成されていた2022年度版のPmtilesデータを使って自分のウェブ地図を作っていましたが、新しい年度の筆データを使いたいと思いました。そこで今回、**2023年度の筆のデータのベクトルタイルを準備するということで、2023年度の地図XMLの公共座標データ（GeoJSONに変換されて公開されているもの）を使って、ベクトルタイル（Pmtiles形式）を作成しました**。ここでは、その手順をメモしておきます。

なお、2024年度版の地図XMLについてはG空間情報センターからGeoJSONフォーマットのものが公開されていないので、今後、自分でコンバーターを使ってGeoJSONを作って作業するか、G空間情報センターでデータが公開されるのを待って作業したいと思います。


## 工夫した点
* G空間情報センターからのデータダウンロードはAPIを使い、省力でデータを入手できるようにしました。
* 今回は、Windows Subsystem for Linuxを使うことで私のWindows PCでもベクトルタイル変換ツールTippecanoeを使えるようにして作業しました。
* ベクトルタイルは最終的にPMTiles形式にすることにしました。これにより、ウェブサイトで静的にホストするだけで使えます。



## 私の環境
* Windows 11 home
* WondowsPowerShell version 5.1 (Build 22621, Revision 2506)
* WSL Ubuntu version 2
    * tippecanoe v2.53.0
    * GDAL 3.4.1, released 2021/12/27

# 手順

## Step1: 地図XML変換済み（GeoJSON）のダウンロード
まずソースデータとなる地図XMLを入手することを考えます。最終的に公共座標のものだけを使うので、G空間情報センターから公開されているデータ変換済みのものを使うと早そうです。ベクトルタイルに変換することからGeoJSON形式がよいかと考えました。

変換済みの地図XMLデータ（2023年度版geojson）の名前が *R_2023.geojsonとなっていることを利用してG空間情報センターのAPIを利用してダウンロードしてきます。

```powershell
$jsonData = (curl.exe 'https://www.geospatial.jp/ckan/api/3/action/resource_search?query=name:R_2023.geojson&limit=2500' | ConvertFrom-JSON)

for ($i=0; $i -lt $jsonData.result.results.name.length ; $i++ ){
  curl.exe -LO $jsonData.result.results.URL[$i]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/e24e0680-2989-c753-b427-dae9ea2a13b4.png)

最終的にこんな形で1,905ファイルがダウンロードできました。30時間くらいかかりました。GeoJSONは圧縮されていないので、ダウンロード時間で考えるとシェープファイルのほうが早かったかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/43bfc0fc-8d39-1491-e40c-2985e75c2af0.png)

(2024-06-22 追記)
2024年度版で同じことをすると、同一ファイル名の問題により13ファイルが上書きされてしまいます。これらについてはウェブブラウザ等で個別にダウンロードして対応してもいいと思います。
https://qiita.com/T-ubu/items/e67e4732812b52b6989b


## Step 2: WSL（Windows Subsystem for Linux） と関連ツールのインストール
これまで、私はWindows環境ではDockerでLinux環境を構築してベクトルタイル変換ツールtippecanoeを使ったり、Dockerのライセンス変更以降はRaspberryPiでベクトルタイル変換をしていたのですが、今回はWSLのUbuntuディストリビューションでtippeanoeを試してみようと思いました。

WindowsPowershellで以下を実行し、Ubuntuのディストリビューションをインストールします。

```
wsl --install
```

その後、Ubuntuを立ち上げ、rootユーザーに切り替えたのち、ベクトルタイル関係の関係ツールをインストールします。unvt/nanbanのDockerファイルを参考にして関係ツールをインストールしました。特に、felt/tippecanoeは必須です。
https://github.com/unvt/nanban/blob/master/Dockerfile


## Step 3: データ変換
1,905のGeoJSONファイルを、まずは1,905のmbtilesに変換して（tippecanoe）、そのあと1,905のmbtilesを1つのpmtilesに統合する（tile-join）という方針を立てます。

### データフォルダのマウント
Ubuntuを立ち上げ、データが入っている外付けHDDをマウントし、そこに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/7adbddf8-25b1-02b3-5610-6367dd79e8f4.png)

chizu-geojsonというディレクトリにデータを入れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/7118a3a8-6bab-e85b-2f60-96e746fe5995.png)

### GeoJSONをmbtiles形式のベクトルタイルに変換
出力用のフォルダをつくって、まずは個別のGeoJSONをmbtiles形式のベクトルタイルにしていきます。
tippecanoe の条件としては以下のようにしています。
* 地物数の上限なし
* サイズの上限なし
* ズームレベルは14~16
なお、属性の削除は最初の段階ではしませんでしたが、必要な場合は-xオプションで削除できると思います。

```bash
mkdir chizu2023-tile
for f in chizu-geojson/*.geojson; do tippecanoe -o chizu2023-tile/`basename ${f} .geojson`.mbtiles --no-feature-limit --no-tile-size-limit -Z14 -z16 -L fude:${f}; done
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/200b1548-ba2b-27df-5b36-86d84cebd239.png)

途中で空間参照について、期待される投影法と違うというメッセージがでているので、最終成果が正しいところに来るか要チェックです。もともとのデータはJGD2011でしょうし、変換後の座標は緯度経度で入っているので、これがWGS84として解釈されてもさほど大きなずれにはならないとは思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/51b70e7a-423e-1bd1-5a7a-873e9141482f.png)

合計するとだいたい17.7GBですが、1,905個のmbtilesファイルができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/224cf67b-e3c3-1652-e254-22a0a2754fa2.png)


### 多数のmbtilesを1つのPmtilesにマージ
これまでの作業で、chizu2023-tileというフォルダに1,905のmbtilesができているので、それらを1つのPMtilesデータにします。tippecanoeについてくるtile-joinというコマンドを使います。すべてのファイル名を入力するのは大変なので、fileLisという変数にファイル名を取り込んでコマンドを実行しています。

#### 最初の挑戦（失敗）
```bash
cd chizu2023-tile
fileList=$(ls *.mbtiles)
tile-join -f --no-tile-size-limit -o b.pmtiles $fileList
```
2022年のPMtilesがa.pmtilesだったので2023年はb.pmtilesにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b9651682-97a1-0532-0acc-8f4c934e4a7c.png)

特定のファイルが読み込めないようで失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/10d892d3-6f1e-bd20-f6e6-1a52b7e3bc75.png)

#### そこでまずは都道府県ごとに
都道府県ごとにつくるとうまくいくところもあります。
```bash
cd chizu2023-tile
fileList=$(ls 01*.mbtiles)
tile-join -f --no-tile-size-limit -o b-01.pmtiles $fileList
```
都道府県くらいの小さいサイズでも22番がダメか確認したところ、ファイルサイズが大きくなければうまくいった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/5b2c8297-49ac-22ea-5dbc-b20f1d05155e.png)

まずは都道府県ごとにファイルをマージします。

```
for i in $(seq -w 1 47); do fileList=$(ls ${i}*_2023.mbtiles); echo $i;tile-join -f --no-tile-size-limit -o b-${i}.pmtiles $fileList; done
```
できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/1c713df2-ee84-567d-0a9b-00d4ce381394.png)

#### 都道府県から全国を
最後に都道府県のタイルをまとめます。

```
fileList=$(ls *.pmtiles)
tile-join -f --no-tile-size-limit -o b.pmtiles $fileList
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/76b66950-6fcc-c9b6-e9a5-162b47317359.png)

朝の3時にスタートしてほっといたのですが、10時前にはできていました。１６．６ＧＢでしたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/2b66a83e-12d0-41ce-8a74-5f82d9c03d2d.png)



# 結果とまとめ
今回、2023年度の地図XMLの公共座標データを地図XMLにしました。PMTiles形式にしたところ全体で16.6 GB程度でした。
次に時間ができたらこれを使ったウェブ地図を試してみようと思います。



# 参考ページ

https://github.com/amx-project/a

https://front.geospatial.jp/

https://github.com/unvt/nanban

https://github.com/felt/tippecanoe

https://qiita.com/T-ubu/items/c1f851dfbea4b0e8d268

https://qiita.com/hfu/items/144bb4384226e7c30000