金波
摘要:Bentley公司基于MicroStation平台的系列软件能进行多专业、多行业三维建模,但其模型不能直接的导出到ArcGIS平台中使用。SceneLayer Package(SLPK)是ArcGIS支持的基于OGC I3S规范的国际三维标准格式,通过研究SLPK格式和MicroStation三维模型,基于MicroStation进行MDL二次开发,实现了在MicroStation中三维模型直接导出成SLPK格式,以便在GIS平台中更好的应用和展示BIM模型。
关键词:MicroStation;SLPK;ArcGIS Pro;MDL二次开发;BIM+GIS
1 引言
MicroStation是一款工程领域常用的二维、三维一体化计算机辅助设计软件,Bentley公司基于MicroStation研发了一系列软件用于土木、工厂、建筑和地理信息行业,可用于创建各个专业和行业的三维模型,并附加属性信息,提供了一套广泛应用的BIM解决方案。另外MicroStation提供了SDK,用于用户二次开发以实现更多的功能。
为了更好地将BIM三维模型与GIS结合起来,ESRI公司发起了I3S规范;该规范被开放地理空间联盟(OGC)采納为新的国际三维标准。基于I3S规范ESRI提出了三维数据格式SLPK(场景图层包)。SLPK格式能够在ESRI公司的ArcGIS Pro以及ArcGIS online中使用,发布为服务后可用ArcGIS API for JavaScript调用应用于Web。
MicroStation三维模型目前不支持直接导出SLPK格式供ArcGIS使用,通过研究SLPK格式和MicroStation模型,基于MicroStation MDL二次开发,实现了在 MicroStation中将模型直接导出为SLPK格式;同时为了更方便地在GIS系统中使用SLPK,在导出时添加了坐标系转换的功能,可以将模型导出为经纬度坐标或者Web墨卡托坐标等。其转换流程如图1所示。
2 MicroStation三维模型简介
在MicroStation中,元素种类很多,主要分为线、面和体几类。三维模型通常属于体,极少数属于网格面。三维模型常见的元素种类见表1。
针对不同类型的三维模型,需要进行不同类型的处理。在程序中,首先需要判断三维模型的类型,主要用到的函数包括mdlElement_getType()、mdlTFElmdscr_ getApplicationType()和mdlKISolid_isSolidElement()等。
mdlElement_getType()可用于判断三维模型是否是网格或实体。
mdlKISolid_isSolidElement()可用于判断三维模型是否是实体或智能实体。
mdlTFElmdscr_getApplicationType()可用于判断三维模型是否属于建筑模型单元或者复合单元。
3 模型面三角形化
三维模型几何信息由若干个面组成,MicroStation中三维模型可能包含曲面、含圆弧的面或者多边形面,但是在SLPK格式中,三维模型目前只支持三角形面,因此需要将MicroStation中三维模型进行三角形化,这样就能满足SLPK的要求。针对不同类型的三维模型需要进行不同的处理。
(1)网格三角形化:网格可能全部由三角形面组成,也可能包含四边形面或多边形面,可以使用mdlMesh_ copyTriangulated()函数将网格复制并三角形化,得到的新网格中只包含三角形面。接着使用mdlMesh_ getPolyfaceArrays()函数即可获得网格各个三角形面的顶点坐标。图2中左边为原始网格,右边为三角形化的网格。
(2)单元、实体和智能实体三角形化:单元、实体和智能实体都只包含单个的体,首先使用mdlKISolid_ elementToBody2()函数将元素转换成内部KISolid,再使用mdlKISolid_facetBody()函数进行三角形化。将含曲线和圆弧的面转换成三角形面会有精度丢失,主要依据弦公差和角度公差两个参数来保证精度。图3中展示的是转换前后的变化。
(3)复合单元:复合单元由多个单元或智能实体组成,应使用mdlKISolid_elementToBodyList()来将元素转换成多个KISolid,对于每个KISolid使用单元、实体和智能实体的方法来进行三角形化,最后把三角形化的面合并起来存储即可。图4中左边的窗户包含6个部分,右边是三角形化之后的效果。
在完成三角形化的同时,也获得了模型在当前坐标系的顶点坐标。
4 坐标转换、法线计算
SLPK的主要使用场合是Web,WebGIS系统常用的坐标系是网络墨卡托坐标系(EPSG:3 857)和WGS84经纬度坐标系(EPSG:4 326),而MicroStation建模结合地形模型总装后的坐标系通常为Beijing54、Xian80或CGCS2000的三度分带投影坐标系,因此在模型输出成SLPK格式时提供坐标系转换功能很有必要。
基于GDAL和Proj.4开源库,根据源坐标系和目标坐标系的EPSG代码,实现对坐标进行批量转换。
当不涉及到网络墨卡托坐标系时,主要代码如下:bool coordTranform(int count,int srcEpsg,int destEpsg,double* px,double* py)
當输入坐标系和输出坐标系椭球不一样时,通常坐标转换需要七参数或四参数等才能精确转换,否则转换结果平面误差可达数十米甚至上百米。但在实际试验中发现,proj.4和GDAL中已内置了相关转换参数,不同椭球的坐标转换后的结果精度较高,与网络地图套和较好,故可直接使用。假如出现了偏差较大的情况,只需对模型进行相应的移动即可。
除了顶点坐标外,三维模型的显示和渲染还需要每个面的法线向量,法线的计算方式为向量叉乘。如一个三角形面三个顶点依次分别为P1、P2和P3,则这个面的法线为,一般还需要进行归一化使法线向量的模为1。在计算法线时需要注意,经纬度坐标不能直接拿来进行法线的计算,如果输出坐标系是WGS84经纬度,则应先计算法线,再进行坐标转换。
5 模型属性提取
BIM模型除了几何信息之外属性信息也非常重要,基于MicroStation的建筑建模相关软件的SDK中提供了一些提取属性信息的方法。
首先设计了相应数据结构来存储属性,如下:
(1)面积:模型的表面积,类型为双精度浮点数,直接使用mdlMeasure_AreaProperties()函数获得。
(2)体积:模型的体积,类型为双精度浮点数,直接使用mdlMeasure_volumeProperties()函数获得。
(3)位置:模型的中心坐标,因为有三个浮点数(X,Y,Z),简化使用字符串来存储,从MicroStation元素的元素头中range变量中能获取模型坐标值的最大值和最小值,取其平均数即为近似的模型中心坐标。
(4)图层:模型所在的图层名称,使用mdlElement_ getProperties()函数可获得图层ID,再使用mdlLevel_ getName()函数即可获得图层名称,类型为字符串。
(5)颜色:模型顶点颜色,类型为字符串,在MicroStation中一个元素只能有一种颜色,使用mdlElement_getSymbology()函数获取颜色索引号,如果获得的索引号是“按层”,则需要根据图层ID获得颜色索引号,即使用mdlLevel_getElementColor()函数。得到颜色索引号后,通过调色板来查询索引号对应的颜色RGB值,用到的函数是mdlColorPal_getColorDescr()和mdlColorDescr_ getRgb(),最后将RGB值转成字符串。
(6)类别和样式:类别和样式是MicroStation建筑模型最重要的属性之一,类型为字符串,涵盖模型材料、图样、工程量、渲染特性、切图和结构分析等一系列属性的定义,知道了样式名称,即可在库中查询到该样式的这些属性,如砖外墙的类别为“Wall_Ext”,样式为“Brick wall”。使用mdlTFPartRef_getPart()函数获得样式,再使用mdlTFPartRef_getPartName()函数和mdlTFPartRef_ getPartFamilyName()函数即可分别获得样式和类别。
(7)材质:建筑模型的材质定义了模型的纹理和贴图信息,从样式定义中能获取到材质信息的定义,如“Concrete_3”表示贴图为混凝土。
除了这些属性,还能够根据不同专业和行业来获取所需的属性,但是具体需要配置各专业的工作环境和约定相应的标准,目前还未深入研究。
6 输出SLPK
完成了上述处理后,即可开始创建SLPK格式的场景图层包了。
(1)格式简介:SLPK文件是由一系列JSON文件和二进制文件按照严格的文件组织再打包成ZIP格式的压缩包,其主要文件夹结构如图5所示。
根目录下有metaData.json、3DSceneLayer.json两个文件和nodes文件夹;nodes文件夹中存储有各个节点文件夹;root文件夹下存储的是根节点信息,只有一个文件3dNodeIndexDocument.json;其他每个节点文件夹下可存储模型的一个部分,每部分的属性可以不同,包括3dNodeIndexDocument.json文件和若干个子文件夹(attributes,features,geometries和shared文件夹);attirbutes文件夹下存储的是各个属性的值;features文件夹下有0.json文件;geometries文件夹下存储的是0.bin文件,以二进制格式存储顶点坐标、法线坐标、纹理坐标和顶点颜色值;shared文件夹中存储的是sharedResource.json,主要存储纹理贴图信息;如果存在纹理贴图,还会有textures文件夹,里面存储的是dds或者jpeg格式的纹理图片。每个节点的3dNodeIndexDocument.json文件中会存有父节点的信息和子节点的信息,所有节点之间的关系是一种树状关系,这对于大数据量的模型有利于实现LOD。
(2)创建JSON文件:JSON文件是JavaScript Object Notation的缩写,是一种用来存储和表示数据的文本格式,使用cJson库能够很方便地进行JSON文件的读写。对于SLPK包内的所有json格式的文件,都可以用cJson库进行创建,各个文件具体内容参见OGC SLPK官方文档。metaData.json文件的创建代码如下:
在0.bin中依次存储的是顶点数组、法线数组、纹理坐标数据和颜色数组,写入文件可使用ofstream,ofstream::write()函数能够快速批量将数组写入到文件中。
属性值也可存储在名为0.bin的二进制文件中,对于不同属性类型的属性值,写入方法有所差别,其代码如下:
要注意将字符串转成UTF-8编码,否则汉字显示为乱码。
(4)文件压缩:完成创建所有文件后,需要将除了metaData.json外的所有文件先压缩成gz格式,在程序中使用ShellExecute()函数调用开源的压缩软件7z.exe,给定参数“a <文件名>.gz <文件名>”即可完成压缩,压缩的同时删除掉原文件;接着使用ShellExecute()调用7z.exe,给定参数“a <模型文件夹><模型名>.zip -ir!<模型文件夹>*.* -mx0”,即可将所有文件打包成zip格式;最后将zip文件名称中后缀名“.zip”修改成“.slpk”即完成的场景图层包的创建。
7 運行结果
在MicroStation中运行MDL程序,界面如图6所示。
选中要导出的一个或者多个模型(多个模型时,每个模型会导出成场景图层包的一个节点),设置相应路径、名称和坐标系等参数,在视图中单击左键即开始导出。导出完成后,在ArcGIS online中,直接即可将SLPK文件上传并发布成Scene Layer。图7、图8分别是大坝原始三维模型和在网页中展示的效果。图9、图10是房屋原始三维模型和在网页中展示的效果。
图11为在网页中可以查询模型每一个部分的属性。
使用ArcGIS API for JS调用SLPK场景图层的示例代码如下:
8 结语
通过研发和实践,解决了MicroStation三维建筑模型直接导出成SLPK场景图层包的问题,为BIM模型和GIS系统的应用结合打下了一些基础。
参考文献:
[1]OGC Indexd 3d Scene Layer(I3S) and Scene Layer Package Format Specification.
[2]彭殿军.从MicroStation三维模型到二维图纸的生成流程[J].有色冶金设计与研究,2016(05):106-107,110.
[3]张燕,唐相桢.MicroStation图形数据到ArcGIS数据转换方法的研究[J].城市勘测,2015(1):26-29.
[4]乔新,王海银,胡振彪.MicroStation调用WebGIS地图服务的开发与应用[J].现代测绘,2011(2):29-31.