span8
span4
这个例子从我们的Interopolis 3DS模型中创建了一个简单的、纹理化的CityGML模型上例。CityGML是OGC标准的GML应用程序模式,用于表示3D城市和景观。它是一种具有非常严格的对象类型的层次表示,并且它可以在单个文件中通过详细级别表示城市模型的多个级别。例如,您可以在一个模型中使用不同层次的细节来创建建筑模型和使用家具构建内部。
在前面的例子中,添加不同的纹理到一个3D城市模型我们使用了一个Interopolis的3DS模型,在屋顶和墙壁上添加了不同的纹理,并将其写入3D PDF。现在,我们将使用相同的已完成的工作区,并对其进行修改,以创建一个纹理化的CityGML模型。
下载3 ds-to-3dpdf-textures。fmwt as your beginning workspace from the Downloads section and open it in FME Workbench.的完整工作区上例。我们将在此基础上创建一个纹理化的CityGML模型。
用CityGML Writer替换Adobe PDF Writer。添加CityGML写入器时,请设置如下参数:
接下来,删除最后一个geometrycoer,因为我们不再希望将所有对象作为单个网格组合在一起。CityGML的数据模型将允许我们将屋顶和墙壁作为建筑对象的子对象分开。
每个CityGML特性都需要一个唯一的ID。我们将使用BuildingID属性来为我们的“building”特性类型创建id,该属性跟踪哪些特性是哪些构建的一部分。CityGML特性id不能以数字开头,因此我们将使用字符串连接符将字符串“GML_”放在构建ID之前。将聚合器输出端口连接到StringConcatenator。
输入'gml_id'“新属性”。对于字符串部分,连接:
字符串部分 | 字符串值 |
常数 | GML公司_ |
属性值 | 建筑ID |
我们实际上并不想向CityGML写入任何几何图形建筑物功能类型。相反,我们只想创建一个空的高层类,它将成为屋顶和墙面的父ID属性。这个ID将允许我们将建筑的屋顶和墙面组合在一起。我们将通过连接a来删除几何图形GeometryRemover公司StringConcatenator。
将GeometryRemover的输出端口连接到构建特性类型。
在接下来的几个步骤中,我们将创建自定义转换器。
我们需要将每个建筑的所有墙壁组合成一个单一的多面几何图形。附加一个聚合器将“组By”设置为墙壁纹理的输出端口建筑ID。
CityGML特性需要定义它们的详细级别和几何类型。在FME中,这些信息存储在几何特征中。在向几何图形添加特征之前,需要使用属性创建者。如下表所示填写参数。
属性名 | 价值 |
城市详细程度 | 二 |
城市名称 | lod2多曲面 |
城市功能角色 | 边界 |
现在我们已经在属性中存储了几何类型,我们需要使用GeometryPropertySetter公司。几何特征与属性类似,但存储在几何结构中,而不是与之一起存储。下源属性中,选择城市名称。
CityGML要求每个特性都有唯一的id。的UUIDGenerator公司将创建一个惟一的id并将其分配给一个属性_uuid。
UUIDGenerator创建以数字开头的惟一id,该id在CityGML中是无效的。与上面的构建类类似,我们将使用a字符串连接符将“GML_”添加到每个id的开头。在参数中,命名新属性:'gml_id',并设置字符串部分如下表所示:
字符串类型 | 字符串值 |
常数 | GML公司_ |
属性值 | _uuid公司 |
连接的结果,这是自动生成时,你应该填写的参数应该像这样:
GML_@Value (_uuid)
我们需要定义父特性的id,以便FME能够正确地在CityGML模型中构建层次结构。我们需要复制为上面的构建类创建的gml_id。添加另一个StringConcatenator。将“New属性”重命名为'gml_父id'。设置字符串部分如下:
字符串类型 | 字符串值 |
常数 | GML公司_ |
属性值 | 建筑ID |
连接结果:
GML_@Value (BuildingID)
确保墙壁外观排字机输出端口已连接到Aggregator_2。选择步骤6 (Aggregator2)到步骤11 (StringConcatenator3)中的所有转换器。右键点击并选择“创建自定义变压器”。它的名字城市建设者,将类别设置为3D,然后点击确定。现在您将在选项卡中看到它,位于选项卡主体旁边的顶部功能区。在这里,您将找到组成自定义变压器的变压器。
打开输入的参数Aggregator_2_Input。确保建筑ID在“要公开的外部属性”中选中。这一步非常重要,因为CityGMLBuilder的最后一个StringConcatenator依赖于该属性作为其参数的一部分。由于该属性是在自定义转换器之外创建的,所以StringConcatenator直到公开了外部属性后才将该属性识别为有效参数。
您可能会注意到您的变压器没有输出端口。要添加输出端口,右键单击画布并选择插入变压器输出。将输出连接到String_Concatenator_3。同样,如果您缺少一个输入,您也可以从这里添加一个。记住要检查BuildingID是否在其参数中公开。
回到主选项卡,检查CityGMLBuilder的参数,并确保属性BuildingID也作为用户参数中的属性被选中。将输出连接到主工作区中的CityGML功能类型WallSurface。
选项卡CityGMLBuilder中的自定义转换器。
复制自定义变压器并将其连接到屋顶外观测定仪的输出端口,并将自定义变压器的输出端口连接到屋顶地物类型。
在运行工作空间之前,清理特性类型中的属性。在墙面在用户属性中,删除除' citygml_feature_role '之外的所有属性。然后在格式属性中,确保citygml_lod_name、gml_id和gml_parent_id是公开的。对?做同样的事屋顶。为建筑物特征类型,删除所有用户属性。确保在格式属性中显示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安全亚搏在线软件公司法律