潘 欣,佘向飞
(长春工程学院 计算机技术与工程学院,长春 130012)
随着无人机和激光雷达技术的普及,人们可以很容易地收集一个区域景观的三维数据;这些三维景观可以作为旅游宣传和虚拟交互的重要展示平台,具有很高的应用价值[1]。当前,很多基于网页和移动端的应用均有较强的嵌入地面三维景观交互显示功能的需求,然而,传统三维模型数据的显示需要完成数据上传、权限管理、控件与后台数据传输内等多种内容,需要付出大量管理与代码编写代价,这严重限制了三维景观的使用与推广[2-3]。
通过将关键功能封装构造网页控件可以降低程序编码的复杂性提高工作效率[4]。为了解决上述问题,本研究提出了一种基于服务的地面三维景观模型网页显示系统(A service-based web display system for ground 3D landscape models,(S3D-landscape)。
基于服务的地面三维景观模型网页显示系统总体包含4个组成部分,其结构如图1所示。
图1 S3D-landscape的总体组成结构
S3D-landscape共包含了以下4个组成部分。
1.1.1 基础数据存储部分
基础数据存储部分以服务器文件的形式存储三维景观数据,对于一个地区的三维景观其数据包含:基于Mesh结构的三维模型数据,用于三维显示和交互;基于三维点云的数据,该数据来自于数据生成的第一个阶段(如利用无人机照片生成三维点云),这一数据是构建Mesh和进行一些典型空间计算的基础;地理区域信息,以Polygon格式存储的景观所对应的区域。基础数据存储部分主要负责以“工程”的粒度管理在文件系统中的数据,并可以将文件转换为网络数据流、利用三维模型形成快照图像。
1.1.2 数据管理与空间范围查询部分
数据管理与空间范围查询部分的主要功能是对基础数据存储部分的内容进行增、删、改、查的操作;对于Mesh和三维点云,该部分可以对模型的组成部分进行调整和优化,对于三维点云可视化删除冗余数据;对于空间位置信息,可以将其作为索引,进行基于位置的空间范围查询。利用该部分,系统实现对所有基础数据的一般数据管理操作。
1.1.3 三维展现部分
三维展现部分包含2个功能,一个是数据展现,为每个景观模型建立局部的坐标系统,将景观模型放置在三维展现视角的中心位置;并通过调整摄像机位置和参数,展现景观的不同效果;二是优化传输功能,根据应用和带宽的需求传输部分、全部和可见视角的数据。
1.1.4 网页显示服务部分
整合数据管理与空间范围查询部分与三维展现部分的功能,建立网页显示服务。该部分服务可以嵌入到HTML的<DIV>标签之中,以一个独立的网页控件实现三维景观数据的显示。该服务仅需要输入景观数据的编号、视角的参数就可以在网页加载过程中传输三维模型数据,并将对应的内容显示出来,用户可以和网页控件交互来显示三维景观的不同内容。
以上4个部分互相支撑,基础数据存储部分支持数据管理与空间范围查询部分和三维展现部分;网页显示服务不直接和基础数据交互,而是通过空间范围查询部分与三维展现部分交互部分的功能间接地获取三维内容;这样的结构一方面保证数据安全性,获取服务方不能直接获得数据真正的全部存储路径和内容,另一方面保证灵活性,使得网页显示服务可以适应更广泛的场景和内容。
本系统以文件管理、三维显示作为设计的核心,系统静态的类结构如图2所示。
图2 系统的类图
系统的类结构如下。
用于服务器文件管理的类:主要包含抽象的Server-File类,该类封装了在服务器上文件管理的所有必要操作;该类的子类包含用于Mesh文件的MeshFile,用于三维点云的CloudFile和用于地理位置选定的ShapeFile;多组ServerFile共同组成FileGroup,每个FileGroup实例对应一个地面景观。
用于FileGroup管理的类:本系统使用Group类来管理FileGroup的增删改查操作和基于空间范围的检索;该操作调用Modify和SpatialSearch来实现具体的操作。Group还开放了ManagerAPI接口,通过该接口可以调用Group类的所有功能。
用于三维显示的类:本系统使用Display类来实现所有三维显示功能,该类还开放了DisplayAPI作为调用接口。Display类通过调用ViewPoint类和Transmission类来实现具体的功能。对于Display所需的数据内容,通过调用ManagerAPI接口间接获得所有数据。
网页服务功能类:系统通过WebDisplayServices类来对ManagerAPI接口和DisplayAPI接口进行封装,该类调用RESTFul实现网络服务功能并利用Jason-Pararmeter类来封装所有的参数,进而实现所有网页服务功能。
在以上类的支持下,在网页中嵌入地面三维景观显示控件并展现三维内容的过程如下。
1)在网页的<DIV>标签中嵌入控件,根据页面加载事件触发异步的三维数据加载显示功能。
2)指定需要获取的数据文件的编号参数,指定显示细节内容参数,利用JasonParameter进行封装。
3)将封装参数传输给ManagerAPI接口和Dis playAPI接口调用对应功能,通过RESTfulFunction读取数据内容,读取完成后结束异步操作。
4)在<DIV>标签中调用画板功能,绘制三维内容。
5)依据用户视角操作调整显示细节参数并转到步骤3)形成交互显示的功能。
6)网页显示结束整个控件生命周期结束。
通过以上6个步骤,可以异步的、可交互的实现地面三维景观的显示功能。在S3D-landscape系统中,一次三维地面景观显示的协作过程如下。
一次三维地面景观显示的协作过程首先由系统使用者SystemUser发起(可以是使用系统的人也可以是外部调用服务的系统),SystemUser将视角的变化发送给Display类,Display类会综合分析当前所见内容的地理位置和三维视觉中摄像机的位置朝向,经过计算获得空间范围坐标发送给SpatialSearch类,获得的观察者视角发送给ViewPoint类;ViewPoint类会在一个三维区域内计算哪些地物可见或不可见,并建立可见内容列表发送给SpatialSearch类。SpatialSearch类综合空间位置和可见内容进行空间范围查找,获得在SystemUser可视范围内的三维景观列表,并基于该列表选择模型对照的文件组FileGroup。FileGroup依据内部数据记录找到服务器上的三维模型文件,之后启动ServerFile类的实例关联该文件;ServerFile负责分块地传输文件中的所有内容,其初始化之后首先建立Transmission的实例;Transmission类建立与Display的网络链接,并逐步地将ServerFile关联文件的内容传输给Display;在传输结束之后Display触发重绘事件,重新绘制所有数据内容,将三维景观的内容显示给SystemUser。在该协作过程的帮助下,系统综合利用系统内部的6个类对视角变化到数据显示的过程进行了封装;这一过程屏蔽了三维数据范围查询、服务器文件传输和三维内容刷新显示的复杂性,对于SystemUser,仅仅将视角变化的内容发送给系统,就可以获得对应三维景观数据内容的显示。通过这一协作过程,系统完成了控件化、服务化的地面三维景观模型显示功能,如图3所示。
图3 一次三维地面景观显示的协作过程
本研究使用Python 3.8实现所有功能,系统可以部署在服务器上,客户可以通过浏览器访问对应的功能。本系统也可以对外部系统提供网络服务功能,相关的服务功能可以通过Web Service模式提供地面景观三维模型各种管理功能。
由于设计为基于服务的模式,系统的三维模型增、删、改、查操作及交互和可视化功能均可以被其他系统调用。为了测试系统在简化调用方面的价值,本研究将传统直接编写代码模式和使用S3D-landscape嵌入模式进行对比,对在网页中嵌入地面三维景观显示的编码工作量进行分析;对比实验引入长春地区某软件企业5名有经验的程序员的工作数据,数据中包含三维景观模型各个阶段开发工作的工作量记录,对比使用传统模式与S3Dlandscape之后的工作量变化,每一阶段编程工作均取5名程序员工作量的均值计算。具体对比结果见表1。
表1 实现地面三维景观显示的工作量对比
由表1可知,对于不同的程序设计阶段S3D-landscape均可以有效地降低程序员的工作量。
对于软件产品的开发:在三维景观数据存储阶段,由于程序员需要考虑数据存储位置、数据存储权限及文件编号等问题,所以出传统模式需要48.25 h;而在本系统辅助下仅需1.50 h。在三维景观数据传输阶段,该阶段的关键问题是如何将三维模型文件序列化为网络流,此时需要进行大量的传输状态、流状态、断点续传和多线程协同操作;此阶段需要程序员工作77.5 h,以每天10 h计算,需要1名程序员超过一周的时间才可完成;对于此阶段内容利用本系统仅需要2.25 h,工作量和工作难度大大降低。对于网页嵌入阶段,该软件企业原有的模式是调用成型的三维显示控件,该控件本身具备较多的辅助功能,但是这些辅助功能不是专门为地面景观三维显示服务的,程序员需要在众多参数中筛选并同时阅读开发文档,所以开发时间为34.75 h;而本系统由于功能相对较少,调用容易,所以仅需1.75 h。在交互实现部分,需要实现用户鼠标与显示界面的交互,同时计算视角、方向坐标的变化并进一步显示内容,该部分在使用其他第三方控件的时候仍然会遇到原始控件功能过多,程序员调用和调试较为耗费时间的问题,开发时间需要48.00 h;而利用本系统,由于专门面向地面三维景观交互,典型的交互手段已经进行了封装,所以程序员仅需要1.25 h便可实现对应功能。可以看出S3D-landscape可以极大地简化需要使用地面三维景观的软件开发阶段的工作量,S3D-landscape更加简化且更易于调用。
对于软件产品的迭代与优化:对于整个产品的功能优化传统方法需要16.25 h,而由于本系统提供的功能已经进行了较多专门针对性的优化,所以仅需要1.50 h。在产品需求迭代阶段,可能根据新的需求对产品的内容逻辑进行修改,此时代码的封装性十分重要;如果直接编写代码势必会导致地面三维景观模型显示的功能与软件产品的业务逻辑紧耦合,增加功能修改难度;本系统将所有三维显示功能进行了封装,使得软件产品各个模块直接耦合度降低,从而提高产品需求迭代的效率。在数据维护阶段,系统已经将相关操作原子化,所以相比传统方法的8.00 h,利用本系统仅需要1.25 h。
由表1中可以看出,在开发软件产品时,实现地面三维景观显示这一功能的各个阶段均需要大量的编程工作,而利用S3D-landscape可以显著降低工作量。从总体上看,直接编写代码模式总计需要243.50 h,即便对于一个有经验的开发团队也是较难在短时间内完成的。而利用S3D-landscape总计仅需要12.15 h,仅需要一名有经验的程序员2 d便可完成。以上实验结果表明,说明本系统能够显著降低网页应用中展现三维数据的工作量,可以有效提高相关软件产品研发的效率。
在很多宣传和旅游的应用与网页程序中均需要显示地面三维景观数据以提高访问者的体验,然而实现这一功能需要大量的开发工作来支撑。本研究提出了一种基于服务的地面三维景观模型网页显示系统,通过对数据访问、存储、显示及网络交互功能的封装,该系统将复杂的编程工作转变为简单的API调用工作;实验表明,利用本系统可以大大地降低开发人员的工作量,使相关团队可以用较小的成本开发相关产品,且具有较高的使用价值。