CityGML 2.0 の Building の階層構造を疑似コード的に説明してみる(頭の整理)
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) とされています。
Discussion