span8
span4
本示例从我们的Interopolis 3DS模型简单,纹理CityGML模型中使用前面的例子。CityGML是OGC标准GML应用模式为代表的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的输出端口连接到大楼的功能类型。
在接下来的几个步骤,我们将创建自定义的变压器。
我们需要将每个建筑的所有墙壁组合成一个单一的多面几何图形。附加一个聚合将“组By”设置为墙壁纹理的输出端口BuildingID。
CityGML特性需要定义它们的详细级别和几何类型。在FME中,这些信息存储在几何特征中。在向几何图形添加特征之前,需要使用AttributeCreator。如下表所示填写参数。
属性名称 | 值 |
citygml_level_of_detail | 2 |
citygml_lod_name | lod2MultiSurface |
citygml_feature_role | 被约束 |
现在我们已经在属性中存储了几何类型,我们需要使用GeometryPropertySetter。几何特征与属性类似,但存储在几何结构中,而不是与之一起存储。下来源属性中,选择citygml_lod_name。
CityGML要求每个特性都有唯一的id。的UUIDGenerator将创建一个惟一的id并将其分配给一个属性_uuid。
UUIDGenerator创建以数字开头的惟一id,该id在CityGML中是无效的。与上面的构建类类似,我们将使用aStringConcatenator将“GML_”添加到每个id的开头。在参数中,命名新属性:“gml_id”,并设置字符串部分如下表所示:
字符串类型 | 字符串值 |
不变 | GML_ |
属性值 | _uuid |
连接的结果,这是自动生成时,你应该填写的参数应该像这样:
GML_@Value (_uuid)
我们需要定义父特性的id,以便FME能够正确地在CityGML模型中构建层次结构。我们需要复制为上面的构建类创建的gml_id。添加另一个StringConcatenator。将“New属性”重命名为“gml_parent_id”。设置字符串部分如下:
字符串类型 | 字符串值 |
不变 | GML_ |
属性值 | BuildingID |
连接结果:
GML_@Value (BuildingID)
确保墙壁外观排字机输出端口已连接到Aggregator_2。选择步骤6 (Aggregator2)到步骤11 (StringConcatenator3)中的所有转换器。右键点击并选择“创建自定义变压器”。它的名字CityGMLBuilder,将类别设置为3D,然后点击确定。现在您将在选项卡中看到它,位于选项卡主体旁边的顶部功能区。在这里,您将找到组成自定义变压器的变压器。
打开输入的参数Aggregator_2_Input。确保BuildingID在“要公开的外部属性”中选中。这一步非常重要,因为CityGMLBuilder的最后一个StringConcatenator依赖于该属性作为其参数的一部分。由于该属性是在自定义转换器之外创建的,所以StringConcatenator直到公开了外部属性后才将该属性识别为有效参数。
您可能会注意到您的变压器没有输出端口。要添加输出端口,右键单击画布并选择插入变压器输出。将输出连接到String_Concatenator_3。同样,如果您缺少一个输入,您也可以从这里添加一个。记住要检查BuildingID是否在其参数中公开。
回到主选项卡,检查CityGMLBuilder的参数,并确保属性BuildingID也作为用户参数中的属性被选中。将输出连接到主工作区中的CityGML功能类型WallSurface。
在选项卡,CityGMLBuilder定制变压器。
复制自定义变压器并将其连接到屋顶外观测定仪的输出端口,并将自定义变压器的输出端口连接到屋顶地物类型。
在运行工作空间之前,清理特性类型中的属性。在WallSurface在用户属性中,删除除' citygml_feature_role '之外的所有属性。然后在格式属性中,确保citygml_lod_name、gml_id和gml_parent_id是公开的。对?做同样的事RoofSurface。为建造特征类型,删除所有用户属性。确保在格式属性中显示gml_id,并在格式属性下取消citygml_lod_name和gml_parent_id选项。
运行您的工作区。在确保您正在创建有效的CityGML之后,在CityGML写入器参数下的Navigator窗口中,请考虑将验证输出文件更改为No以提高性能。
移除不必要的属性。只保留已连接的属性(绿色三角形)。
将所得CityGML输出显示在天然FZKViewer。
如果使用FZKViewer查看,您将需要在源阅读器功能类型interopolis之后添加一个投影仪。重投射到LL84。这个步骤是必要的,因为我们的数据目前在德州飞机坐标系中。由于这个坐标系在FZKViewer中无法识别,所以我们需要将它重新映射到一个它可以识别的坐标系中,这样我们才能查看它。
如果你想在FZKViewer中查看原始纹理,去菜单栏显示,然后纹理,并选择“From Entity”。
恭喜你!我们已经成功地将我们的3DS模型编写为一个纹理化的CityGML模型。由于模型是在本地CityGML观众正常显示,我们知道我们已经正确地写入了必要的机构CityGML。
©2019安全亚搏在线软件公司|法律