基于ODM和Cesium的无人机倾斜摄影建模及可视化
2020-05-16左小清
王 旭,左小清
(昆明理工大学 国土资源工程学院,云南省 昆明市 650093)
0 引言
ODM(OpenDroneMap)是一个基于 Linux平台的用于处理空中无人机图像的开源工具包,用于处理原始UAS(Unmanned Aerial Vehicle)图像到点云、数字表面模型、纹理数字表面模型、正射成像、分类点云、数字高程模型等[1]数据,其成果数据包含真实地理坐标(依据源数据坐标系),且可通过提供飞行位置姿态以及GCP(Ground Control Point)提高精度。
Cesium是一个用于开发三维WebGIS客户端的开源JavaScript开发包。采用 Cesium作为客户端不存在浏览器依赖性,其源码采用ES6语法进行模块化,渲染采用OpenGL规范的shader文件进行渲染,支持对js源码和shader进行更改。在GIS方面,其支持OGC标准的服务,支持多种通用三维数据,且提出了目前通用格式中唯一支持大量地理 3D数据流式传输和海量渲染的三维模型切片格式3DTiles。
两者结合可以完成无人机倾斜数据的处理到可视化的整体流程。
1 系统总体框架
ODM(OpenDroneMap)和Cesium分别负责数据处理和可视化,但数据存储、功能调度、服务发布等业务流程需要借助Java Spring、Docker、GDAL、PostGIS等技术,因此需要对系统的整体框架进行设计开发。
Cesium结合 ODM进行三维WebGIS开发的系统架构设计主要是依据系统的功能需求对软件设计进行建模,侧重于软件用例实现和分层架构表达。从软件业务设计、公共组件设计、软件集成和部署等多个方面进行设计工作,完成基于架构的软件概要设计。本研究中系统总体架构由如下四个层次构成,如图1中所示。
图1 无人机数据处理系统架构Fig.1 UAV data processing system architecture
(1)数据存储:影像处理前后主要以文件形式存储无人机的栅格数据及其他成果数据,以postgis存储空间信息和对应文件路径。文件式存储方便操作源栅格进行科学计算,但对于栅格数据的信息在数据库层运用极少。因此系统存储主要包括两部分,无人机数据存储、无人机数据处理结果数据、三维模型转换后的数据这类非结构数据在文件中存储与组织。数据的元数据、用户数据,系统日志信息存储在Postgis数据库中。缓存信息由redis数据库处理。
(2)系统支撑:根据业务功能,提供数据的存储与传输,包含sql处理、数据缓存、文件IO,主要由Jva Spring 的MyBatis做ORM。
(3)业务应用层:包含无人机数据处理,服务器监测、权限管理、静态资源解析,主要模块为封装 ODM进行无人机数据处理。其中数据传输处理与转换依据功能需求和业务层基于 JAVA spring框架设计并封装restful风格接口。
(4)前端交互与可视化:采用 VUE框架结合Cesium将上层业务平台中的各个业务模块进行聚合进行前端搭建。Vue组件式开发登陆认证、上传下载表单、获取数据信息等界面,结合Cesium做三维前端可视化。
本文中无人机数据处理系统主要为 WebGIS系统和传统C/S结构相比,要充分发挥Web应用的内在潜力,挖掘应用深度和扩大适应能力,需要采用先进的应用架构和以实用为根本准则,使得系统既能满足业务需求,又能适应将来发展需要[2]。
2 基于ODM的无人机数据处理开发
本文无人机数据处理系统是以Web开发技术和三维 GIS技术为研究支撑,以上一节中软件系统总体架构的基础上,切分成多个微服务进行实现的。在主要业务服务中,通过http请求在服务之间进行通信。
2.1 影像数据处理服务
影像数据处理服务包含所有涉及无人机倾斜数据处理、转换、提取元数据的功能聚合为一个服务,有着完整的的日志记录和本地数据库,其中负责倾斜数据处理的ODM、成果数据转换的obtTo3D-tiles为微服务在框架中 service层进行微服务控制与调用,提取元数据的GDAL作为开发库直接在service层中开发调用,主要UML框架如图2所示。
ODM官方支持 linuix下docker的封装,数据处理前后通过访问数据存储服务记录元数据。当有新的计算请求时,访问服务器和Docker容器监测服务来进行业务判断,如果服务器压力过大则进行消息和任务队列。数据处理主要依靠docker-java创建Docker镜像,推送命令到Docker内封装的ODM计算模块执行运算, 依靠docker-java管理整个Docker容器的生命周期。以此实现了后端进行无人机数据处理的功能并发布服务。
2.2 ODM数据处理和格式转换
图2 数据处理UMLFig.2 Data processing UML
通过docker pull opendronemap/opendronemap安装在docker安装ODM的镜像,通过Maven在Java工程中引入Java-docker包,通过createContainer、startContainer等进行容器的控制,通过 Java的Process在docker具体容器中调用ODM命令进行数据处理,根据原始无人机数据目录在Process中执行本地命令:
docker run -it --rm
-v $(pwd)/images:/code/images
-v $(pwd)/odm_orthophoto:/code/odm_orthophoto
-v $(pwd)/odm_texturing:/code/odm_texturing
opendronemap/opendronemap
指令的作用是通过 OpenDronMap 对 odm_test_1/images目录下的图像文件同时进行正射影像(odm_orthophoto)和纹理网面建模(odm_texturing)的图像处理,opendronemap/opendronemap是指明需要调用的镜像,这里是调用Repository为opendronemap/opendronemap的镜像,可以用该镜像的 tag(如果有设置的话)和镜像ID替代。产生数据如图3所示。
图3 正射影像和倾斜模型Fig.3 Orthophoto and oblique photogrammetric model
执行过程中会返回处理状态信息如图4所示,通过 Process读取信息并进行正则分析提取进度百分比,以服务方式发布json数据在前端展示进度。
图4 数据处理状态Fig.4 Data processing status
成果三维模型数据为.obj格式,为支持前端大数据量三维可视化需求,需要对数据进行三维切片。此功能通过部署单独的 nodejs微服务集成obtTo3D-tiles开源工具做转换。
3 数据组织管理
3.1 三维模型数据
目前三维数据主要以非结构化数据形式生产和应用,无人机数据处理主要涉及三维模型、点云等数据。涉及文件格式种类繁多,包括.pcd、.obj、.stl、.3Ds、3Dtiles等。
obj文件是一种标准的3D模型文件格式,很适合用于 3D软件模型之间的互导[3]。obj文件包含.obj、.mtl和纹理图片,其中.obj文件提供几何信息,.mtl文件定义材质信息;
3D Tiles是一种三位瓦片技术,在gltf的基础上加入了分层LOD的结构,是专门为大量地理3D数据流式传输和海量渲染而设计的一种格式,也开源WebGL框架Cesium的官方格式。其用于流式传输和渲染大量 3D地理空间内容,例如摄影测量,3D建筑,BIM/CAD,实例化特征和点云。它定义了分层数据结构和一组可交付内容的图块格式。在3D Tiles中,tileset是按空间数据结构(即tree)组织的一组tile。至少一个tileet JSON文件描述了tileet,其中该JSON文件包含tileet元数据和tile对象树,其中每个对象都可以引用表1中的格式对应的可渲染内容。
表1 Tile引用格式Tab.1 Tile reference format
tile的内容除了以上的渲染内容,还包括特定格式的二进制块,包含特征表和批处理表。上述的批量3D模型(b3Dm)和实例3D模型(i3Dm)是基于glTF构建的,点云格式不嵌入gltf中。tile如图5所示以树的结构来组织,其结合了层次LOD的概念,优化渲染空间数据。在树结构中,每个 tile都有一个边界包围盒在空间中完全包围该 tile和子节点的数据。其中,树的组织结构可以是kd树,四叉树或者grid。
图5 Tileset树Fig.5 Tileset tree
3.2 数据存储
数据存储是指对空间数据逻辑模型描述的数据组织关系和编排方式,对地理信息系统中数据存储、查询检索和应用分析等操作处理的效率有着至关重要的影响。本方案同时同一空间数据逻辑模型采用了多种空间数据结构[4],针对标准和协议的不同存在着不同的数据格式。其中正射影像、3DTiles等ODM的成果数据采用文件格式进行非结构化存储,通过GDAL库和其他技术提取的文件的元数据及矢量信息通过数据库进行存储,最后通过数据库中存储文件地址与非结构化文件系统进行关联。
(1)非结构化数据存储
通过 ODM进行无人机数据处理后,可获得点云、数字表面模型、纹理数字表面模型、正射成像、分类点云、数字高程模型[1]。其与原始数据都以文件形式存储,为支持Cesium.js的前端可视化,格式转换后的 3DTiles等数据以文件格式存储,具体转换前后文件组织如图6所示。数据库里只存放地址、链接、元数据信息和用户信息进行关联。
图6 用户文件和转换数据用户文件组织Fig.6 User file organization and transform data user file organization
做非结构化数据存储和数据处理时,需尽可能使用单独的服务器,原因如下:多种格式数据内容,且需要数据处理时需要依据文件处理,没必要放数据库;数据处理和传输时占用带宽和计算资源,如果数据库和应用分离(即不再同一台服务器),那么取得一个图片需要从客户端到应用端取数据,应用又需要从数据库去取,这样会占用大量的带宽,同时这也会在数据库服务器和应用服务器两处 IO上形成瓶颈;如果图片单独放在服务器上,取图片的时候,则只需要客户端通过HTTP协议去图片服务器上取,减少带宽占用。并且,这里的IO瓶颈只存在图片服务器上,会快很多。
(2)数据库设计
数据库内数据为用户数据、部分osm的矢量数据和提取的无人机的元数据,其中元数据主要为栅格数据的地理元数据(空间坐标)。连接系统部分为Spring mybatis框架,在实际开发的时将其作为持久层框架简化sql操作。
数据库管理系统为Postgis,可以通过存储的空间数据建立空间索引并集成部分空间运算,其优势是既可以方便数据统计和监测,又可以在大量地理信息数据中快速查询符合条件的非结构化数据文件地址,通过传文件地址方便前端进行快速可视化,其具体组织如图7。
图7 数据库设计Fig.7 Database design
需要动态展示和处理部分矢量数据,由于 shp格式数据处理和查询较慢(一定条件下Postgis的表查询不建立索引比shp格式的数据存储快125倍,建立索引快338倍),因此按照osm格式在Postgis中建表,存储矢量数据。图8为具体表结构。
4 基于Cesium的前端可视化
数据处理后产生多种格式文件,其中正射影像和倾斜模型带有地理信息,可以直接应用于GIS系统中。数据处理转换后的 3DTiles发布为静态数据,前端使用 Vue.js集成 Cecium进行三维数据展示。
Vue是目前流行的前端三大框架之一,其异步批处理方式更新 DOM加速运行。提供组件开发用于解耦,将可复用的组件组合入应用程序。紧凑且无依赖。具有表达式无需声明依赖的可推导属性(computed properties)。Cesium源码使用ES6的模块化方式开发,通过gulp进行构建和封装,VueCli3版本后直接将Cesium打包后的文件直接放在public下,部署时直接复制到发布包的根目录相应文件夹下,不进行后续的webpack处理。
在VueCli中由于组件间数据传输通过data直接绑定数据,部分场景下,例如Cesium加载大量数据渲染情况下,会导致框架本身对数据持续进行监测影响渲染效率,因此需要将含有大量数据变化的对象提升为全局对象,不在data中绑定。因此在引入Cesium时,在main.js中全局引用:
import Cesium from "cesium/Cesium";
import"../node_modules/cesium/Source/Widgets/
widgets.css";
//全局注册变量
Vue.prototype.Cesium=Cesium;
//将viewer放到全局对象当中;
let viewer = new Cesium.Viewer('container');
window.earth = viewer;
通过 new Cesium.Cesium3DTileset({url: '3DTiles的json索引文件的url'})创建三维模型,viewer.scene.primitives.add函数添加进场景中,完成三维可视化。开发测试时使用nodejs环境提供的server运行,通过webpack技术进行打包优化。
图8 数据表Fig.8 Data table
5 运行效果
处理后数据虽然自带地理信息,但是由于系统本身未加载地形,所以需要设置模型贴地。直接调用函数进行设置,调整高度,height表示物体离地面的高度,偏移矩阵 modelMatrix可以由一个 translation来确定,通过调整height来获得不同的modelMatrix,视角缩放到瓦片集的时候调用changeHeight函数,加载处理后的3DTiles效果如图9所示。
图9 Cesium加载3DTilesFig.9 Cesium load 3DTiles
6 结论
本文通过研究Web应用系统和三维GIS技术,结合三维GIS集成无人机数据处理的需求,对无人机数据处理和可视化系统进行研究与设计。本文提出的系统方案釆用当前前沿的三维WebGIS技术,该结构各部分组件之间配合良好,功能强大,主要数据处理部分ODM通过docker-java封装,单独与Java Spring框架结合划分微服务,方便开发调用和扩展。基于Java Spring框架与开源WebGIS技术结合起来,在 Web应用系统通用功能方面釆用 Springboot+Mybatis+Vuejs的架构确保了平台的安全性,完整性、可移植性和可扩展性。在GIS特有功能实现上采用PostGIS作为空间数据库,GeoServer作为地图应用服务器,采用 GeoWebCache为地图缓存[5],以Cesium为客户端。以Tomcat为Web服务器搭建完成了无人机数据处理系统。
系统所使用的开发库均为开源软件,降低了开发成本,也使将来系统升级和功能扩展有了保障。在下一步的学习过程中将后端数据处理通过k8s技术,重新拆分微服务并进行 Docker容器的封装来集成大规模服务器集群下的容器扩展。