基于Cesium的地下三维管网3D Tiles模型构建与可视化

2021-08-11 04:23窦世卿梁富翔郑贺刚张寒博
科学技术与工程 2021年18期
关键词:裙摆瓦片管网

窦世卿, 梁富翔, 徐 勇, 郑贺刚, 张 楠, 张寒博

(1.桂林理工大学测绘地理信息学院,桂林 541004; 2.黑龙江科技大学矿业工程学院,哈尔滨 150022)

开源的地理信息系统(geographic information system,GIS)平台软件相较商业的GIS平台软件更加灵活、经济,在地理信息系统领域发挥着越来越重要的作用[1]。Cesium是一个开源JavaScript代码库,能够无需插件高效开发三维地图场景,并具备异步请求服务器海量地理空间数据的能力,在各领域都有着广泛的应用前景。当下中国正处在城镇化快速发展时期,地下基础设施建设滞后,地下管网结构管理模式急需向三维化过渡[2-3]。目前数字孪生城市发展背景下的城市互联网管理平台要求实现“空天地海”一体化式的实时虚实共生,对城市地下管网管理同样提出了更高的技术要求。因此,使用Cesium对三维地下管网进行相应研究,有助于完善B/S架构的城市地下空间三维可视化管理系统,支持数字孪生城市建设,为城市监管者提供更多的辅助决策。

目前,中外学者针对Cesium展开了一系列研究,但多集中在地上和地表领域。Potnis等[4]实现了Cesium虚拟地球对地理空间本体的可视化功能。Gede等[5]开发量子地理信息系统(quantum GIS,QGIS)插件,以Cesium语言格式生成各种专题地图。张珣等[6]利用Cesium开发了突发生物危害事件可视化智能决策平台,进行突发生物危害事件模拟预测研究;曹祎楠等[7]基于Cesium进行了公路等基础设施的三维展示和交互;毕硕本等[8]将热带气旋路径以及属性信息整合于Cesium数字地球平台,进行了地球表面的自然灾害可视化相关研究;马洪成等[9]使用Cesium构建了智慧街道三维可视化平台;张彧[10]根据全球导航卫星系统(global navigation satellite system,GNSS)卫星和太空垃圾等轨道数据,构建了基于Cesium平台的导航运行轨道模拟可视化系统;部分学者也使用Cesium开发了一系列的三维GIS可视化平台[11-15]。由于底层设计的原因,原生Cesium并不支持地下模型的可视化显示,因此尚未见有学者针对Cesium地下模型数据可视化技术展开研究。为此,基于Cesium提出一种利用shapefile二维管网数据自动构建三维地下管网3D Tiles模型的建模方法,并基于Cesium开发实现三维可视化展示;最后搭建测试系统使用辽宁省盖州市北海新区管网shapefile实例数据进行测试并验证相关算法和开发功能的效果和可用性。

1 三维数据格式

1.1 GLTF格式

GL传输格式(GL transmission format,GLTF)由Khronos工作组于2015年10月推出,基于现代图形适配器和Web技术设计,其优秀的跨平台特性已经使其成为Web 3D对象的标准格式,当前最新版本为2.0版本,因此又称GLTF 2.0[16]。

1.2 Web 3D Tiles模型

3D Tiles是由Cesium研发团队建立在GLTF数据结构基础上加入了分层细节层次模型(level of detail, LOD)结构后得到的三维瓦片模型数据结构,是一种用于流式传输大规模异构3D地理空间数据集的开发规范[17],目的是为了渲染大规模空间地理模型。3D Tiles模型既继承了GLTF优秀的部分,又兼顾了倾斜点云等数据,是WebGL技术中高效、优秀的三维模型数据结构,也是本文构建地下三维管网模型最终的数据结构。

一个独立的3D Tiles模型文件由一个tileset.json文件和至少一个tile构成,而tile的具体内容为bd3 m(batched 3D modal,批量3D模型)、i3dm(instanced 3D modal,实例3D模型)、pnts、vctr(Point cloud,点云)、cmpt(composite,复合数据)中的一种,其中批量三维模型(b3dm)和实例化三维模型(i3dm)基于GLTF构建。地下管网模型中的管体数据由于较为复杂,因此最终转为b3dm数据,重复率较高的管景模型则以i3dm的形式存在[17]。

1.3 GLTF与3D Tiles模型关系

在3D Tiles模型中真正调用的是其专属的模型文件,主要是对GLTF模型二次封装后的b3dm(batched 3D model)模型和i3dm(instanced 3D model)模型。其中管网模型由于占地范围较大,且每一个管网结构较为复杂,因此对管网数据进行b3dm格式封装。对于通常为路灯、消防栓等有着高重复度的模型,使用i3dm进行封装能够更加有效率[18]。

2 基于Cesium的地下三维管网3D Tiles模型生成

基于Cesium实现三维地下管网的3D Tiles模型生成,主要是基于原始的二维shapefile数据来创建,二维shapefile数据主要包含点要素和线要素,分别存储了管网节点与管体的空间地理位置与属性信息。具体生成过程是首先将二维数据分级处理成四叉树结构关系,之后通过遍历二维数据,将点、线要素分开处理进行逐瓦片的变换矩阵计算和模型构建,将每个几何要素“替换”为标准模型后,将点要素封装为i3dm模型,线要素封装为b3dm模型,同时分别更新tileset.json文件;最后将载有模型信息的tileset.json文件和具有树形结构的tiles文件夹导出分别得到地下管网和管景的3D Tiles模型数据。具体流程如图1所示。

图1 3D Tiles模型生成流程图

2.1 四叉树结构构建

为了避免地下管网模型渲染时系统压力过大而掉帧,3D Tiles将模型拆分成不同层级下的不同瓦片,并通过树状结构维护瓦片之间的关系。通过虚拟摄像机的位置计算几何误差来调用需要的瓦片,进而减轻渲染压力,最大化的渲染空间地理模型。

结合城市地下管网模型,面积覆盖较大、高程差异较小的特点,使得地下管网模型在宏观上更加“扁平”状,因此使用四叉树结构模型进行构建。通过创建一系列节点文件夹,从模型整体文件开始,每个节点文件夹在存储当前节点模型数据的同时,还要存储当前节点下4个子节点的文件夹。当前节点存储的模型用于生成相对于子节点较低精细程度的模型,用于较远距离的加载;而当前节点存储的子节点模型则用于生成相对于子节点较高精细度模型,用于近距离模型加载。整个文件夹架构与3D Tiles模型的瓦片结构高度统一,这样能够有效减小流程的复杂程度。

四叉树构建完成后,就需要进行迭代遍历获取单块shapefile数据的顶点坐标和属性等信息。

2.2 单块二维数据的获取与处理

在迭代遍历每一块shapefile二维数据过程中,需要读取当前shapefile数据内部存储的管网地理信息,并计算当前级别下管网数据的空间外包围盒。由于地下管网围绕地表呈扁平状分布的特性,使用region型外包围盒进行计算。该类外包围盒的确定参数为东南西北4个方向的经纬度范围和最大最小高程。因此在获取到当前瓦块的属性数据后,分别计算出最大最小的经度、维度以及高程等6个值作为该包围盒的描述参数,并以相应的平均值作为该包围盒中心点。

在获得单块shapefile二维数据的空间外包围盒信息后,还需要将管网顶点坐标由经纬度坐标换算至三维笛卡尔坐标系下的坐标,以提高后续模型的处理效率。

2.3 变换矩阵的计算与处理

2.3.1 模型抖动

在GIS系统中,受浮点精度的影响,为保证地球表面(地表)点位坐标的精度,通常使用双精度浮点数进行存储。但在WebGL系统中,模型顶点坐标必须使用单精度浮点类型数据进行存储。如果GIS系统中的双精度坐标不经过任何处理直接用于WebGL渲染系统将会造成精度损失,导致模型顶点的偏移,这种变形在每一帧的变换都不一样,模型在运动过程中将给用户呈现一种似乎在“抖动”的感觉,如图2所示。

图2 因模型抖动造成的几何变形

模型抖动的根本原因是由于平移参数过大导致的。3D Tiles在计算变换矩阵前,先以外包围盒中心点为原点,平行于地球空间笛卡尔坐标系构建局部坐标系。该转换关系可以抽象为平移元素为双精度浮点数的绝对平移矩阵,该矩阵以数组的形式存储在tileset.json文件中的对应处瓦片节点的transform属性中,经过绝对平移变换后,模型本身相当于置身于坐标系原点附近,将不存在较大数量级的数据,因此能够使用单精度浮点数精确的描述,保证各个顶点间的相对位置关系,从而解决模型抖动。

2.3.2 变换矩阵的计算

绝对平移矩阵计算的X、Y、Z平移变换参数分别对应当前瓦块的外包围盒中心点的x、y、z坐标。值得注意的是,实际在WebGL系统中使用的变换矩阵是列主序排列的,这与数学描述中的行主序排列不同。

对于管体数据,遍历二维数据中线要素图层中的每一条线段,获取其端点的坐标以及半径信息计算变换矩阵。对于每一条线段,所需已知量有:线段起点(x0,y0,z0),线段终点(x1,y1,z1),管道半径r,以及标准模型轴线端起点和终点坐标,分别为(0,0,0)与(1,0,0)。

首先对辅助信息进行计算,包括标准模型轴线段对应向量和目标线段向量坐标v1、v2,模长l(该值直接为缩放矩阵x轴缩放参数)和两向量的内外积,如式(1)~式(3)所示:

(1)

(2)

(3)

其中将外积计算得到的向量进行标准化计算,得到旋转轴K的向量,如式(4)所示:

K=(x,y,z)

(4)

再计算v1、v2两向量的夹角θ,如式(5)所示:

(5)

辅助信息计算完毕后,便能够构建该要素的缩放矩阵S、旋转矩阵R和平移矩阵T,如式(6)、式(7)所示。最后将其按照指定的顺序相乘在一起,得到最终的模型矩阵M=S×R×T,如式(8)所示。

对于路灯等附属物,默认该模型垂直于地表(即沿高程方向),因此只需提供坐标以及水平角即可确定其状态。

(6)

(7)

(8)

2.4 标准模型

将三维管网模型抽象为由单一标准模型构成的集合体可以进一步压缩模型复杂程度,提高处理效率。因此使用对标准单位模型进行复制变换的操作得到最终的三维管网模型,获取二维shapefile数据的空间地理信息构建对应单位要素的变换信息变换标准模型,进而得到完整的三维模型数据。

标准模型的数据格式为GLTF模型,其类别主要分为管体模型与管景模型。对于不同管道的不同类别,处理方式略有不同:如路灯、消防栓等地物有着高相似度,因此可以使用相同的模型进行高速渲染,而管网则可以根据管型抽象为对应形状的棱柱侧面。

3 Cesium地下模型可视化技术实现

从原始的二维数据生成3D Tiles模型,在模型数据加载到数据库之后,三维管网模型已经能够按照真实的空间地理位置渲染在网页中。但由于地下管网模型存在于地面之下,相机则位于地面以上的Cesium系统,并不能直观地观察到地面下的模型,因此需要开发对应的辅助功能。

基于Cesium二次开发出地下模式实现了三维地下管网模型的可视化展示。首先对Cesium 1.60进行功能开发以实现地表透明化、裙摆的去除、摄像机地下视角构成和坐标系互转等功能,再将相关开发功能统一集成在拓展文件中;之后引用Cesium 1.60构建测试页面,用Nginx构建服务器环境,调用MongoDB数据库中存储的地下管网3D Tiles模型数据,使用浏览器打开测试页面,构成整个测试系统,并验证开发功能的正确性[19-20]。技术流程如图3所示。

图3 Cesium地下模型可视化技术实现流程图

3.1 地表透明度的修改

由于管网模型处于地下,通过将虚拟地球地表透明化处理,能够直观的观测到模型的真实地理位置。在Cesium中,该逻辑被封装于GlobeSurfaceTileProvider类中。但在该类中,地表瓦片材质的透明度固定为1(即不透明),故将其进行开发设置,使其能够接收外部传入的透明度。

3.2 地图瓦块裙摆的关闭

在开启地图透明度以后能够看到位于地表以下的模型位置。由于地图瓦块使用四叉树进行索引,在加载时瓦块间会出现缝隙,传统的解决这一问题的方法是在每个地图瓦块的边界处,向下凹出一段距离以保证地表的连续性,这称为裙摆(skirt)。但在地表被透明化处理后,由于裙摆相互叠加的原因,会出现许多白色的“网格”,影响用户观看体验,所以需要去除裙摆。加载Cesium内置的createWorldTerrain地形数据,其内置的裙摆属性被封装在CesiumTerrainProvider类中,通过对该类进行修改,使其能够接收外部传入的高度值,再将裙摆高度值设置为0来达到消除裙摆的目的。

3.3 相机地下视角

当摄像机视角进入地下后,Cesium会默认将摄像机弹出地表,从而降低用户体验效果。摄像机与地表关系的判定逻辑封装在Camera类的_adjustHeightForTerrain方法中。修改该方法,使其检测到摄像机高度低于地表时不对摄像机位置进行修改,即可令摄像机移动到地下。

4 系统平台测试

该测试平台主要由数据层、服务层与用户层构成。其中数据层中使用MongoDB数据库存储了地图瓦片、地形瓦片和3D Tiles模型数据,是整个系统的基础。由于Cesium的启动和数据库中数据的调用均需要在服务器环境下运行,本系统使用Nginx构建服务器来满足系统启动的条件。在用户层中,使用超文本标记语言(hyper text markup language,HTML)和Cesium完成三维场景的搭建,并使用开发的拓展文件满足地下模型的可视化要求[21-24]。

测试数据为辽宁省盖州市北海新区约10×104km2的二维管网shapefile数据来生成3D Tiles模型,主要包含管体模型和管景模型,并存储了相关属性信息,生成的模型示意图如图4所示,属性信息如表1和表2所示。

图4 测试数据生成的地下三维管网3D Tiles模型

表1 管景模型数据属性结构

表2 管线模型数据属性结构

4.1 模型加载测试

模型加载测试了地表模型和地下模型,测试加载地下管网模型时还应当获取模型存储的属性数据,即点击管道后能获取对应模型的属性信息。测试结果如图5所示。实现思路是使用Cesium内置的screenSpaceEventHandler方法,该方法接收两个参数,第一个参数是具体执行的回调函数;第二个参数是Cesium内置的事件类别,以数字的形式维护。本文中使用其内置的(鼠标点击)LEFT_CLICK事件。将screenSpaceEventHandler的回调方法的回调参数传入Cesium内置的viewer.scene.pick方法中即可获取3D Tiles模型的内部数据,再通过内部数据的getProperty方法就能够根据模型内部的数据ID信息获取到对应的属性值,最后将属性值以表格的形式渲染在页面中即可完成地下管网模型的对接工作。

需要补充说明的是由于Cesium系统使用透视投影渲染图形,导致屏幕中每个像素点对应的实际距离均不相同,故无法使用标准比例尺表示距离,仅能给出大致参考。图5(a)中大雁塔通高64.517 m,底层边长25.5 m。图5(b)中的球体半径约为0.5 m。

图5 模型及属性数据的加载测试

4.2 地下模式的测试

地下模型的相关逻辑封装在Underground类中,通过实例化该类开启地下模式。在实例化时主要输入地表透明度参数,即当开启地下模式的时候地球表面的透明度值,使用成员方法disable和activate控制地下模式的开关。在地下模式中将对地表进行透明化处理以及消除地图瓦片裙摆,同时使摄像机能够移动到地表以下,在无需修改模型空间地理位置的情况下,全方位的观察位于地下的管网模型,具体细节图如6所示。图6(a)为地下模式的关闭状态,图6(b)~图6(d)为地下模式的开启状态。其中图6(b)、图6(c)为裙摆的关闭和开启状态,能够观察到,在地表开启透明度后,裙摆会非常影响视觉体验。图6(d)为摄像机地下视角,为更全面显示模型提供了条件。图6(a)~图6(c)中的图片宽度在透视投影中显示约为4.8 km,图6(d)中的球体半径同样约为0.5 m。

图6 地下模式测试结果

5 结论

基于Cesium三维地图引擎提出了一种利用shapefile二维地下管网数据自动构建三维地下管网3D Tiles模型的方法并完成了模型的可视化展示。经过系统平台测试,结果表明利用二维shapefile地下管网数据能够快速生成3D Tiles模型,实现良好的三维地下模型的可视化体验,本文方法在一定程度上弥补了原生Cesium不支持地下模型可视化的不足,这是城市地下管网在三维可视化技术中一次新的尝试,为后续Cesium地下空间相关研究工作提供技术支持和方法参考。

本文中管网模型的占地面积范围约10 km2,但管道的半径通常为米或分米级别。因此当在较远距离观看模型时,如果按照真实比例绘制管道半径,将会难以观察到模型。现阶段初步解决方案是使用模型分级技术缓解这个现象,在较低层级的瓦片模型中按一定比例扩大管道半径,使得较远处仍然能够查看到模型。除了本文中所提的开发功能外,模拟开挖功能可以更加直观地反映地上建筑物与地下管网的位置关系,对城市规划有着重要意义,但本文中开发的可视化辅助功能还不支持该功能,因此计划将其加入到后续的研究工作中进行更深一步的探究。

猜你喜欢
裙摆瓦片管网
城市集中供热管网的优化设计
供热一级管网水力计算及分析
打水漂
市政道路给排水管网设计分析
轻舞飞扬
乡村瓦语
惯性
东莞打响截污次支管网建设攻坚战
撩动那一袭 轻妙裙摆
凌絮裙摆