🏙️

CityGML 2.0 の Building の階層構造を疑似コード的に説明してみる(頭の整理)

2023/11/16に公開

CityGML 2.0 の数ある都市オブジェクトのうち、 Buildingに類するもの (Building, Bridge, Tunnel など) は他の種類の都市オブジェクト (例: Road) よりもだいぶ複雑な構造をしています。したがって Building を理解できれば他の都市オブジェクトは容易に理解できます。

(なお最新版の CityGML 3.0 では概念や構造が色々と整理されているのですが、ここでは日本の PLATEAU などで現状使われている CityGML 2.0 で見ていきます。)

この記事では、Building の構造(本来はXMLで表現されるもの)を「疑似コード」的に表現して説明してみます。ちなみに親子関係を図にすると以下のようになるでしょうか。

ここからは、トップレベルの Building を基点に、疑似コードっぽく表現してみます。

Building

struct Building {
    // 各都市オブジェクトが持つ属性値は今回の説明では省略する
    ...attribs

    // geometry
    // LoD0 から LoD4 まで、それぞれ異なるジオメトリをもてる
    //
    // LoD2以上において、境界面が、壁や屋根などのセマンティックスに分けられる場合は、
    // ここで重複してそれらのジオメトリを定義するのではなく、
    // それらのセマンティックスで定義されたジオメトリを xlink で参照しなければならない。
    lod0Geom: Geometry
    lod1Geom: Geometry
    lod2Boundary: Geometry
    lod3Boundary: Geometry
    lod4Boundary: Geometry

    // children
    // _AbstractBuilding は以下の子オブジェクトを持てる
    boundary: Vec<BoundarySurface>
    buildingParts: Vec<BuildingPart>
    installations: Vec<BuildingInstallation>
    intInstallations: Vec<BuildingInstallation>
    rooms: Vec<Rooms>
}

BuildingPart

Building は複数の BuildingPart に分けて構成され得ます(A棟とB棟とか、商業施設部分とオフィスタワー部分とか)。そして BuildingPart もさらに子として BuildingPart をもつことができるので、建築物を何階層にでも部分分割していけます。(ただし日本の PLATEAU の仕様では1階層の分割までに制限されている、はず)

struct BuildingPart {
    ...attribs

    // geometry
    lod0Geom: Geometry
    lod1Geom: Geometry
    lod2Boundary: Geometry
    lod3Boundary: Geometry
    lod4Boundary: Geometry

    // children
    // _AbstractBuilding は以下の子オブジェクトを持てる
    boundary: Vec<BoundarySurface>
    buildingParts: Vec<BuildingPart>
    installations: Vec<BuildingInstallation>
    intInstallations: Vec<BuildingInstallation>
    rooms: Vec<Rooms>
}

XMLスキーマ上では、Building と BuildingPart は、 _AbstractBuilding を継承しており、BuildingPart は Building とほぼ同じものを表現できます。

屋外の柱などの付属構造物

struct BulidingInstallation {
    ...attribs

    // geometry
    lod2Geom: Geometry
    lod3Geom: Geometry
    lod4Geom: Geometry

    // children
    boundary: Vec<BoundarySurface>
}

屋内の柱などの付属構造物

struct IntBuildingInstallation {
    ...attribs

    // geometry
    // 屋内なので必然的に LOD4 のみ
    lod4Geom: Geometry

    // children
    boundary: Vec<BoundarySurface>
}

部屋

struct Room {
    ...attribs

    // geometry
    // 「部屋」は屋内なので LOD4 のみ
    lod4Boundary: Geometry

    // children
    boundary: Vec<BoundarySurface>,
    intInstallations: Vec<IntBuildingInstallation>,
    furnitures: Vec<BuildingFurniture>,
}

部屋の中の家具など

struct BuildingFurniture {
    ...attribs

    // geometry
    lod4Geom: Geometry
}

外壁・内壁などの境界面

外壁・内壁などの境界面 (_BoundarySurface) は以下の9種類

enum BoundarySurface {
    // 屋外
    RoofSurface(RoofSurface);
    GroundSurface(GroundSurface);
    WallSurface(WallSurface);
    OuterFloorSurface(OuterFloorSurface);
    OuterCeilingSurface(OuterCeilingSurface);
    ClosureSurface(ClosureSurface);
    // 屋内
    FloorSurface(FloorSurface);
    InteriorWallSurface(InteriorWallSurface);
    CeilingSurface(CeilingSurface);
}

屋外の境界面

struct RoofSurface(RoofSurface) {
    ...attribs

    // geometry
    // 屋外の種々の境界面はLOD2以上で使う(LOD1では境界面の種類を区別しない)
    lod2Geom: Geometry
    lod3Geom: Geometry
    lod4Geom: Geometry

    // children
    // 壁は窓やドアをもてる
    openings: Vec<Opening>
}
struct GroundSurface(GroundSurface) { ...同上... }
struct WallSurface(WallSurface) { ...同上... }
struct ClosureSurface(ClosureSurface)  { ...同上... }
struct OuterFloorSurface(OuterFloorSurface)  { ...同上... }
struct OuterCeilingSurface(OuterCeilingSurface) { ...同上... }

屋内の境界面

struct FloorSurface(FloorSurface) {
    ...attribs

    // geometry 
    // 屋内の境界面はLOD4以降で使う
    lod4Geom: Geometry

    // children
    // 境界面は、窓やドアをもてる
    openings: Vec<Opening>
}
struct InteriorWallSurface(InteriorWallSurface) { ...同上... }
struct CeilingSurface(CeilingSurface) { ...同上... }

開口部(窓・ドア)

enum Opening {
    Door(Door);
    Window(Window);
}

struct Door {
    ...attribs

    // geometry 
    lod3Geom: Geometry
    lod4Geom: Geometry
}

struct Window { ...同上... }

その他

日本の PLATEAUでは、同一階などのオブジェクトのグルーピングに grp:CityObjectGroup が使える (LOD4) とされています。

MIERUNEのZennブログ

Discussion