クラウドネイティブなPLATEAU

# はじめに

早いものでもう今年も終わりに近づきましたね。皆様大変お世話になりました。

今年の数あるGeospatialな話題の中でも群を抜いて光っているのは、クラウドネイティブの動きとDuckDBではないかと、空間クエリ好きな私は個人的に思っております。クラウドネイティブなフォーマットに関するガイドは、[Cloud-Optimized Geospatial Formats Guide](https://guide.cloudnativegeo.org/)にお願いするとして、ここでは、私の働いているPSS社内プロジェクトとして、Plateauの建物CityGMLをGeoParquetとGeoPackageにして配布しようとしている中身をお伝えします。

やりたいことは、Plateauのデータを空間解析や表示に気軽に使えるようにしたいということです。下の方には、クリスマスプレゼントもありますのでお楽しみに！

## GeoParquetについて
GeoParquetは、ベクタデータを効率的に保存・処理するためのファイルフォーマットです。オープンソースの列指向ファイルフォーマットであるParquetを基にしています。Parquetは大量のデータを効率的に圧縮し、クエリのパフォーマンスを向上させることができます。私の経験だと、GeoJSONやShapefileに比べても大幅にファイルサイズを縮小できます。バージョン1.0で、まだファイルフォーマットとして空間インデックスをサポートしていませんが、将来される予定で、そうなれば最強フォーマットだと思います。いろんなベクタファイルをAmazon S3やGoogle CloudStorageにおいておくだけで、DuckDBでローカルからクエリができたりします。すごいです。
![geoparquet_layout.png](https://guide.cloudnativegeo.org/images/geoparquet_layout.png)
[図の引用：Cloud-Optimized Geospatial Formats Guide](https://guide.cloudnativegeo.org/)

## Plateau建物のCityGMLデータをGeoParquetにする
Plateau建物データはもちろん3Dで作られており、GeoParquetは2Dにしか対応していないので、今作っているデータは、いわゆるフットプリントポリゴンと呼ばれる2Dのデータです。CityGMLの中では、LOD0とも呼ばれています。PlateauのCityGMLのデータを見ると、いずれのデータにもLOD0がありますので、流れとしては、CityGMLからLOD0のジオメトリとユニークIDであるgml_idを取り出しておいて、そこに様々な属性をつけるという流れになります。

ここで大変なのが、Plateauの建物データの属性スキーマは、各市町村ごとに異なる可能性があるということです。属性としては、コアとして共通している部分と、各市町村ごとに拡張できる部分からできているので。PlateauのCityGMLの仕様は、[製品仕様書という文章](https://www.mlit.go.jp/plateaudocument/)にまとめられていますので、原典はそちらを参照してください。なかなかのボリュームになっています。

なのでデータとしては、LOD0のポリゴンと市町村ごとに変わらない属性、それから発生させたセントロイド、そして各種の属性テーブルという構成にしました。GeoParquetでは、それぞれ別のファイルで、ジオメトリを含むデータはGeoParquet、ジオメトリがないテーブルはParquetとしました。GeoPackageの方は、すべてのデータが一つのファイルに含まれていますので、GISユーザには取り扱いが楽だと思います。ちなみに最新のQGISではGeoParquetはドラッグアンドドロップだけで読み込むことができます。
![2023-11-29_16-54-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59906/d25d98d0-73e2-38bd-9853-99976448eb13.png)

それから、2Dのデータとしても、せっかく3Dのデータから作るので、高さの情報を3Dジオメトリから取得して格納しました。元々のCityGMLの中にも建物の高さ情報は含まれていますが、3Dジオメトリから、高さの最小、最大値、そしてその差分を計算しました。ついでに、XY方向にも最大、最小値を計算し（緯度経度で）、ポリゴンの面積も計算しました。なので、属性でいろんなことができると思います。表１のcal_で始まる属性がFMEで取得、計算した計測データです。また、セントロイドのH3,レベル15のインデックスもつけているので、色々楽しめると思います。

表１．2D建物データのスキーマ
|attribute_name                 |type     |sample data                                 |
|-------------------------------|---------|--------------------------------------------|
|citygml_feature_type           |char(32) |NULL                                        |
|citygml_geometry_name          |char(32) |lod0RoofEdge                                |
|source_filename                |char(32) |53392546_bldg_6697_2_op.gml                 |
|gml_id                         |char(64) |bldg_fc50c7d9-76ac-4576-bfbd-f37c74410928   |
|building_id                    |char(32) |13111-bldg-524                              |
|branch_id                      |smallint |NULL                                        |
|part_id                        |smallint |NULL                                        |
|prefecture                     |char(5)  |東京都                                         |
|prefecture_code                |char(2)  |13                                          |
|city                           |char(32) |東京都大田区                                      |
|city_code                      |char(5)  |13111                                       |
|description                    |char(64) |NULL                                        |
|name                           |char(64) |六郷土手郵便局                                     |
|address                        |char(64) |東京都大田区東六郷三丁目                                |
|creation_date                  |date     |20230322                                    |
|termination_date               |date     |NULL                                        |
|class                          |char(32) |NULL                                        |
|class_code                     |smallint |NULL                                        |
|usage_desc                     |char(128)|''                                          |
|usage_code                     |smallint |NULL                                        |
|year_of_construction           |smallint |NULL                                        |
|year_of_demolition             |smallint |NULL                                        |
|roof_type                      |char(32) |NULL                                        |
|roof_type_code                 |smallint |NULL                                        |
|measured_height                |double   |8.3                                         |
|measured_height_uom            |char(8)  |m                                           |
|storeys_above_ground           |smallint |NULL                                        |
|storeys_below_ground           |smallint |NULL                                        |
|storey_heights_above_ground    |char(256)|NULL                                        |
|storey_heights_above_ground_uom|char(8)  |NULL                                        |
|storey_heights_below_ground    |char(64) |NULL                                        |
|storey_heights_below_ground_uom|char(8)  |NULL                                        |
|lod                            |text(200)|lod0                                        |
|gml_parent_id                  |text     |fme-gen-4b5ee981-8b92-4462-b93f-037b29cf0ab5|
|cal_area_m2                    |double   |40.445643597318096                          |
|cal_xmin                       |double   |139.71218932484814                          |
|cal_xmax                       |double   |139.71218932484814                          |
|cal_ymin                       |double   |35.54154939251641                           |
|cal_ymax                       |double   |35.54160749301028                           |
|cal_zmin_m                     |double   |2.406                                       |
|cal_zmax_m                     |double   |9.141                                       |
|cal_height_m                   |double   |6.734999999999999                           |
|h3_level15_index               |text     |644847779062396846                          |


データの変換は、FME Formを使いました。元々[PLATEAU2 to FGDB 建築物](https://hub.safe.com/publishers/pacific-spatial-solutions/templates/plateau2-to-fgdb)というワークスペースを配っているのですが、これを元に、2022の日本全国のデータに対応するように作り直して作業しています。2023/12/17現在で102都市の変換が完了しています。
![2023-12-17_17-53-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59906/ae4951b8-bc25-8801-c5df-59ab3f9fbe03.png)


## データを配る
実は、以前にもPlateauのデータをGeoPackageにするプロジェクトをやったのですが、欲しかった属性が抜けていたり、余計な属性が入ってしまったりしていて、まだまだ改良の余地が残っていました。なのでもうすぐ公開するデータは、以前抜けていた、name属性、address属性なども含めた、できる限りすべての属性を含め、更に独自にジオメトリから計算した高さなどを含めた完全版ということになります。

データが全て揃ったら、[Github](https://github.com/pacificspatial/flateau)だけではなく、[Source Cooperative](https://source.coop/)からも配布する予定です。

今回は、クリスマスも間近ということで、東京23区のデータをダウンロードできるようにしました。メリークリスマス！

- [Plateau2022 東京23区ポリゴンデータ（GeoParquet形式, 510.9 MB）](https://flateau.s3.ap-northeast-1.amazonaws.com/data/plateau/tokyo23/2022/buildings/20231217/geoparquet/13100_tokyo23_2022_building_lod0.parquet)
- [Plateau2022 東京23区ポリゴンセントロイドデータ（GeoParquet形式, 323.4 MB）](https://flateau.s3.ap-northeast-1.amazonaws.com/data/plateau/tokyo23/2022/buildings/20231217/geoparquet/13100_tokyo23_2022_building_centroid_lod0.parquet)
- [Plateau2022 東京23区河川浸水想定区域（Parquet形式, 116.7 MB, gml_idでJOIN可能）](https://flateau.s3.ap-northeast-1.amazonaws.com/data/plateau/tokyo23/2022/buildings/20231217/parquet/13100_tokyo23_2022_building_risk_flooding.parquet)
- [Plateau2022 東京23区津波浸水想定区域（Parquet形式, 2.6 MB, gml_idでJOIN可能）](https://flateau.s3.ap-northeast-1.amazonaws.com/data/plateau/tokyo23/2022/buildings/20231217/parquet/13100_tokyo23_2022_building_risk_high_tide.parquet)

### ライセンス
(c) Pacific Spatial Solutions, inc. 2023 CC-BY. This data is made available under a Creative Commons Attribution 4.0 International [license](https://creativecommons.org/licenses/by/4.0/).

データ出典：国土交通省PLATEAU 「3D都市モデル（Project PLATEAU）」（国土交通省）(https://www.geospatial.jp/ckan/dataset/plateau） をもとにジオメトリから各種統計データを算出しオンラインまたはGISソフトウェアで利用しやすいフォーマットに変換。 Pacific Spatial Solutions株式会社 作成

## データを使う
GeoParquetのデータをDuckDBで使う方法については、今年開いた[Spatail Data Scienceブートキャンプのノート](https://github.com/pacificspatial/flateau/blob/main/notebook/sdsc_bootcamp_tokyo.ipynb)があるので、参考にしてください。このノートはColabで動きますが、データソースは古いものなので、これを参考にして、新しいデータでいろいろ試してみてください。

## 謝辞
アドベントカレンダーを作ってくださった青山学院大学の古橋先生ありがとうございます。このプロジェクトは、PSSの飯島さん、奥秋さんのお力を借りて進めております。ありがとうございます！