tpc04-2

TOPIC 4|CityGMLから各種データ形式へのコンバート[2/2]|FME Formでのワークベンチ改造例、変換方法

CityGML形式の3D都市モデルを使いやすい形式にコンバートして利用する方法を説明します。FME Formでは、サンプルのワークベンチを改造することで、さまざまな変換ができます。また、FME Form以外の変換方法も紹介します。

Share

【目次】

4.3 ワークベンチの改造例

 4.3.1 座標系の変更

 4.3.2 LOD2の建物もLOD1に含める

 4.3.3 特定のオブジェクトだけを取り出す

 4.3.4 指定した経緯度の範囲で切り出す

 4.3.5 建築物データのテクスチャを再構成した軽量FBX/OBJを作る

4.4 FME Form以外の変換方法

 4.4.1 plateaupy

 4.4.2 PlateauCityGml

 4.4.3 PLATEAU SDK

4.5 まとめ

4.3 _ ワークベンチの改造例

サンプルのワークベンチを改造することで、さまざまな変換ができます。いくつかの改造例を紹介します。

4.3.1 _ 座標系の変更

まず確認したいのは、変換後の座標系です。サンプルで提供されているワークベンチでは、平面直角座標系の9系を使って、メートル単位で変換しています。

9系は首都圏を含む座標系なので、ほかの地域であれば、適した系に変換する必要があります。例えば大阪や京都などであれば6系を、北海道であれば11~13系を使うなどします(詳細は、【3D都市モデルデータの基本】「3.5 座標と高さの取り扱い」を参照)。

座標系の変換をしているのは、ワークベンチの「座標変換」という枠で囲まれた「CsmapReprojector」「CsmapReprojector_2」「CsmapReprojector_3」の3つのトランスフォーマーです。座標系を変更するには、これら3つすべてのプロパティを変更します。プロパティの設定画面は、右クリックして[Properties]を選択すると開けます。

図 4-23 CsmapReprojectorのプロパティを開く

座標系の設定は、プロパティ画面の[Destination Coordinate System]で選択します。初期状態では、平面直角座標系の9系を示す「JGD2011-09_FME」が選択されています。プルダウンで[More Coordinate Systems]を選択すると一覧が表示されるので、変更したい座標系を選択してください。

「CsmapReprojector」「CsmapReprojector_2」「CsmapReprojector_3」は、それぞれ、LOD2、LOD1、地形の変換に使っているので、3つすべての設定を変更してください。

図 4-24 Definition Coordinate Systemを変更する
図 4-25 座標圏を選択する

4.3.2 _ LOD2の建物もLOD1に含める

データを軽くしたいなどの理由で、LOD2の建物であっても、あえてLOD1のデータを抜き出したいこともあります。

サンプルのワークベンチでは、先頭のGeometryPartExtractorトランスフォーマーで、LOD2かどうかを判断し、LOD2として存在しないものだけをLOD1で変換しています。

GeometryPartExtractorはジオメトリXQueryという文を使って抽出や加工をするトランスフォーマーです。条件が成り立ったときは、変換後のデータを「Extracted」、変換前のデータを「Remaining」として出力します。そして、成り立っていないときは「Untouched」として出力します。

図 4-26 GeometryPartExtractorでLOD2のデータを持つ地物かどうかを判定している

LOD2のデータを持つ地物であってもLOD1の出力をしたいなら、Remaining(LOD2が存在する場合の元データ)を、LOD1を処理している部分につなげます。こうすれば、LOD2が含まれる地域であっても、LOD1のデータが含まれるようになります。

図 4-27 Remainingからの線をLOD1のほうにもつなぐ

実際に変換すると、最初のLOD1の変換例では抜けていた建物が含まれるようになります。

図 4-28 LOD2を持つ建物もLOD1として変換された

4.3.3 _ 特定のオブジェクトだけを取り出す

 CityGMLファイルはサイズが大きく、とくにLOD2のデータは、すべてを変換すると、ソフトウェアで扱えないほどの量になることがあります。そこで、一部のデータだけを切り出す方法を、いくつか紹介します。

特定のオブジェクトだけを取り出す

まずは、特定のオブジェクトのデータだけを取り出す方法を説明します。ここでは、東京都庁第一庁舎のLOD2のデータだけを出力するようにしてみます。

【メモ】

以下の手順では、LOD2の処理しか変更しないので、LOD1や地形の出力の動作は変わりません。欲しいのはLOD2のデータだけなので、実行する際は、地形出力のリーダーとライターは無効に、LOD1出力のライターは無効にして実行するとよいでしょう(無効とは、右クリックして[Disable Input]を選択することです。詳細は4.2.2内のコラム「地形の変換をしない」を参照)。

[1]地物IDを調べる

まずは対象のオブジェクトの地物IDを調べておきます。QGISやArcGISなどのGISソフトウェアでCityGMLファイルを開いて建物名を検索して地物IDを確認する、もしくは、PLATEAU VIEWなどで開いて地物IDを調べておきます。その他の方法として、テキストエディタでCityGMLファイルを開いて文字列検索して調べる方法もあります(QGISやArcGISについては、次のトピック【GISで活用する】で説明します)。

操作が簡単なのは、PLATEAU VIEWで確認する方法です。しかし、オープンデータは、しばしば更新され、更新に伴い、地物IDが変わることがあります。つまり同じオブジェクトであっても、ダウンロードした都市モデルの地物IDとPLATEAU VIEWの地物IDが異なる可能性があるのでご留意ください。

図 4-29 PLATEAU VIEWで地物IDを確認する

[2]Testerを追加する

[Transformer Gallery]からTesterトランスフォーマーを追加します。一番下の検索ボックスに「tester」と入力すると、testerという文字列を含むトランスフォーマーに絞られるので、それをワークベンチ上にドラッグ&ドロップします。

Testerトランスフォーマーは、PassedとFailedの2つの出力を持ち、設定する条件が成り立ったときにはPassed側から、成り立っていないときはFailed側にフローが分かれるという動作をします。

図 4-30 Testerを配置する

[3]線をつなぎ直す

CsmapReprojectorの直前に、Testerを挿入します。そのためにはCsmapReprojectorに接続されている矢印をマウスでドラッグしてTesterの入力につなぎ直します。そしてPassedを、いまつながっていたところにつなぎ直します。これで、CsmapReprojectorの処理の前にTesterの処理が入るようになります。

図 4-31 CsmapReprojectorの前にTesterで判定できるようにする

[4]条件を指定する

配置したTesterトランスフォーマーの歯車のアイコンをクリックします。すると、設定画面が開きます。

設定画面のTest Clausesに条件を指定します。条件は、「Left Value(左辺)」「Operator(比較方法)」「Right Value(右辺)」で指定します。

ここでは地物IDが特定のものかどうかを確認したいので、Left Valueには、地物IDが含まれている属性を選択します。[...]をクリックすると、いくつかの選択肢から選ぶ画面が表示されます。

図 4-32 [Left Value]の[...]をクリックして、左辺の設定画面を開く

属性は、[FME Feature Attributes]にあります。クリックして展開すると、地物IDを示す「gml_id」があるので、ダブルクリックします。すると、その値を示す「@Value(gml_id)」が自動入力されるので、[OK]ボタンをクリックします。

図 4-33 gml_idを選択する

次にOperatorとRight Valueを設定します。

Operatorには、等しいことを示す「=」を選択します。そして、Right Valueには、あらかじめ調べておいた「BLD_ffc04e24-60a0-48ce-8b20-93a51c160bb3」と入力し、[OK]をクリックします。

図 4-34 OperatorとRight Value(右辺)を設定する

再度実行して、データ変換します。すると、東京都庁第一庁舎だけがLOD2のデータとして取得できます。このデータは小さいため、さまざまなソフトウェアで扱えます。例えば、Windows付属の3Dビューアーでも、次のように表示できます。

図 4-35 3Dビューアーで、変換された東京都庁第一庁舎を確認したところ

ここでは例として、地物IDでの特定をしましたが、オブジェクトにはさまざまな属性があります。条件を組み合わせて複数のオブジェクトを選択するのはもちろん、「高さが何メートル以上のものだけにする」など、さまざまな条件に使えます。またAreaCalculatorトランスフォーマーを使えば、面積を求めて、特定の面積以下のものは除外するというやり方もできます。

コラム ローカル座標系を使う

ひとつのオブジェクトだけを変換するときは、そのオブジェクトの座標が平面直角座標の原点ではなく、オブジェクトの中心点を原点としたほうが、都合がよいことがあります。

そのようなときは、ライターの[Move to Local Coordinate System]を[YES]に設定します。

図 4-36 [Move to Local Coordinate System]を[YES]にするとオブジェクトの原点が中心点となる

特定のオブジェクトだけLOD2、残りはLOD1として混ぜる

いまは特定のオブジェクトだけをひとつLOD2のデータとして取り出しましたが、「そのオブジェクトだけLOD2、残りはLOD1」というように混ぜて出力することもできます。

その方法は簡単で、「いま作成した特定のオブジェクトだけのLOD2出力」と、「そのオブジェクトを除外したLOD1出力」を混ぜて出力するだけです。

[1]Testerを複製する

前の手順で作成したTesterを複製します。複製するには、右クリックして、[Duplicate]を選択します。

図 4-37 Testerを複製する

[2]LOD1を持つLOD2の地物の出力をつなぐ

Testerが複製され、Tester_2ができます。ドラッグしてLOD1変換処理している近くに移動します。

そしてGeometoryPartExtractorのRemainingからTest_2につなぎます。これは「4.3.2 LOD2の建物もLOD1に含める」で説明したように、LOD2のデータを持つオブジェクトのLOD1のデータが含まれています。Test_2は、Testを複製したもので、その条件は「特定の地物IDを持つか」です。この出力の「Failed」には「特定の地物IDを持たないもの」が出力されますから、これを取り出してマージします。

図 4-38 LOD2を持つ地物のLOD1データのうち、その地物IDを持たないものをマージする

[3]LOD1の出力をつなぐ

LOD1の出力をつなぎます。

図 4-39 LOD1の出力をつなぐ

これで完成です。改めて全体図を次に示します。

図 4-40 特定の地物をLOD2、それ以外をLOD1で構成するフローの全体図

実行すると、都庁第一庁舎だけがLOD2、それ以外がLOD1で構成されることがわかります。なお図 4-41でテクスチャが貼られていないのは3Dビューアーの問題であり、FBX Reviewなどで見れば、きちんとテクスチャも表示されます(図4-42)。

図 4-41 都庁第一庁舎だけがLOD2、それ以外がLOD1になった
図 4-42 FBX Reviewで確認したところ

4.3.4 _ 指定した緯度・経度の範囲で切り出す

緯度・経度の範囲内に含まれるものだけを切り出すこともできます。その方法は、建物なのか地形なのかによって異なります。

建物の場合

建物の場合は、指定した範囲に含まれる地物だけを取り出すようにします。これはCityGMLのリーダーで指定できるので簡単です。次のように設定します。

[1]範囲の経緯度を調べる

まずは、切り出したい範囲の経緯度を調べます。地図上で経緯度がわかればよいので、さまざまな方法があります。

例えば、地理院地図(https://maps.gsi.go.jp/)を使う方法があります。地理院地図では、ウィンドウ中央に十字のマークが表示され、その詳細情報がウィンドウの下に表示されます。初期画面では、画面の下に標高が表示されますが、何度か矢印のマークをクリックすると、経緯度が表示されるので、その値を確認するとよいでしょう。

図 4-43 地図上で経緯度を確認する

[2]リーダーのSearch Envelopeの設定を開く

[Navigator]から[Input:bldg[CITYGML]]の左の[>]をクリックして展開し、[Search Envelope]の下の[Minimum X:]をダブルクリックして開きます。

【メモ】

[Minimum X]の代わりに[Minimum Y]や[Maximum X:]など、ほかの項目をダブルクリックする操作でもかまいません。その場合も同じように設定画面が表示されます。

図 4-44 Search Envelopeを開く

[3]範囲を設定する

範囲を設定するダイアログボックスが表示されます。[Use Search Envelope]にチェックを付け、切り出したい経緯度を入力します。

・Minimum X      : X座標の最小値(西端の経度)

・Minimum Y      : Y座標の最小値(南端の緯度)

・Maximum X      : X座標の最大値(東端の経度)

・Maximum Y      : Y座標の最大値(北端の経度)

・Clip to Search Envelope チェックを付けると、この境界線にまたがる地物も除外する

 例えば図 4-45のような範囲に限定したいのであれば、図 4-46のように入力します。

図 4-45 範囲指定の例
図 4-46 実際の入力値

あとの変換処理は同じです。実際に実行して確認すると、その範囲の建物だけが取り出されているのがわかるはずです。

図 4-47 特定範囲を取り出した例

地形データの場合

地形データ(dem)の場合は、その範囲でサーフェース(ポリゴンの形状)を切る必要があるため、処理が複雑で時間もかかります。

そのためのサンプルとして「trim_dem_surface.fmwt」が提供されています。使い方については、PLATEAUが提供している「3D都市モデルのデータ変換マニュアル」を参照ください。

4.3.5 _ 建築物データのテクスチャを再構成した軽量FBX/OBJを作る

merge_bldg_surface.fmwtは、建築物ごとに、サーフェスとテクスチャをグループ化するワークベンチです。このワークベンチで変換したFBX/OBJファイルは、「4.2.2 FBXに変換する例」で説明したcitygml2fbx.fmwtで変換したものに比べて、3Dソフトウェアにおけるパフォーマンスが向上します。また変換後のFBX/OBJデータにおいて、建物物オブジェクトひとつひとつがグループ化されているため、建物単位での処理もしやすくなります。また、この処理により元のCityGMLデータではテクスチャが付与されていないGroundSurfaceに単色のPNG画像が付与され、テクスチャ構造が最適化されます。これにより、FBX/OBJに変換する際にテクスチャが欠ける問題を解決できます。

【メモ】

merge_bldg_surface.fmwtは、LOD2のテクスチャ付き建築物モデルだけが対象です。

入力パラメータの設定

merge_bldg_surface.fmwtでは、CityGMLファイルを読み込み、それをFBX形式とOBJ形式に変換できます。

[Navigator]ウィンドウの[Input:bldg[CITYGML]]で、CityGMLファイルを選択します。そして[Ouput:bldg[FBX]]と[Output:bldg[OBJ]]で、それぞれ変換後のFBX形式ファイルとOBJ形式ファイルの保存先フォルダを指定します。右クリックして[Disable]を選べば、その変換を無効化することもできます。

ファイルやフォルダの設定は、「4.2.2 FBXに変換する例」と同じです。ワークベンチの後ろのほうには座標変換のCsmapReprojectorがあります。既定では平面直角座標の9系なので、対象の地域によって適宜変更してください(「4.3.1 座標系の変更」を参照)。

図4-48 パラメータを設定する

実行

パラメータを設定したら、[RUN]ボタンをクリックして、ワークベンチを実行します。すると指定したフォルダにFBX形式ファイルとOBJ形式ファイルならびにマージされたテクスチャが、それぞれ作られます。変換後のファイルをAutodesk FBX Reviewで開いた例を図4-49に示します。

図4-49 変換例

4.4 _ FME Form以外の変換方法

CityGMLから各種ファイル形式に変換するコンバータは、ほかにもあります。いくつか紹介します。

4.4.1 _ plateaupy

2020年度の「東京23区から新しい世界を創るアイデアソン/ハッカソン」(レポート:https://www.mlit.go.jp/plateau/perspective/06_report_hackathon/)で開発されたPython版のパーサおよびビューア用のモジュールです。

建物、地形、道路のデータをパースしたり表示したりする機能があります。Pythonのモジュールとして提供されているため、プログラムでデータを分析したり、各種加工処理をしたい場面で便利です。

【plateaupy】
https://github.com/AcculusSasao/plateaupy

4.4.2 _ PlateauCityGml

CityGML形式をOBJ形式に変換するツールです。G空間情報センターで提供されているOBJと比べて、次の点が異なります。とくに建物が1つずつ分かれるため、ゲームなどで利用するときに使いやすいかたちで扱えます。

・建物が1つずつ分かれる

・Microsoft Office製品にドラッグ&ドロップしたとき、テクスチャ付きで表示できる

・変換後の長さの単位はメートル

・左手系のY-up座標に変換済み

【PlateauCityGml】
https://github.com/ksasao/PlateauCityGmlSharp

4.4.3 _ PLATEAU SDK

PLATEAUの3D都市モデルデータをUnity やUnreal Engineで利用する場合は、PLATEAU SDKを使ってCityGMLデータをインポートできます

詳しくは、【PLATEAU SDKでの活用】を参照してください。

4.5 _ まとめ

・FME Formを使うと、CityGMLから各種形式にデータ変換できます。サンプルのワークベンチを改良して使うのが簡単です。

・サンプルのワークベンチを使う場合は、変換後の座標系に注意してください。例えば、東京23区のモデルは平面直角座標の9系を採用しているため、原点は千葉県になります(東京23区のモデルは原点から離れた位置に配置されます)。

・サンプルのワークベンチは、LOD2、LOD1、地形の3つを変換します。LOD2のデータがある地物は、LOD2が優先される(LOD1は処理されない)ので注意してください。必要ならワークベンチを編集します(「4.3.2 LOD2の建物もLOD1に含める」を参照)。

・Testトランスフォーマーを使うと、建物IDなど、条件に合致する(もしくは合致しない)ものだけを取得できます(「4.3.3  特定のオブジェクトだけを取り出す」)。

・CityGMLのリーダーのSearch Envelopeを指定すると、特定の範囲だけの地物を抽出できます(「4.3.4 指定した経緯度の範囲で切り出す」)。

・LOD2の建築物データをFBX/OBJ形式で扱うときは、merge_bldg_surface.fmwtを使うとパフォーマンスが向上します。

・FME Form以外にも、さまざまな変換ツールがあります。用途に応じて、適切なものを選びます。

【文】

大澤文孝

【監修】

於保俊(株式会社ホロラボ)
アクセンチュア株式会社
Pacific Spatial Solutions 株式会社