APP下载

MicroStation三维模型导出ArcGIS SLPK格式探讨

2020-10-20金波

中国信息化周报 2020年36期
关键词:样式坐标系实体

金波

Bentley公司基于MicroStation平台的系列软件能进行多专业、多行业三维建模,但其模型不能直接地导出到ArcGIS平台中使用。SceneLayer Package(SLPK)是ArcGIS支持的基于OGC I3S规范的国际三维标准格式,笔者通过研究SLPK格式和MicroStation三维模型,基于MicroStation进行MDL二次开发,实现了在MicroStation中三维模型直接导出成SLPK格式,以便在GIS平台中更好地应用和展示BIM模型。

MicroStation三维模型简介

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墨卡托坐标等。

在MicroStation中,元素种类很多,主要分为线、面和体几类。三维模型通常属于体,极少数属于网格面。针对不同类型的三维模型,需要进行不同类型的处理。在程序中,首先需要判断三维模型的类型,主要用到不同函数。

mdlElement_getType()可用于判断三维模型是否是网格或实体。mdlKISolid_isSolidElement()可用于判断三维模型是否是实体或智能实体。mdlTFElmdscr_getApplicationType()可用于判断三维模型是否属于建筑模型单元或者复合单元。

模型面三角形化

三维模型几何信息由若干个面组成,MicroStation中三维模型可能包含曲面、含圆弧的面或者多边形面,但是在SLPK格式中,三维模型目前只支持三角形面,因此,需要将MicroStation中三维模型进行三角形化,这样就能满足SLPK的要求。针对不同类型的三维模型需要进行不同的处理。

网格三角形化:网格可能全部由三角形面组成,也可能包含四边形面或多边形面,可以使用mdlMesh_copyTriangulated()函数将网格复制并三角形化,得到的新网格中只包含三角形面。接着使用mdlMesh_getPolyfaceArrays()函数即可获得网格各个三角形面的顶点坐标。

单元、实体和智能实体三角形化:单元、实体和智能实体都只包含单个的体,首先使用mdlKISolid_elementToBody2()函数将元素转换成内部KISolid,再使用mdlKISolid_facetBody()函数进行三角形化。将含曲线和圆弧的面转换成三角形面会有精度丢失,主要依据弦公差和角度公差两个参数来保证精度。

复合单元:复合单元由多个单元或智能实体组成,应使用mdlKISolid_elementToBodyList()来将元素转换成多个KISolid,对于每个KISolid使用单元、实体和智能实体的方法来进行三角形化,最后把三角形化的面合并起来存储即可。在完成三角形化的同时,也获得了模型在当前坐标系的顶点坐标。

坐标转换、法线计算

SLPK的主要使用场合是Web,WebGIS系统常用的坐标系是网络墨卡托坐标系(EPSG:3857)和WGS84经纬度坐标系(EPSG:4326),而MicroStation建模结合地形模型总装后的坐标系通常为Beijing54、Xian80或CGCS2000的三度分带投影坐标系,因此在模型输出成SLPK格式时提供坐标系转换功能很有必要。

基于GDAL和Proj.4开源库,根据源坐标系和目标坐标系的EPSG代码,实现对坐标进行批量转换。当输入或者输出坐标系为网络墨卡托坐标系时,所使用的Porj.4版本尚不支持,需要先将坐标转换成WGS84经纬度再进行转换。当输入坐标系和输出坐标系椭球不一样时,通常坐标转换需要七参数或四参数等才能精确转换,否则转换结果平面误差可达数十米甚至上百米。但在实际试验中发现,proj.4和GDAL中已内置了相关转换参数,不同椭球的坐标转换后的结果精度较高,与网络地图套和较好,故可直接使用。假如出现了偏差较大的情况,只需对模型进行相应的移动即可。除了顶点坐标外,三维模型的显示和渲染还需要每个面的法线向量,法线的计算方式为向量叉乘。

模型属性提取

BIM模型除了几何信息之外属性信息也非常重要,基于MicroStation的建筑建模相关软件的SDK中提供了一些提取属性信息的方法。

首先设计了相应数据结构来存储属性。再列出面积、体积、位置、图层、颜色、样式类别等一些常见属性的提取。以面积为例,模型的表面积,类型为双精度浮点数,直接使用mdlMeasure_AreaProperties()函数获得。再例如类别和样式,类别和样式是MicroStation建筑模型最重要的属性之一,类型为字符串,涵盖模型材料、图纸、工程量、渲染特性、切图、结构分析等一系列属性的定义,知道了样式名称,即可在库中查询到该样式的这些属性,如砖外墙的类别为“Wall_Ext”,样式为“Brick wall”。使用mdlTFPartRef_getPart()函数获得样式,再使用mdlTFPartRef_getPartName()函数和mdlTFPartRef_getPartFamilyName()函数即可分别获得样式和类别。材质:建筑模型的材质定义了模型的纹理和贴图信息,从样式定义中能获取到材质信息的定义,如“Concrete_3”表示贴图为混凝土。

除了这些属性,还能够根据不同专业和行业来获取所需的属性,但是具体需要配置各专业的工作环境和约定相应的标准,目前还未深入研究。

输出SLPK

完成了上述处理后,即可开始创建SLPK格式的场景图层包了。

格式简介:SLPK文件是由一系列JSON文件和二进制文件按照严格的文件组织再打包成ZIP格式的压缩包。

创建JSON文件:JSON文件是JavaScript Object Notation的缩写,是一种用来存储和表示数据的文本格式,使用cJson库能够很方便地进行JSON文件的读写。对于SLPK包内的所有JSON格式的文件,都可以用cJson库进行创建,各个文件具体内容参见OGC SLPK官方文档。

创建几何和属性文件:几何信息0.bin详细格式参见官方文档。在0.bin中依次存储的是顶点数组、法线数组、纹理坐标数据和颜色数组,写入文件可使用ofstream,ofstream::write()函数能够快速批量将数组写入到文件中。

文件压缩:完成创建所有文件后,需要将除了metaData.json外的所有文件先压缩成gz格式,在程序中使用ShellExecute()函数调用开源的压缩软件7z.exe,给定参数“a  <文件名>.gz  <文件名>”即可完成压缩,压缩的同时删除掉原文件;接着使用ShellExecute()调用7z.exe,给定参数“a  <模型文件夹><模型名>.zip   -ir!<模型文件夹>*.*  -mx0”,即可将所有文件打包成zip格式;最后将zip文件名称中后缀名“.zip”修改成“.slpk”即完成的场景图层包的创建。

在MicroStation中运行MDL程序。选中要导出的一个或者多个模型,设置相应路径、名称和坐标系等参数,在视图中单击左键即开始导出。导出完成后,在ArcGIS online中,直接即可將SLPK文件上传并发布成Scene Layer。

通过研发和实践,解决了MicroStation三维建筑模型直接导出成SLPK场景图层包的问题,为BIM模型和GIS系统的应用结合打下了一些基础。

猜你喜欢

样式坐标系实体
CPMF-I 取样式多相流分离计量装置
CPMF-I 取样式多相流分离计量装置
取样式多相流分离计量装置
前海自贸区:金融服务实体
解密坐标系中的平移变换
坐标系背后的故事
实体的可感部分与实体——兼论亚里士多德分析实体的两种模式
基于重心坐标系的平面几何证明的探讨
两会进行时:紧扣实体经济“钉钉子”
振兴实体经济地方如何“钉钉子”