登記所備付地図データをPostgreSQLデータベースに登録し、TerraMap APIから取得できるようにしてみた

## はじめに
2023年1月に法務省より登記所備付地図データが公開され、ジオ界隈では話題になりました。そんな中、登記所備付地図データをWeb APIのデータとして提供可能かどうかを試すことになりました。結果、登記所備付地図データをPostgreSQLデータベースに登録し、TerraMap APIから取得できるようになりましたので、実際に行ったことや分かったことを共有したいと思います。

TerraMap APIとは、区画ポリゴンや統計データ等を提供するWeb APIです。
今回はTerraMap APIのデータとして登記所備付地図データを登録して、地点や範囲を指定して取得できるようにしてみました。

https://www.mapmarketing.co.jp/terramap-api?grid=qiita&utm_source=qiita.com&utm_medium=referral&utm_campaign=qiita_report_of_toukisho_in_tmapi_b25cbb3b940c6313aa53_01

TerraMap APIの使用例に関する記事もありますので、合わせて読んでいただけると理解しやすいかと思います。

https://qiita.com/yan_x/items/eebdc410deeae2f7ae12

## 登記所備付地図データについて
「登記所備付地図」とは、土地の位置・区画を明確にするため、登記所に備え付ける精度の高い地図のことであり、以前から電子データの公開を求められてきました。
2023年1月23日に公開された「登記所備付地図」の電子データを「登記所備付地図データ」と呼びます。期待が高かった表れとして、公開から数か月の間で有志の方々や企業でいろいろな試みが行われています。一部をご紹介します。

- [法務省地図XMLアダプトプロジェクト](https://github.com/amx-project)
- [amx-a on IPFS](https://amx-project.github.io/a/#14.02/36.22476/140.21762)
- [マップルラボ「MAPPLE法務局地図ビューア」について](https://labs.mapple.com/mapplexml.html#16/34.693122/135.194165)

登記所備付地図データは、不動産登記の際に付与される地番情報を持つ地図データでもあり、オープンデータとして不動産、金融、農業、都市計画、災害対応など様々な分野で活用されることが期待されております。

>参考情報
[法務省：地図データのＧ空間情報センターを介した一般公開について](https://www.moj.go.jp/MINJI/minji05_00494.html)
[法務省 登記所備付地図データ（地図XML フォーマット）の活用のヒント](https://blog.esrij.com/2023/02/10/post-48006/)
[登記所備付地図データが公開！ 土地への意識が変わるオープンデータの世界](https://news.mynavi.jp/techplus/article/20230131-2580426/)

## 行ったこと・分かったこと
TerraMap APIではPostgreSQLデータベースを用いているので、以下のような処理が必要となりました。それぞれの過程で初めてわかったこともありました。

**XML（市区町村別）　→　GeoJSON（都道府県別）　→　一時テーブル（PostgreSQL）　→　TerraMap API用テーブル（PostgreSQL）**

### XMLからGeoJSON変換
登記所備付地図データは、[G空間情報センター](https://front.geospatial.jp/moj-chizu-xml-readme/)から地図XML形式で取得することができます。またデジタル庁は地図XML形式のデータをGeoJSON形式に変換するコンバータを[GitHub上](https://github.com/JDA-DM/mojxml2geojson)に公開しています。XMLからGeoJSONに変換する際には、以下のような試み・気付きがありました。

- データの除外作業
今回は、任意座標系データ、不正なポリゴン、地区外ポリゴンを対象から除きました。

- 都道府県ごとの結合、そのばらつき
結合処理は用途によりますが、TerraMap APIは全国レベルのデータを提供しているので、GeoJSONは最終的に都道府県ごとにまとめました。まとめた結果、ポリゴン数の最小・最大・平均・合計は以下のようになり、**都道府県ごとにばらつき**があることが分かりました。またTerraMap APIでの町丁目のポリゴン数は、全国で約18万ですので、登記所備付地図データが今までに無いレベルであることは分かります。

    |  | ポリゴン数 |
    |:-|-:|
    | 最小値（大阪府） | 約28万 |
    | 最大値（北海道） | 約721万 |
    | 平均値（47都道府県）| 約227万 |
    | 合計値（47都道府県）| 約1億687万 |

### GeoJSONをPostgreSQLへ一時登録
GeoJSONをPostgreSQLへ登録することになり用いたのが、**GDALのogr2ogr**コマンドです。例えば北海道の一時テーブルを登録するには以下のようになります。なおこのコマンド例では測地系をJGD2011からWGS84へ変換しています。
```
ogr2ogr -f "PostgreSQL" PG:"host=ホスト名 port=5432 dbname=データベース名 user=ユーザ名 password=パスワード" 01_hokkaido.geojson -t_srs EPSG:4326
```
:::note warn
ファイルサイズの制限がかかる可能性があるので、GDALは最新バージョンの利用を推奨します。今回は、Windowsに最新のQGISをインストールし、同時にインストールされていたGDALを利用しました。
:::

>参考情報
[ogr2ogr — GDAL documentation](https://gdal.org/programs/ogr2ogr.html)

### TerraMap API向けテーブルへの変換
次に一時テーブルの情報をTerraMap API向けテーブルへ登録させました。この辺りの処理はプロダクトによって千差万別と思いますが、多くの地図データベースで共通するのが、「**ジオコードを決めること**」かと思います。

- 登記所備付地図データの各コードを連結してジオコードとして登録
登記所備付地図データは、**地図XMLフォーマット**で公開されてますので以下のコードが存在しており、これらを連結することでジオコードとしてみました。

| 市区町村コード | 大字コード | 丁目コード | 小字コード | 予備コード | 地番 |
|:-:|:-:|:-:|:-:|:-:|:-:|

:::note warn
このジオコードの決め方には、「市区町村コード + 大字コード + 丁目コード + 小字コード + 予備コード + 地番」を一意にする調整が必要になるので、地番に対して独自のルールで連番を振る等の方法も良いかもしれません。
:::

>参考情報
[地図XMLフォーマット](https://www.moj.go.jp/content/000116464.pdf)

### TerraMap APIへのリクエスト
TerraMap API向けテーブルへの変換が終わり、実際にTerraMap APIへ登記所備付地図データをリクエストしてみると、以下のようなことが分かりました。

- データベースからのレスポンスが遅い（解決済み）
    - 全国でも最多のポリゴン数を保持する北海道の登記所備付地図データを対象とし、中でもポリゴンが密集した帯広市でのレスポンス計測を実施しました。
    - 帯広市のある地点を中心にした半径1kmの円範囲で、町丁目ポリゴンを取得した場合は0.4秒でレスポンスされました。対して登記所備付地図データを取得すると14.4秒でレスポンスされ、36倍の時間を要していました。
    多いポリゴン数に起因することもなく、座標指定からの1ポリゴン取得に対しても13.0秒かかってしまう状態でした。

        |範囲|対象|取得ポリゴン数|レスポンス時間|
        |:-|:-|-:|-:|
        |半径1km円|町丁目|213|0.4s|
        |半径1km円|登記所備付地図データ|6,633|<font color="Red">14.4s</font>|
        |1座標指定|登記所備付地図データ|1|<font color="Red">13.0s</font>|
    
    - インデックスを確認した上でスロークエリを分析すると、**シーケンシャルスキャン**になってしまうSQLがみつかりました。これは登記所備付地図データのような**膨大な行数のテーブル同士を無条件で結合**していたことに起因しており、結合に条件を加えることで**インデックススキャン**に変えることができました。
    - 修正の結果、以下のように**約12～43倍の速度向上**を確認しました。登記所備付地図データを実際に登録してみないとみつからなかったボトルネックかもしれません。
        |範囲|対象|修正前|修正後|
        |:-|:-|-:|-:|
        |半径1km円|登記所備付地図データ|<font color="Red">14.4s</font>|1.2s|
        |1座標指定|登記所備付地図データ|<font color="Red">13.0s</font>|0.3s|

- 広い範囲でのレスポンス
TerraMap APIはポリゴンを含むデータをGeoJSON形式でレスポンスします。
登記所備付地図データは**区画ポリゴンの密度が高く**、広い範囲で取得すると数万、数十万ポリゴン以上になり、GeoJSONのダウンロードサイズも大きくなります。通信や、データを受け取ったユーザー側の処理でも負荷がかかるので、広い範囲で地図に表現したい場合は**ベクトルタイル**などが適していることが分かりました。

- ユースケースについて
登記所備付地図データを使用する業務のユースケースを考えると、狭い範囲での使用がほとんどと判断し、TerraMap APIでの提供に関しても問題無いと判断しました。


### 登記所備付地図データをMapbox地図へ表示
以下の動画は、Mapbox地図の矩形領域に対する登記所備付地図データを、TerraMap APIからGeoJSON形式で取得して表示した実例になります。
![ToukishoDataOnMapbox8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2893989/493dccb0-2f9f-ec4e-5714-0055348cd505.gif)
・登記所備付地図データ（法務省）（2023年2月にダウンロードし、加工して作成)

## まとめ
- 登記所備付地図データを実際に扱うことで、各注意点など理解が深まった。
    - 地図表示には、任意座標系データ、不正なポリゴン、地区外ポリゴンを除くが必要がある。
    - 登記所備付地図データには一意のコードは無いため、独自のジオコードを付与する必要がある。
    
- GeoJSONをPostgreSQLデータベースへ登録するには、GDALのogr2ogrコマンドが利用できる。

- TerraMap APIで登記所備付地図データを提供することができた。
    - SQLのボトルネックも解消でき、レスポンスを速くすることができた。
    - 登記所備付地図データの想定ユースケースを十分満たすことができる。

記事は以上となります。
最後まで読んでいただきまして、ありがとうございました。