于雷易,邴丕敬,杨永明
(1.自然资源部国土空间大数据工程技术创新中心应用技术研发分中心,北京 100034;2.特力惠信息科技股份有限公司,福州 350001;3.中国人民大学 研究生院,北京 100872;4.中国人民大学 劳动人事学院,北京 100872)
基于Web 方式的三维场景数据在线显示是地理信息系统技术的常规需求,基于三维地理瓦片(three dimensions tiles,3D Tiles)格式实现三维场景数据在线显示的Cesium 技术是该领域的代表技术。Cesium 技术实现三维场景数据在线显示的关键是3D Tiles 格式的分层细节级别(hierarchical level of detail,HLOD)数据结构。用户请求显示某视图范围内的三维场景数据时,Cesium 首先向服务端请求加载显示HLOD 数据结构的低层级数据,由于低层级数据的数据量相对少,这样能够快速显示三维场景的轮廓、快速响应用户的显示请求;当用户没有进一步视图操作时,再逐级加载显示HLOD数据结构的高层级数据,显示三维场景的细节[1]。
虽然Cesium 技术能够解决一般情况下的三维场景在线显示问题,但也存在缺陷。Cesium 技术显示三维场景数据时需要将数据传输到客户端并进行渲染。当三维场景地理范围很大且场景细节特别丰富时,高层级HLOD 数据传输到客户端耗时很长,造成三维场景细节显示缓慢;传输到客户端的三维场景数据会造成大量内存累积,即便它拥有内存释放策略也无法完全解决问题,导致中低性能的客户端极易出现浏览器崩溃等问题[1]。
为解决上述海量、高密度、高精度三维场景数据在线可视化问题,研究团队研发了一种海量三维场景数据混合渲染方法并取得发明专利,基于该专利技术实现了TeleGIS 三维大数据Web 显示系统。
在Web 的三维场景数据渲染技术方面,Cesium的细节层次(level of detail,LOD)技术和虚幻引擎(Unreal Engine)的像素流送技术是典型代表。一些商业三维地理信息系统平台推出视频流的技术,其技术实现原理与像素流送技术类似。
Cesium 是AGI(Analytical Graphics Incorporation)公司计算机图形开发小组研发的三维地球和地图可视化开源JavaScript 库。Cesium 为三维GIS 提供了一个高效的数据可视化平台。Cesium 是一个跨平台、跨浏览器展示三维地球和地图的JavaScript库;利用万维网图形库(Web graphics library,WebGL)进行硬件加速图形显示,使用时不需要任何插件支持。
Cesium 技术运用3D Tiles 格式加载倾斜摄影数据、三维建筑物模型数据、建筑信息模型(building information model,BIM)数据、点云数据等3D 数据。Cesium 支持全球高精度地形数据可视化,支持地形夸张效果、可编程实现的等高线和坡度分析效果。
Unreal Engine 的像素流送技术,在云端服务器上运行虚幻引擎应用程序,通过万维网实时通信(Web real-time communication,WebRTC),将渲染的帧和音频流发送到浏览器和移动设备[2]。
利用像素流送可以远程运行虚幻引擎应用程序,虚幻引擎将利用电脑的可用资源,包括中央处理器(central processing unit,CPU)、图形处理单元(graphics processing unit,GPU)、内存等,运行游戏逻辑并对每一帧进行渲染。它会将此渲染不断输出编码到一个媒体流送,再通过一个轻量级的网页服务堆栈进行传递,用户可在其他电脑和移动设备的标准网页浏览器查看直播流送[2]。
TeleGIS 三维大数据Web 显示系统的核心方法是客户端与服务端混合渲染方法。该方法的具体实现过程采用了HLOD 层级瓦片筛选规则[3]、三级缓存策略、多用户并发与分布式渲染任务分配等多个关键技术。
不同于Cesium 技术的客户端渲染方法,海量三维场景数据混合渲染方法采用了客户端与服务端混合渲染的方法。该混合渲染方法的基本原理是,客户端Cesium 负责加载显示3D Tiles 数据HLOD 数据结构的低层级数据(低层级数据的数据量相对小),显示三维场景的轮廓,满足用户视图操作的快速响应和平滑效果需求;服务端的osgEarth 集群负责显示HLOD 数据结构的高层级数据(高层级数据的数据量相对大),显示三维场景的细节。
该混合渲染方法既能减少客户端的数据压力和资源压力(降低了客户端电脑的指标要求),保证用户视图操作的快速响应和平滑效果,又能通过调用服务端osgEarth 集群的分布式并行渲染能力,满足三维场景细节快速显示的需求。
在客户端与服务端混合渲染方法的具体实现方面,服务端不需要参与每个视图的渲染。本文通过HLOD 层级瓦片筛选规则确定客户端负责渲染情况与服务端负责渲染情况。
在3D Tiles 数据HLOD 数据结构中,每个层级都带有一个属性geometricError,根据该属性和当前视图参数,可以计算对应的屏幕误差ScreenSpaceError。
本文设定一个最大屏幕误差(Maximum ScreenSpaceError)、一个层级递减系数(Screen SpaceErrorScale)、一个最高层级几何误差(GeometricErrorMax),将混合渲染标识(DisplayType)的初始值设为0。最大屏幕误差、层级递减系数及最高层级几何误差的取值分别举例为16 个像素、4 及32 m[1]。
对于每次三维视图刷新操作,客户端浏览器需要遍历3D Tiles 数据HLOD 数据结构[4],对每个层级的ScreenSpaceError 进行计算,并且按照如下规则进行筛选和操作:
(1)当几何误差大于或等于最高层级几何误差时,判断屏幕误差是否小于最大屏幕误差。若小于,则设定层级瓦片的显示标识为不显示,不修改混合渲染标识的值。若大于或等于,则设定层级瓦片的显示标识为显示,不修改混合渲染标识的值[1]。
(2)当几何误差小于最高层级几何误差时,判断屏幕误差是否小于最大屏幕误差。若小于,则设定层级瓦片的显示标识为不显示,不修改混合渲染标识的值。若大于或等于,则将屏幕误差除以层级递减系数并得到误差值(error),判断误差值是否大于或等于最大屏幕误差。若大于,则设定层级瓦片的显示标识为显示,不修改混合渲染标识的值;若小于或等于,则设定层级瓦片的显示标识为不显示,将混合渲染标识的值改为1[1]。
混合渲染标识用于决定是否启动服务端渲染。当所述混合渲染标识的值为0 时,客户端进行渲染;当所述混合渲染标识的值为1 时,客户端负责低层级数据渲染,同时启动服务端渲染,服务端负责高层级数据渲染,同时附带必要的低层级数据[1]。
上述层级瓦片筛选规则如表1 所示。
表1 层级瓦片筛选规则
通过以上计算和筛选规则,实现客户端Cesium 负责加载显示3D Tiles 数据HLOD 数据结构的低层级数据、服务端osgEarth 集群负责显示HLOD 数据结构的高层级数据。
服务端分布式并行渲染是客户端与服务端混合渲染方法的实现关键。服务端分布式并行渲染需要消息触发并行渲染任务,将完成的结果图片传回客户端浏览器,这个过程比较复杂,本文通过三级缓存策略实现了解耦,使得渲染流程更加稳健[5]。三级缓存策略的具体实现过程参见下文的系统设计与实现章节。
TeleGIS 三维大数据Web 显示系统不仅要实现单个用户任务的分布式并行渲染,还要实现多用户并发请求的响应。为此,本系统通过配置文件设置每个渲染节点启动osgEarth 的最大实例数量和每个3D Tiles 数据需要的并行渲染osgEarth 实例数量,根据渲染节点数量明确当前渲染集群支撑的最大用户并发数量[6]。
当用户并发数量不超过最大数量时,正常启动新的osgEarth 实例,响应新用户的数据渲染请求;当用户并发数量超过最大数量时,告知当前用户集群已经满负荷,暂时无法提供服务。另外,当用户长时间没有操作时,服务端对应的osgEarth实例会被销毁,释放的资源被提供给其他用户。
TeleGIS 三维大数据Web 显示系统结构如图1 所示。TeleGIS 三维大数据Web 显示系统主要由客户端浏览器、服务端Cesium 网页服务、服务端3D Tiles 数据服务、服务端并行渲染服务、服务端osgEarth 集群5 个部分组成。其中,服务端Cesium 网页服务、服务端3D Tiles 数据服务是Cesium 技术本身的设计,主要实现客户端渲染任务;服务端并行渲染服务、服务端osgEarth 集群是本系统的自定义设计,主要实现服务端渲染任务。以上组成结构负责完成下文的显示操作响应处理流程。
图1 TeleGIS 三维大数据Web 显示系统结构
TeleGIS 三维大数据Web 显示系统典型的显示操作响应处理流程如图2 所示。
图2 显示操作响应处理流程
(1)网页初始化和渲染服务初始化。客户端通过浏览器访问服务端的Cesium 网页,获得Cesium JavaScript 三维数据处理能力,并通过3D Tiles 数据服务加载三维场景数据,完成Cesium 网页的初始化[1]。在Cesium 网页上创建一个等大窗口的画布,响应用户视图的操作和请求,并开启混合渲染模式,完成渲染服务的初始化[1]。
(2)通过层级瓦片筛选规则实现混合渲染控制。客户端根据用户的视图操作,基于三维场景数据中各层级瓦片的几何误差(geometricError)计算对应的屏幕误差(ScreenSpaceError)。基于上文所述的层级瓦片筛选规则,对混合渲染标识displayType 进行更新,并决定是否启动服务端渲染。当混合渲染标识displayType 的值为0 时,客户端进行渲染;当混合渲染标识displayType 的值为1 时,客户端负责低层级数据渲染,同时启动服务端渲染。
(3)服务端分布式并行渲染。服务端接收所述数据渲染请求后,对三维场景数据中的高层级数据和必需的低层级数据进行并行渲染,并基于三级缓存策略将渲染结果刷新到客户端,完成三维场景数据的混合渲染。
客户端调用cesiumWidget.scene.render 方法对三维场景数据的低层级数据进行渲染。当所述混合渲染标识的值为1 且距离上一次视图参数变化超过预设的第一时间间隔(如50 ms)后,基于用户选择的数据信息和视图参数向服务端发送数据渲染请求。通过第一时间间隔updateViewpoint方法设置,避免用户视图频繁变化,不断向服务端发送高层级数据渲染请求,进而降低服务端的压力[1]。
服务端接收所述数据渲染请求后,清空服务端的任务队列,新建若干个三维场景渲染子任务并添加至任务队列,基于所述任务队列将三维场景渲染子任务分配给若干个worker 进程并进行并行处理[1]。
新建若干个三维场景渲染子任务的原因是osgEarth 显示三维场景是一个渐进式显示过程,需要在特定时间内不断从osgEarth 获取渲染完成的渲染子图片[1]。
各个worker 进程接收三维场景渲染子任务后,基于三维场景渲染子任务判断数据信息和视图参数是否变化。若变化,则更新osgEarth 的参数信息,从三级缓存中抓取对应的渲染子图片,并将渲染子图片汇总到服务端的二级缓存;若不变化,则从三级缓存中抓取对应的渲染子图片,并将渲染子图片汇总到服务端的二级缓存[1]。
客户端基于预设的第二时间间隔(如300 ms),将服务端二级缓存中存储的渲染子图片,通过WebService 请求循环刷新到客户端的一级缓存,客户端通过一级缓存中存储的渲染子图片不断更新画布的显示内容,完成三维场景数据的混合渲染[1]。
一级缓存有利于客户端即时响应用户视图的操作;二级缓存有利于解耦服务端三维场景数据的渲染流程和客户端向服务端请求渲染子图片的流程,各自按照实际需求确定刷新频次,使得服务端的数据渲染请求响应过程更加合理,提高整体渲染响应性能;三级缓存有利于实现服务端渐进式显示,充分利用osgEarth 固有能力。
基于系统设计,本文在3 个节点的虚拟机集群上进行了系统实验,并且导入了测试数据,进行了数据可视化测试。
虚拟机集群节点资源配置如表2 所示。测试数据是某地区约10 km2的三维场景数据,总数据量约30 GB。
表2 虚拟机集群节点资源配置
三维场景数据可视化结果如图3 所示。数据可视化测试表明,本系统能够完成海量、高密度、高精度的三维场景数据在线可视化任务。
图3 三维场景数据可视化结果
对于上述同样的三维场景数据,本文通过原生的Cesium 技术进行了可视化测试。测试结果表明,Cesium 技术虽然能够正常显示该三维场景数据,但场景细节放大时,场景细节渐进式显示耗时较长,通常需要数秒。在不同场景区域漫游过程中,客户端内存不断累积,最终导致浏览器崩溃。
与本文所述的客户端与服务端混合渲染方法相比,Cesium 技术使用客户端渲染方法,前文已经进行技术对比。Unreal Engine 的像素流送技术也是三维场景数据在线可视化的一种主流技术[7]。与像素流送技术相比,本文的客户端与服务端混合渲染方法主要存在2 个优势。
(1)客户端的低层级数据渲染保证了用户交互的流畅性。像素流送技术虽然通过使用WebRTC点对点通信框架,实现使用者和虚幻引擎应用程序之间低延迟,但用户交互还存在延迟,这是因为所有的响应都来自服务端。
(2)服务端的分布式并行渲染保证了系统的可扩展性。TeleGIS 三维大数据Web 显示系统通过集群的并行渲染,使得系统可以无限制支撑三维场景数据量和密度,无限制支撑客户端用户数量。Unreal Engine 的像素流送技术在这两个方面都受制于单一服务端节点的硬件资源配置,不能通过集群进行扩展[8]。
本文的客户端与服务端混合渲染方法的主要劣势是实现过程较复杂,包括服务端的集群调度过程,为系统的编码实现和部署带来一定的困难,系统运行的稳定性也有待检验。
本文通过关键技术研究、系统设计与实现、系统实验与测试及同类技术对比,证明了客户端与服务端混合渲染方法的可行性和优越性。
TeleGIS 三维大数据Web 显示系统的实验和测试基于虚拟机集群,如果基于装有GPU 显卡的物理机集群进行系统部署,将能够极大地提升系统显示性能,包括三维场景数据显示速度及数据量和用户量的支撑能力。