2016-03-16

Esri Shapefile 形式による3Dモデルの保存

はじめに、FME がサポートする3Dモデルの概要を説明します。

立体形状 (three-dimensional shape) を取り扱うためのデータモデルには、立体の表面を表すサーフェス (Surface) と、立体が占める空間領域を表すソリッド (Solid) があり、FME では、これらをあわせて「3Dモデル」と呼んでいます。

3Dモデルを実装するためのデータ構造にはさまざまなタイプがあり、FME は、次に掲げるデータタイプを使い分けることによって、ソースデータに格納されているジオメトリの構造を可能な限り忠実にシステム内で再現します。

FMEの3Dモデル用データタイプ (データ構造の分類)

  • Surface: サーフェス (単純サーフェスと複合サーフェスの総称)
    • SimpleSurface: 単純サーフェス (次の5タイプの総称)
      • Face: 単一の多角形 (穴があるものを含む) の面
      • RectangleFace: 対角の2頂点で規定される長方形の面
      • TriangleFan: 扇状に連続した複数の三角形で形成される面
      • TriangleStrip: 蛇腹状に連続した複数の三角形で形成される面
      • Mesh: 敷き詰めるように配置された複数の多角形で形成される面
    • CompositeSurface: 複合サーフェス (複数の Surface で形成される面)
  • Solid: ソリッド (単純ソリッドと複合ソリッドの総称)
    • SimpleSolid: 単純ソリッド (次の4タイプの総称)
      • Box: 対角の2頂点で規定される直方体の空間領域
      • BRepSolid: 内部と外部の境界面を表す Surface で囲まれた空間領域
      • Extrusion: Face とそれを押し出す方向・量で定義される柱状の空間領域
      • CSGSolid: Solid 間の和、差、積で求められる空間領域 > 参考
    • CompositeSolid: 複合ソリッド (複数の Solid で形成される空間領域)
  • MultiSurface: マルチサーフェス (階層構造を持たない Surface の集合)
  • MultiSolid: マルチソリッド (階層構造を持たない Solid の集合)
  • Aggregate: 集約ジオメトリ (任意の種類のジオメトリの集合)

各タイプの説明は、データ構造、あるいはそれによって表すことができる形状の特徴を述べたものであり、厳密な定義ではありません。

Aggregate は、3Dモデルだけでなく、ベクター、ラスター、点群など、FME がサポートするあらゆる種類 (形状がないことを示す Null も含む) のジオメトリで構成することができ、階層構造を持つ場合も持たない場合もあります。

同じ種類のジオメトリのみで構成される Aggregate を Homogeneous Aggregate (均質な集約ジオメトリ)、異なる種類のジオメトリが混在する Aggregate を Heterogeneous Aggregate (非均質な集約ジオメトリ) と呼び、取り扱いが異なることがあります。

Aggregate (特に Heterogeneous Aggregate) は、文脈によっては Collection と呼ばれることもあります。

マルチジオメトリ (Multi***) は、論理構造としては「階層構造を持たない均質な集約ジオメトリ」と等価であり、原則としてそれらの間には互換性があります。

データ構造として MultiSurface と Surface、MultiSolid と Solid は区別されますが、ジオメトリの種類 (ジオメトリタイプ) としては、MultiSurface はサーフェス、MultiSolid はソリッドとして取り扱われます。また、ジオメトリの種類としてのサーフェスのみで構成される均質な集約ジオメトリ、ソリッドのみで構成される均質な集約ジオメトリも、ジオメトリの種類としては、それぞれサーフェス、ソリッドとして取り扱われます。

Esri Shapefile 形式はソリッドをサポートしませんが、ソリッド表面の形状をサーフェスに変換できれば Multipatch タイプの Shapefile 形式のファイルに保存することができ、また、そのサーフェスを形成する多角形を Polygon タイプの Shapefile 形式のファイルに保存することもできます。

ソリッドをサーフェスに変換する方法はジオメトリのデータ構造によって異なり、ソースデータセットから読み込まれたデータ構造のままで ESRISHAPE ライターが自動的に変換できるケースもあれば、いくつかのトランスフォーマーを使ってデータ構造を変換しなければならないケースもあります。

ここでは、比較的単純なケースと複雑なケースについて、ソースデータから読み込んだ3Dモデルのジオメトリを Shapefile (Multipatch, Polygon) 形式のファイルに保存するワークスペース例を掲げます。

ソースデータとして、FME Knowledge Center > Knowledge Base: BIM to GIS (Advanced) | IFC LOD 200 to LOD 3 CityGML で解説されているワークスペース例のテンプレート: BIM2GISadvcd_IFC2002CityGML_FME2015.fmwt に含まれる IFC (Industry Foundation Class STEP Files) 形式のデータを使用しました。
----------
・単純なケース: DC_Riverside_Bldg-LOD_100.ifc
・複雑なケース: DC_Riverside_Bldg-ARCH-LOD_200.ifc
----------
これらの IFC データセットには、建物を構成する部材の形状が3Dモデルのジオメトリとして保存されています。

なお、IFC データセットは、通常、複数のフィーチャータイプで構成されており、また、各フィーチャーはさまざまな属性を持っています。実務上はフィーチャータイプや属性に応じて異なる処理をしなければならないこともあるはずですが、ここでは3Dモデルのジオメトリの変換が主題なので、以下のワークスペース例では、そのことは考慮していません。

FME 2016.0.1.1 build 16177


1. 単純なケース

FMEワークスペース例














[IFC] リーダー: IFC データセットから全てのフィーチャーを読み込む。
GeometryFilter: ソリッドを抽出する。
[ESRISHAPE] ライター: Shapefile (Multipatch, Polygon) 形式のファイルに出力する。


結果: Shapefile (Polygon) 形式で保存したデータの FME Data Inspector による3D表示例
ソースデータセット: DC_Riverside_Bldg-LOD_100.ifc












このソースデータセットから読み込まれたフィーチャーは、Extrusion タイプのソリッドと Null (形状を持たないジオメトリ) で構成される非均質な集約ジオメトリによって形状のデータを保持しています。このデータ構造のままでは、ESRISHAPE ライターで Shapefile 形式のファイルに出力することはできないため、ソリッドの部分を抽出する必要があります。

GeometryFilter は、デフォルトではジオメトリのデータ構造を変更しませんが、Homogenize Collections (非均質な集約ジオメトリを均質化する) パラメーターが Yes に設定されたときは、非均質な集約ジオメトリを構成するパーツをジオメトリの種類ごとのマルチジオメトリ (Multi***) に再編成したうえで、それぞれの種類に対応するポートから出力します。この例では、MultiSolid タイプのジオメトリを持つフィーチャーが Solid ポートから出力されます。

ESRISHAPE ライターは、比較的単純なデータ構造であれば、3Dモデルのジオメトリを自動的に Shapefile 形式用のデータ構造に変換してファイルに出力します。その際、デフォルトではサーフェスもソリッドも Multipatch (サーフェス) として解釈され、ライターフィーチャータイプの Geometry パラメーターで出力先のジオメトリのタイプを shape_polygon に指定したときは Polygon に変換されます。

この例では、ソースデータセットから読み込まれたフィーチャーの形状は Extrusion で表現されており、GeometryFilter が出力するフィーチャーのジオメトリは「Extrusion タイプのソリッドのみで構成される MultiSolid」になります。これは、ESRISHAPE ライターがソリッドの表面を表す Multipatch (サーフェス), Polygon に変換できるデータ構造です。

ただし、Polygon については、これだけではソリッドが個別の面に分解され、各面がシングルパートのポリゴンとして出力されます。フィーチャー単位にまとめたマルチパートのポリゴンにしたい場合には、ジオメトリを MultiArea に変換するための処理を加える必要があります。これは、次の「複雑なケース」についても同様です。


2. 複雑なケース

FMEワークスペース例












[IFC] リーダー: IFC データセットから全てのフィーチャーを読み込む。
Counter: 各フィーチャーにユニークなIDとして連番の属性を与える。
GeometryFilter: 非均質な集約ジオメトリを再編成して Surface と Solid を抽出する。

(ブックマーク内)
Deaggregator: MultiSolid および CompositeSolid を SimpleSolid (単純ソリッド) に分解する。
CSGEvaluator: CSGSolid を MultiSolid または BRepSolid に変換する (他のタイプの単純ソリッドはそのまま)。
GeometryCoercer: 単純ソリッド、および MultiSolid を構成する単純ソリッドを CompositeSurface に変換する。

Deaggregator_2: MultiSurface および CompositeSurface を SimpleSurface に分解する。
Aggregator: SimpleSurface を元のフィーチャー (IDが等しいグループ) 単位で集約して MultiSurface を作成する。
[ESRISHAPE] ライター: Shapefile (Multipatch, Polygon) 形式のファイルに出力する。


結果: Shapefile (Polygon) 形式で保存したデータの FME Data Inspector による3D表示例
ソースデータセット: DC_Riverside_Bldg-ARCH-LOD_200.ifc
















このソースデータセットには、Surface と Solid が混在した非均質な集約ジオメトリを持つフィーチャーが含まれており、そのようなジオメトリは、ESRISHAPE ライターだけでは Shapefile 形式用の Multipatch や Polygon データ構造に変換することができません。

これを解決するため、このワークスペース例では、すべての Surface と Solid (の表面) を SimpleSurface (単純サーフェス) に分解したうえで、元のフィーチャーの形状を単純サーフェスのみで構成される MultiSurface として復元することにしました。MultiSurface ならば、ESRISHAPE ライターでファイルに出力することができます。

Counter によって各フィーチャーにID (連番) 属性を与えた後、GeometryFilter (Homogenize Collections: Yes) によって、Surface と Solid が混在した非均質な集約ジオメトリを MultiSurfice と MultiSolid に再編成したうえで、 Surface (MultiSurface を含む) と Solid (MultiSolid を含む) に分類します。

ブックマーク内は、Solid を CompositeSurface (またはCompositeSurface で構成される MultiSurface) に変換するためのデータフローです。

まず、Deaggregator によって全ての Solid を SimpleSolid (単純ソリッド) に分解します。

単純ソリッドのうち Box, BRepSolid, Extrusion は GeometryCoercer によって CompositeSurface に変換できますが、CSGSolid は、そのままでは変換できないため、CSGEvaluator を使用しました。CSGEvaluator は、入力フィーチャーのジオメトリが CSGSolid である場合に、それを MultiSolid (CSGSolid 以外の単純ソリッドで構成される) または BRepSolid に変換して Output ポートから出力し、入力フィーチャーのジオメトリが CSGSolid でない場合は、<Rejected> ポートからそのまま出力します。

そのうえで、GeometryCoercer によって CompositeSurface に変換します。ここで、CSGEvaluator による変換結果が MultiSolid になることがあるので、Geometry XQuery パラメーターによって、ジオメトリの各パーツのデータタイプとして Box, BRepSolid または Extrusion を指定しました。これにより、Box, BRepSolid, Extrusion は CompositeSurface に変換され、「CSGSolid 以外の単純ソリッドで構成される MultiSolid」は「CompositeSurface で構成される MultiSurface」に変換されることになります。

次の Deaggregator_2 によって、はじめから Surface だったものと、ブックマーク内のデータフローによって Solid から変換された Surface の全てを、一旦 SimpleSurface (単純サーフェス) に分解し、最後に、Aggregator によってIDごとに集約することにより、元のフィーチャーの形状を MultiSurface として復元しました。

0 件のコメント:

コメントを投稿