原文发布时间:2014-04-22
作者:小C
参考文献:帮助文档
CityGML是一种用于虚拟三维城市模型数据交换与存储的格式,用以表达三维城市模板的通用数据模型。它定义了城市和区域中最常见的地表目标的类型及相互关系,并顾及了目标的几何、拓扑、语义、外观等方面的属性,包括专题类型之间的层次、聚合、目标间的关系以及空间属性等。这些专题信息不仅仅是一种图形交换格式,同时可以将虚拟三维城市模型用于各种应用领域中的高级分析,例如模拟、城市数据挖掘、设施管理、专题题查询等。
FME中的CityGML要素类
为获取CityGML写模块要素类定义的最简单方式,就是导入已有CtiyGML数据集。
FME带有两个CityGML样本数据集,在有需求的情况下,一同添加到工作平台中。这些文件都存放于FME安装目录中的“xml/CityGML/writer_feature_types”路径中。“CityGML_feature_types.xml” 和“CityGML_NoiseADE_feature_types.xml”样本数据集分别有CityGML (0.4和1.0)和CityGML-NoiseADE (0.4和1.0)要素类定义。
在GML中,这些CityGML样本文件不是完整的数据集,它们不含有任何可读的有意义的数据,其仅用来导入要素类定义到写模块中。
CityGML细节层次(LOD)
CityGML指定了五种不同的细节层次(LODs),从0(一般拓扑)到4(详细的建筑要素和家具)级。大部分要素可能包括不同LODs的几何对象模型。LOD0的一般模型是地形要素。LOD1为简单棱柱形建筑和一般景观要素模型。LOD2结合了建筑模型中的一些建筑要素,比在运输、制备、和户外家具要素更详细。在实际显示时,LOD3是建筑和户外对象模型。并且LOD4是更为详细的内部结构模型。
为正确解译要素的多个几何对象的不同应用,GML几何对象在一个元素中是闭合的,这也就隐含了一种几何对象规则。例如,下面显示的是一个LOD2层次的一个实体几何对象的建筑要素:
<cityObjectMember>
<bldg:Building gml:id="building890384">
<bldg:lod2Solid>
<gml:Solid gml:id="aebd7312">
...
在CityGML要素类中,为正确输出文件,FME几何对象必须用预定义几何对象规则对输出文件进行标签。这些几何对象规则通过“citygml_lod_name”几何对象特性(trait)进行指定。
在工作平台中设置几何对象规则
在下面这个串联模版中,使用AttributeCreator和GeometryTraitSetter转换器来设置几何对象规则。
这里使用AttributeCreator转换器是创建一个citygml_lod_name属性,然后用GeometryTraitSetter转换器将该属性转换到一个特性中。
<cityObjectMember>
<bldg:Building gml:id="boring_building_11">
<bldg:lod2Solid>
<gml:Solid srsDimension="3">
...
其他所有的CityGML指定属性也可通过AttributeCreator简单的设置为一个FME要素,尽管其中很多属性都有一组受限制的值,这些限制在CityGML外部代码列表中都进行了定义。更多详细信息可参阅citygml帮助文档。
将多个几何对象规则写入到一个要素中
给一个要素创建额外的几何对象规则,其实并不是很难。简单的标记相同的副本,或者用恰当规则的其他几何对象,并且聚合要素所有的几何对象到单独的一个几何对象中:
这里是一个CityGML Road要素:
<tran:Road gml:id="2nd_west_boring_street">
<tran:lod0Network>
<gml:LineString srsDimension="3">
<gml:posList>12 0 0 12 12 0 0 12 0</gml:posList>
</gml:LineString>
</tran:lod0Network>
<tran:lod1MultiSurface>
<gml:MultiSurface srsDimension="3">
<gml:surfaceMember>
<gml:Polygon>
<gml:exterior>
<gml:LinearRing>
<gml:posList>13 0 0 11 0 0 11 11 0 0 11 0 0 13 0 13 13 0 13 0 0
</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:Polygon>
</gml:surfaceMember>
</gml:MultiSurface>
</tran:lod1MultiSurface>
<tran:lod2MultiSurface>
<!--The same gml:MultiSurface as for the lod1MultiSurface-->
</tran:lod2MultiSurface>
</tran:Road>
在FME中设置CityGML属性和特性
CityGML要素的非几何属性和特性是通过某种FME要素类属性进行指定的。这些属性的大部分都有一个“citygml_”前缀。例如,FME建筑要素的citygml_roof_type属性值将被写为CityGML建筑要素的“roofType”元素值。
CityGML要素类有效的完整列表将出现在要素类中,是通过从包括那些要素的CityGML文档中输入要素来定义的。
大部分CityGML属性和特性为一个字符串值,具有有效值的列举列表,列举在CityGML外表代码列表中。例如,建筑要素的“roofType”元素,“1070”表示一个亭顶。在FME中,相应的CityGML要素属性应当被设置为这些有效值中的一个值,尽管FME目前不能对这些值进行验证。
CityGML 要素层次
许多CityGML要素都与其他要素相聚合。在FME中,这些关系通过“gml_id”和“gml_parent_id”属性进行指定。“gml_parent_id”子元素的值等同于“gml_id”父元素的值。在CityGML中所有的要素都必须有一个唯一的gml:id属性。使用UUIDGenerator转换器可以确保这些值都是唯一的,但是都必须有个非数字字符的前缀。注意,CityGML写模块会在写要素时,为所有要素自动生产gml:id属性值(基本上是使用下面展示的相同方式),因此不是必须使用这些转换器,除非gml_id属性值必须被访问。
这个工作空间生产了下面的输出结果:
<bldg:Building gml:id="exciting_building_123">
<bldg:boundedBy>
<bldg:RoofSurface gml:id="UUID_47be0fd6-ccec-45ab-96f7-0868ff9208d0">
<bldg:lod3MultiSurface>
...
</bldg:lod3MultiSurface>
</bldg:RoofSurface>
</bldg:boundedBy>
<bldg:boundedBy>
<bldg:WallSurface gml:id="UUID_dafb5306-41aa-4e07-8f58-80874167a2a7">
<bldg:lod3MultiSurface>
...
</bldg:lod3MultiSurface>
</bldg:WallSurface>
</bldg:boundedBy>
<!--Three more WallSurfaces-->
</bldg:Building>