罗德宁,刘启虞,郭德全
(成都信息工程大学 自动化学院,四川 成都 610255)
在城市发展过程中,数字孪生技术[1-2]是智慧城市[3]实现数字化-智能化-智慧化跨越的一个重要途径。利用数字孪生技术实现物理世界和数字世界的虚实融合与交互,能够解决物理世界中不可能完成的一些工作[4]。物理世界的数据众多,包括时空基础数据、物联感知数据、网络传输数据、业务应用数据以及运行评估数据等。其中,时空基础数据又包括矢量数据、影像数据、高程模型数据、地理实体数据、地名地址数据、3维模型数据等[5-6]。如何将这些海量数据构建成一个孪生化数字世界是3维图形绘制中面临的一个巨大挑战。3维地形绘制是数字化世界的底座,目前一般的硬件还难以支撑海量数据的绘制算力,亟待提出更高效的绘制方法[7-8]。
目前,学术界和工业界提出了多种3维地形绘制方法,主要通过地形分块[9]、视锥裁剪[10]、层次细节(LOD)[11]、Out-of-core[12]、曲面细分[13]等技术提高绘制效率。Losasso等[14]提出几何裁剪图(geometry clipmaps)算法,一种基于视点连续的细节层次方法,地形高程数据作为纹理图像,采用Clipmap结构组成嵌套的规则网格形式的几何数据进行绘制。Li等[15]利用总面积表(SATs)加速地形绘制与采用几何着色绘制多分辨率地形,解决Geometry Clipmaps中LOD控制和细节不足的问题。Dick等[16]利用GPU(graphics processing unit)光线投射获取Out-of-core地形瓦片,相比光栅地形绘制过程具有可伸缩的性能优势。刘浩等[17]提出一种支持大规模地形瓦片数据调度的实时绘制算法,将大规模地形数据以瓦片金字塔形式存储于磁盘,每帧只需调度当前视点相关的少量瓦片进入显存绘制。通过这些方法和技术,3维地形绘制的效率得到了很大提高。
城市全要素场景包含多个图层,主要有地形层、道路层、建筑层、绿化层、水域层,以及城市治理方面的人口层、产业层、部件层、公共服务资源层等多类图层。数字底座的地理地形数据又包括数字高程模型和数字影像(包括卫星图像、航拍图像)等。目前对影像数据的处理方式主要采用空间网格划分[18]、建立层级由低到高的统一尺寸瓦片数据,然后由地形服务器发布数据服务,客户端发起请求后返回瓦片数据绘制在显示设备上。Zhang等[19]提出一种基于柔性动态拼接条带(DSS)的多层GPU细分实时地形绘制方法,能够获得更好的视觉效果。四叉树LOD调度[20]在大规模地形绘制中是一种非常有效的数据结构,有利于地形数据的高效组织与调度。Campos等[21]优化了3类不同的地形绘制数据简化方法,以并行调度瓦片方式提高绘制性能。同时,GPU能够利用图形绘制管线的编程性特性提供强大计算能力来提升3维绘制效率和效果。Kang等[22]提出在GPU上利用多分辨率细分技术优化地形绘制,从而达到大规模地形数据的绘制能力。Zhang等[23]通过基于GIS的数字地形分析方法预先计算地形特征的粗糙度和自遮挡信息来提高地形的绘制能力。
数字孪生城市将成为智慧城市发展新阶段的核心底座,成为城市虚实共生的数字基础设施[24-25]。随着地理数据采集技术的发展,地理数据呈现出几何级数的增长,海量数据的访问和绘制都是需要攻克的技术难题。因此,本文提出一种基于TMS的分层影像数据实时绘制方法解决海量瓦片数据的访问、索引和绘制问题,以及不同层级衔接处出现严重色差的问题。
本文提出自建地形服务的分层影像数据实时绘制方法涉及影像数据处理和分层3维绘制两个方面的主要内容。影像数据处理包括影像校色、影像切片和瓦片数据服务发布;分层3维绘制包括视口数据请求和分层影像混合。
对于获取的影像数据往往不符合3维地形绘制系统的数据大小、格式等要求,通常需要进行处理。例如获取一整张卫星影像或无人机航拍后3维重建导出的影像,需要对其进行切片才能满足系统的调度要求。同时,为了更好地处理不同层级影像的色差,首先要对各层影像进行校色,再进行切片。而不是在大量已切片的瓦片数据中去查找需要校色的瓦片数据,工作量大而且容易出错。因此,影像数据处理包括3个步骤:影像校色、影像切片和瓦片数据服务发布。
对不同影像层进行混合绘制时,在衔接处容易出现严重的色差。因此,在影像预处理阶段,对获取的影像图像进行校色,能够获得更好的效果。例如,利用Photoshop图像处理软件中的图层蒙版、色彩平衡等工具将部分色差太大的影像层与其他的影像层进行颜色拼凑,能够让各层图像过渡更自然。相邻影像层校色前后混合效果如图1所示,图1(a)校色前箭头指示处影像层之间色差较大,图1(b)校色后这些区域过渡更自然。
图1 相邻影像层校色前后混合效果Fig.1 Blended effect of adjacent image layers before and after color correction
地形服务包括WMS(web map service)、WMTS(web map tile service)、TMS等协议规范,不同的协议存在瓦片形状、尺寸及坐标原点定义的差异,这对客户端获取瓦片数据请求地址也有所不同。
本方法对影像切片采用基于TMS的瓦片金字塔切分方法[26],这是一种相对简单、可扩展、开源的瓦片金字塔分割方法,它可以很容易地应用于数字孪生城市分层影像的管理。同时,TMS采用的切片方式是自下而上,从高分辨率到低分辨率依次生成瓦片,这样可以有效减少生成瓦片的数量,提高绘制效率和渲染速度。对于其他协议可以根据不同协议的规则进行转换,与采用WMTS方式不同,访问影像资源的目录路径也就不同。例如,WMTS和TMS的关系是层级(Level)和行号(Column)一致,这两个方式计算出的row值相加等于 2level-1。瓦片金字塔切分的四叉树结构如图2所示。由图2可见,TMS采用四叉树结构划分瓦片,能够实现空间递归分解,图2(a)中,矩形代表叶子结点,圆形代表非叶子结点。
图2 瓦片金字塔切分的四叉树结构Fig.2 Quadtree structure of the tile pyramid segmentation
通过基于TMS协议对影像数据切片后得到大量金字塔瓦片数据,同时通过xml文件对各级瓦片数据的边界、扩展类型、坐标等信息进行管理。有了这些数据后,通过高并发能力强的Nginx发布瓦片数据服务,从而获得发布影像数据服务URL,并且采用Master-Worker模式高效处理客户端对瓦片数据请求。
同时将地形切片数据放到Nginx服务器下,获得发布地形数据服务的URL。因此,通过自建地形服务能够对分层影像数据的海量瓦片数据进行管理,也能够灵活地组织不同区域、不同精度要求的影像数据的绘制。
通过请求视口内需要绘制的瓦片数据索引获取影像数据,然后进行地形网格构建和分层影像混合。
影像数据的绘制不是一次性将服务器上的所有影像数据传递到本地进行绘制,海量数据根本无法快速传输和绘制。只有通过按需绘制方式,根据视口内需要绘制的范围、层级获取瓦片数据,才能提高绘制性能。本文主要通过动态加载未在视口内的影像数据和卸载不在视口内存在的数据,加速大量数据传输和绘制。例如,针对地形网格的构建,获取到视口中所有可见的地形瓦片并根据加载此瓦片的相对优先级放入到高、中、低3个队列中,并且根据队列优先级依次加载瓦片并获取当前瓦片的瓦片集,其中高优先级的瓦片最先被加载,低优先级的瓦片最后被加载,随着视口的变化,队列中的数据进行动态的变化与管理。本方法设计了巧妙的各层影像配置结构便于视口数据的请求,因此,视口数据请求首先对影像配置文件进行解析,然后根据视口范围获取各层影像的数据瓦片。
2.1.1 数据解析
首先读取分层影像数据JSON配置文件,包含数据来源标签“Source”、地形数据层“TerrainURL”、影像层“ImageURL”3个标签属性。该配置文件与后面各层图像混合绘制息息相关,能够实现灵活的大量数字孪生城市分层影像的层级、顺序、位置的控制管理。每个子数据包括位置信息键“Location”,影像层地址数组“URL”,和等级数组“LEVEL”。例如{“Location”: “Global”,“URL”:[“http://URL/Global/tilemapresource.xml”],“LEVEL”:[“9”]},将Global图层为配置示例中全球第9级图像,在数据解析中定义为Overlay0,以此类推;例如{“Location”: “Chengdu”,“URL”:[“http://URL/Chengdu_14/tilemapresource.xml”,“http://URL/Chengdu_18/tilemapresource.xml”],“LEV EL”:[“14”,“18”]},Chengdu_14被定义为Overlay1,Chengdu_18被定义为Overlay2。如果还有更多图层,Overlay的后缀依次递增,也就是说,Overlay下标越小,层级越低。在地形每次叠加一个影像服务就必须生成一个影像服务对象,从而构建出多个影像服务对象。每个影像服务对象保存着配置服务器发布的URL地址,然后根据URL地址获取xml数据并解析,同时验证xml是否符合规范。对于符合xml规范的影像层,计算视口内影像切片索引和路径,通过影像行列坐标计算得到需要加载图片的子目录和名字,然后根据获取的URL和图片层级目录、名字和扩展名等,创建HTTP访问本地服务器的影像切片,从而验证并加载影像切片。整个影像服务数据的解析过程如图3所示。
图3 数据解析过程Fig.3 Process of data parsing
2.1.2 视口内各层影像获取
首先,进行地形网格构建,获取视口中所有可见的地形瓦片并根据加载此瓦片的相对优先级放入到高、中、低3个队列中。根据队列优先级依次加载瓦片并获取当前瓦片的瓦片集,能够加速瓦片数据的调度与绘制。当视口发生变化时,队列中不仅需要加入新的瓦片,还需要将不再可见的瓦片从队列中删除,以避免无效的加载和绘制。分层影像数据JSON配置文件中存储了地形URL,并且根据URL解析JSON数据确定地理坐标系统。
根据图形引擎中的相机,得到当前视口区域的地形是否可见。若是能够加载则将验证并获取JSON的MIME 类型,本地服务器采用MIME 类型为application/vnd.quantized-mesh。在地形网格构建中,计算网格的顶点坐标、数量、三角形数量、索引、法线等数据,从而构建出矩形地块,再由许多矩形地块构建出视口范围地形。
视口内各层影像获取过程如图3所示,由图3可知,根据视口内的瓦片矩阵范围计算屏幕像素大小,利用式(1)获取影像瓦片的初步层级。如果影像层级大于当前文件资源的最大层级,则重叠影像层级为当前文件资源的最大层级;若小于则使用最小层级,从而确定影像的最终层级。
式中,l代表影像层级,R代表瓦片的矩形范围,S代表瓦片的屏幕像素点。
获取到影像层级后,计算视口内影像瓦片的索引,使用经纬度、层级计算行列号,采用向下取整,如式(2)所示:
式中,c为 列号,r为行号,X为经度,Y为纬度。
由于一个层级的影像瓦片数据路径为“...图层名lc .ext”(ext为png、jpg、tiff等后缀名)。因此,根据获取到的影像层级l和行列号构建出一个影像资源的URL路径。
最后,当URL转换后就会创建HTTP请求访问URL上的资源,若是请求成功验证图片格式,并且标记图片是否能被加载,不能被加载返回一张空图片。
为了使两个影像图层更好地过渡,采用式(3)进行图层混合。如果透明度Alpha为0,则使用底层图像;如果为1.0,则使用顶层图像。如果透明度Alpha介于0与1.0之间,按照通道混合。
式中,FC为混合后的最终颜色,BL为底层RGB颜色,TL为顶层透明通道值,A为Alpha值。
在多层影像绘制过程,根据影像服务对象构建过程中确定的影像图层顺序,依次从最底层开始,两两图层(下标小的作为底层,下标大的作为顶层)依次混合,混合结果作为底层逐渐与上层混合,直至最上层混合完成,输出最终图像。例如,第2.1.1定义的分层影像数据JSON配置文件,首先Global图层Overlay0与Chengdu_14图层Overlay1混合, 混合结果再与Chengdu_18图层Overlay2混合。如果还有更多图层Overlay,至底向上不断混合,直至最上层混合完成,输出最终图像。
本文的实验数据及效果对比图都在同一配置环境下进行。实验平台采用AMD Ryzen 9 12-Core 3.80 GHz处理器, Nvidia GeForce RTX 2070 SUPER 8GB图形显卡及3 200 MHz 32 GB内存。
本文针对实际应用中的多层影像数据叠加效果进行了相关实验。首先,针对一个区域的3层影像进行叠加绘制,最外围采用全球9级卫星影像,中间采用14级卫星影像,最高层采用18级卫星影像,如图4所示。
图4 多层影像叠加示例Fig.4 An example of multi-layer image overlay
通过本绘制方法的分层影像数据叠加效果如图5所示,各层影像能够逐层融合叠加,减少了不同层级影像衔接处出现严重色差的问题。
图5 多层影像混合后结果Fig.5 Result of multi-layer image blending
为了对比本地地形服务和在线地形服务的分层影像数据加载和绘制过程,本方法与Cesium在线加载影像数据作了对比,如图6所示。图6(a)、(b)为远视角图像,本方法的影像图层间没有明显色块,消除了色差;图6(c)、(d)为近视角图像,本方法的影像清晰。本方法数据调度过程平滑,而且有较好地展示效果。
图6 本方法与Cesium调度效果Fig.6 Compared with the scheduling effect of Cesium
同时,针对本方法与Cesium调度效率上做了性能比较,如图7所示。在测试场景中,镜头从高空到低空,逐步将尽头拉近到“天府广场”位置处,在将近4 600帧的数据动态调度过程中,本方法(方形点)地形影响数据调度和绘制稳定,没有Cesium(圆点)过程中较大的帧率跳变,并且保持300 FPS的高实时性能。
图7 本方法与Cesium调度性能对比Fig.7 Compared with the scheduling performance of Cesium
最后,本方法针对其他区域(近、中、远景及沿海等)影像数据的叠加效果做了对比,如图8所示。实验表明,通过本方法对分层影像数据的绘制,能够实现高质量的绘制效果。同时,针对影像数据内存占用量进行了监测,因为是通过分层分块的影像数据动态调度过程,内存增量变化在200 M内,性能也较稳定。
图8 更多区域分层影像绘制效果Fig.8 More examples of layered image rendering for different regions
本文针对海量瓦片数据的访问、索引和绘制,以及不同层级影像衔接处出现严重色差的问题,提出了一种基于TMS的自建本地地形服务的分层影像数据实时绘制方法。首先,构建不同影像层的服务对象,针对视口内符合规范的影像图层,计算影像切片索引和路径,并且通过影像行列坐标计算和获取影像切片。具体地,针对地形网格的构建,获取视口中所有可见的地形瓦片并根据加载瓦片的相对优先级放入到高、中、低3个队列中,并且根据队列优先级依次加载瓦片并获取当前瓦片的瓦片集加速瓦片数据的调度与绘制。根据视口内的瓦片矩阵范围计算屏幕像素大小,获取影像瓦片的初步层级,并且与当前文件资源的层级比较确定影像的最终层级。然后,计算视口内影像瓦片的索引和利用经纬度、层级计算行列号,从而形成影像资源的请求路径,加速影像索引。最后,在多层影像绘制过程中,根据影像层级大小依次从最底层开始两两图层依次混合,得到正确的混合结果。实验结果表明,本方法能够灵活地绘制大规模多层级影像数据构建出数字孪生城市场景地3维地形,保持300 FPS的高实时性能和实现高质量的绘制效果。
本方法还存在一些未来要着重研究的工作,在影像切片的管理上还存在更高效的技术手段,例如影像数据流式方法调度,该方法可以将切片数据按需传输,从而减少网络带宽的使用,并提高数据传输的效率。同时,分层影像依附的地形网格构建方面,还存在一些问题需要解决,目前的地形网格构建方法主要是基于三角剖分和栅格化的方法,但是这种方法在高程精度的绘制调度方面存在一定的局限性。因此,需要研究更灵活的编辑方法来达到更高高程精度的绘制调度。例如,可以采用基于深度学习的方法来构建高精度的地形网格,从而提高地形数据的准确性和可靠性。