先日、国土交通省が主導する3D都市モデルの整備プロジェクト「Project PLATEAU」で、東京23区のモデルデータが公開されました。

大本のデータは CityGML という形式なのですが、格子状に分割された FBX 形式のファイルも公開されています。

それなりのデータ量なので、普段の取り回しを考えて分割されているのだと思いますが、折角なので23区まとめて見れるように Blender を使って結合してみました。

ここでは覚書として結合まで手順を記載します。

FBXファイルをダウンロードする

FBX ファイルは PLATEAU のサイトではなく、G空間情報センターの 3D都市モデル(Project PLATEAU)ポータルサイト - データセット ページからダウンロードできます。

データファイルは一辺10kmごとのファイルに分かれているので、すべてダウンロードします。

必要なファイルを取り出す

1つのデータファイルは下記のような構成になっています。

533926.zip/
 ├ brid/ <橋梁モデル>
 ├ dem/  <地面モデル>
 ├ LOD1/ <LOD1モデル>
 └ LOD2/ <LOD2モデル>

今回は23区全域の建物データが含まれる LOD1 と地面データの dem を使用しました。

ファイルを結合する

FBX ファイルはさらに細かく分割されているので、今回は Blender を使用してファイルを結合しました。

最初は安直に GUI ですべてインポートしてみたのですが、メモリ不足なのか途中で失敗してしまいました。

そこで、Blender のバックグラウンドモードを利用して、バッチ処理で結合を行っています。

正直、Blender で使用する Python については、ほとんど触ったことが無かったのですが、大変ありがたいことに、ほぼ同じことをするスクリプトが公開されていたのでほとんどそのまま利用させてもらっています。

[自分用メモ] Blender Python を使ったバッチ処理まとめ

なお、 LOD1 のデータは建物ごとにメッシュが分かれており、そのままだと後半はインポートに相当時間がかかるようになってしまったので、1ファイルインポートするごとにメッシュの結合処理も行いました。

メッシュ結合処理は、福本(ホロモン)さんが作成されたスクリプトを、これまたほぼ流用させてもらっています。

Blenderで利用可能なpythonスクリプトを作る その3(オブジェクトの結合、表示/非表示) - MRが楽しい

スクリプトは上の記事を見れば、問題ないかと思いますが、一応、使ったスクリプトを Gist に貼っておきます。

merge.py

結合処理を実行する

スクリプトが出来ればそれを実行します。

どうも Blender は1スレッドしか使用しないようなので、今回は PowerShell スクリプトの ForEach-Object -Parallel を使って4スレッド同時に処理するようにしました。

Blender同時実行中
Blender同時実行中

なお、スレッド数はCPUのスレッド数より、メモリ消費量(1スレッドあたり4~8GBくらい消費する模様)を見て決めた(当PCは32GB)ので、もっと積んでいれば増やせるかと思います。

CPU:Ryzen 3950X、メモリ:32GB の環境で概ね8時間ほど掛かりました。

今回は後々の取り回しを考えて、10kmの二次メッシュ単位で処理しましたが、FBX のファイル数が場所によって大きく異なるので、1回辺りの単位をうまく調整すればもっと早くすることもできると思います。

ただ、インポートするモデルの数が増えると、今度はメモリ消費・インポート時間が増えるので、最初にまとめる単位を大きくしすぎないように注意が必要です。

二次メッシュ単位で結合した後は、同じ要領でそれらと地面データを一つに結合して完成です。

公開されているデータの中では、もっとも軽い LOD1 ですが、それでも 800MB、4850万ポリゴンとなかなかの重さになります。

表示する

それなりのスペックのPCであれば何とか表示できるかと思いますが、折角なのでクラウドでレンダリング処理を行う Azure Remote Rendering (ARR)が組み込まれた mixpace Remote Rendering (mRR) (※宣伝です)を使って HoloLens 2 で表示してみました。

流石に2億ポリゴンのモデルも問題ない ARR を使えばサクサク表示できます。


※記載の3D都市モデルは、国土交通省の Project PLATEAU で公開されてるFBXファイルとそれを結合したファイルを使用しています