span8
span4
本示例从我们的Interopolis 3DS模型简单,纹理CityGML模型中使用前面的例子。CityGML是OGC标准GML应用模式为代表的3D城市和景观。这是非常严格的对象类型的分层表示,它可以通过细节的水平代表了一个文件一个城市模型的许多水平。例如,你可以有建筑模型,构建了家具的内饰在细节层次不同的单一模式。
在前面的例子,为3D城市模型添加不同的纹理,我们采取了Interopolis的3DS模型,并添加不同质感的屋顶和墙壁,写出来的3D PDF。现在,我们将采取同样的完成工作区,并修改它来创建一个纹理CityGML模型。
下载3DS到3DPDF-textures.fmwt从下载部分你开始工作区,并在FME工作台打开它。这是对已完成的工作区前面的例子。我们将依靠它来创建一个纹理CityGML模型。
用CityGML编写器替换Adobe PDF编写器。添加CityGML写入器时,请设置如下参数:
接下来,删除最后GeometryCoercer,因为我们不再希望将所有的为一个网格在一起的对象。CityGML的数据模型将使我们能够保持我们的屋顶和分离的建筑物对象的儿童墙。
每CityGML功能需要一个唯一的ID。我们将使用BuildingID属性,它跟踪哪些特点是其建筑的一部分,创造我们的“大厦”功能类型ID。CityGML功能ID不能以数字开头,所以我们将使用StringConcatenator该建筑ID之前预先设置字符串“GML_”。聚合器输出端口连接到StringConcatenator。
输入“gml_id”对于“新属性”。对于部分字符串,连击:
部分字符串 | 字符串值 |
常数 | GML_ |
属性值 | BuildingID |
我们其实不愿意任何几何形状写入CityGML建造功能型。相反,我们只是想创建一个空的高层次类,将成为屋顶和墙壁表面父ID属性。此ID将使我们能够在建筑物的屋顶组和墙面在一起,如果我们希望。我们将通过连接删除几何GeometryRemover到StringConcatenator。
该GeometryRemover的输出端口连接到大楼的功能类型。
在接下来的几个步骤,我们将创建自定义的变压器。
我们需要把所有的每一个建筑物的墙壁到一个单一的个MultiSurface几何形状。附加的聚合在墙上的纹理AppearanceSetter的输出端口,并确保您设置了“集团通过”以BuildingID。
CityGML功能需要有自己的界定的细节和几何型的水平。在FME,此信息存储在几何特征。之前,我们可以添加一个特征的几何形状,我们需要创建一个使用属性AttributeCreator。填写像下表中的参数。
属性名称 | 价值 |
citygml_level_of_detail | 2 |
citygml_lod_name | lod2MultiSurface |
citygml_feature_role | 被约束 |
现在,我们已经存储几何类型中的一个属性,我们需要使用到它复制到几何特征GeometryPropertySetter。几何特征类似于属性,但存储在几何形状,而不是在它旁边。下来源属性, 选择citygml_lod_name。
CityGML要求每个特性都有一个惟一的idUUIDGenerator将创建一个唯一的ID,并将其分配给一个属性,_uuid。
该UUIDGenerator创建与数字,这是在CityGML无效开始唯一的ID。与上述相类似的建筑类,我们将使用StringConcatenator添加“GML_”到每个id的开头。在参数中,命名新属性:“gml_id”,并设置字符串零件像下表:
字符串类型 | 字符串值 |
常数 | GML_ |
属性值 | _uuid |
连接后的结果,当您填写的参数应该喜欢这样它会自动生成:
GML_ @值(_uuid)
我们需要定义父特征的ID,这样可以FME正确构建层次的CityGML模型。我们需要复制我们的建筑类上面创建的gml_id。添加另一个StringConcatenator。重命名“新属性”作为“gml_parent_id”。建立了部分字符串如下:
字符串类型 | 字符串值 |
常数 | GML_ |
属性值 | BuildingID |
连接后的结果:
GML_ @值(BuildingID)
确保Wall lookancesetter输出端口连接到Aggregator_2。选择步骤6 (Aggregator2)到步骤11 (StringConcatenator3)中的所有转换器。右击并选择“创建自定义变压器”。它的名字CityGMLBuilder,将类别设置为3D,然后按Ok。现在您将在选项卡主页旁边的顶部功能区的选项卡中看到它。在这里,您将发现组成定制转换器的转换器。
打开输入,Aggregator_2_Input参数。确保BuildingID在“要公开的外部属性”中签入。这一步很重要,因为CityGMLBuilder的最后一个StringConcatenator依赖于此属性作为其参数的一部分。由于该属性是在自定义转换器外部创建的,所以StringConcatenator在外部属性公开之前不会将该属性识别为有效参数。
你可能会注意到你的变压器没有输出端口。要添加输出端口,右键单击画布,并选择插入变压器输出。将输出连接到String_Concatenator_3。同样,如果缺少一个输入,也可以从这里添加一个。请记住检查是否在其参数中公开了BuildingID。
回到主选项卡,请检查CityGMLBuilder的参数,并确保该属性BuildingID也被选择作为用户参数的属性。你的输出到CityGML特征类型WallSurface连接在主工作区。
在选项卡,CityGMLBuilder定制变压器。
复制定制变压器,并将其连接到屋顶的AppearanceSetter的输出端口,以及自定义变压器的输出端口连接到RoofSurface特征类型。
你运行你的工作区之前清理您的要素类型的属性。在里面WallSurface在用户属性中,特性类型参数删除除' citygml_feature_role '之外的所有属性。然后在格式属性中,确保citygml_lod_name、gml_id和gml_parent_id公开。对?做同样的操作RoofSurface。为建造特征类型,删除所有的用户属性。确保gml_id在格式属性并取消citygml_lod_name暴露,并在格式属性gml_parent_id。
运行您的工作空间。确保您创建有效CityGML中,下CityGML作家参数Navigator窗口后,请考虑更改验证输出文件,以无以提高性能。
移除不必要的属性。只保留已连接的属性(绿色三角形)。
生成的CityGML输出显示在本机FZKViewer中。
如果使用的是FZKViewer观察,你会需要源读取功能型后添加Reprojector,interopolis。它重新投影到LL84。因为我们的数据是目前在得克萨斯州平面坐标系统这一步是必要的。由于该坐标系没有在FZKViewer认可,我们需要把它重新投影到一个坐标系中,它并承认这样我们就可以查看。
如果您希望查看在FZKViewer的原始纹理,走在菜单栏中显示,那么纹理,然后选择“从实体”。
恭喜你!我们已经成功地将我们的3DS模型写成了一个纹理化的城市gml模型。当模型在本机CityGML查看器中正确显示时,我们知道已经正确地为CityGML编写了必要的结构。
©2020安全亚搏在线软件公司|法律