使用FME生成CityGML文件

时间:2024-03-15 18:48:13

原文发布时间: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.41.0)CityGML-NoiseADE (0.41.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)进行指定。

    在工作平台中设置几何对象规则

    在下面这个串联模版中,使用AttributeCreatorGeometryTraitSetter转换器来设置几何对象规则。

使用FME生成CityGML文件

    这里使用AttributeCreator转换器是创建一个citygml_lod_name属性,然后用GeometryTraitSetter转换器将该属性转换到一个特性中。

    <cityObjectMember>

    <bldg:Building gml:id="boring_building_11">

    <bldg:lod2Solid>

    <gml:Solid srsDimension="3">

    ...

其他所有的CityGML指定属性也可通过AttributeCreator简单的设置为一个FME要素,尽管其中很多属性都有一组受限制的值,这些限制在CityGML外部代码列表中都进行了定义。更多详细信息可参阅citygml帮助文档。

    将多个几何对象规则写入到一个要素中

给一个要素创建额外的几何对象规则,其实并不是很难。简单的标记相同的副本,或者用恰当规则的其他几何对象,并且聚合要素所有的几何对象到单独的一个几何对象中:

使用FME生成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>


    一般情况,LOD2几何对象应比LOD1几何对象更为详细,但是在这个例子中,使用相同的几何对象进行处理。在这个例子中,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属性值必须被访问。

使用FME生成CityGML文件

 这个工作空间生产了下面的输出结果:

<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>