王 旭,左小清
(昆明理工大學(xué) 國土資源工程學(xué)院,云南省 昆明市 650093)
ODM(OpenDroneMap)是一個(gè)基于 Linux平臺(tái)的用于處理空中無人機(jī)圖像的開源工具包,用于處理原始UAS(Unmanned Aerial Vehicle)圖像到點(diǎn)云、數(shù)字表面模型、紋理數(shù)字表面模型、正射成像、分類點(diǎn)云、數(shù)字高程模型等[1]數(shù)據(jù),其成果數(shù)據(jù)包含真實(shí)地理坐標(biāo)(依據(jù)源數(shù)據(jù)坐標(biāo)系),且可通過提供飛行位置姿態(tài)以及GCP(Ground Control Point)提高精度。
Cesium是一個(gè)用于開發(fā)三維WebGIS客戶端的開源JavaScript開發(fā)包。采用 Cesium作為客戶端不存在瀏覽器依賴性,其源碼采用ES6語法進(jìn)行模塊化,渲染采用OpenGL規(guī)范的shader文件進(jìn)行渲染,支持對(duì)js源碼和shader進(jìn)行更改。在GIS方面,其支持OGC標(biāo)準(zhǔn)的服務(wù),支持多種通用三維數(shù)據(jù),且提出了目前通用格式中唯一支持大量地理 3D數(shù)據(jù)流式傳輸和海量渲染的三維模型切片格式3DTiles。
兩者結(jié)合可以完成無人機(jī)傾斜數(shù)據(jù)的處理到可視化的整體流程。
ODM(OpenDroneMap)和Cesium分別負(fù)責(zé)數(shù)據(jù)處理和可視化,但數(shù)據(jù)存儲(chǔ)、功能調(diào)度、服務(wù)發(fā)布等業(yè)務(wù)流程需要借助Java Spring、Docker、GDAL、PostGIS等技術(shù),因此需要對(duì)系統(tǒng)的整體框架進(jìn)行設(shè)計(jì)開發(fā)。
Cesium結(jié)合 ODM進(jìn)行三維WebGIS開發(fā)的系統(tǒng)架構(gòu)設(shè)計(jì)主要是依據(jù)系統(tǒng)的功能需求對(duì)軟件設(shè)計(jì)進(jìn)行建模,側(cè)重于軟件用例實(shí)現(xiàn)和分層架構(gòu)表達(dá)。從軟件業(yè)務(wù)設(shè)計(jì)、公共組件設(shè)計(jì)、軟件集成和部署等多個(gè)方面進(jìn)行設(shè)計(jì)工作,完成基于架構(gòu)的軟件概要設(shè)計(jì)。本研究中系統(tǒng)總體架構(gòu)由如下四個(gè)層次構(gòu)成,如圖1中所示。
圖1 無人機(jī)數(shù)據(jù)處理系統(tǒng)架構(gòu)Fig.1 UAV data processing system architecture
(1)數(shù)據(jù)存儲(chǔ):影像處理前后主要以文件形式存儲(chǔ)無人機(jī)的柵格數(shù)據(jù)及其他成果數(shù)據(jù),以postgis存儲(chǔ)空間信息和對(duì)應(yīng)文件路徑。文件式存儲(chǔ)方便操作源柵格進(jìn)行科學(xué)計(jì)算,但對(duì)于柵格數(shù)據(jù)的信息在數(shù)據(jù)庫層運(yùn)用極少。因此系統(tǒng)存儲(chǔ)主要包括兩部分,無人機(jī)數(shù)據(jù)存儲(chǔ)、無人機(jī)數(shù)據(jù)處理結(jié)果數(shù)據(jù)、三維模型轉(zhuǎn)換后的數(shù)據(jù)這類非結(jié)構(gòu)數(shù)據(jù)在文件中存儲(chǔ)與組織。數(shù)據(jù)的元數(shù)據(jù)、用戶數(shù)據(jù),系統(tǒng)日志信息存儲(chǔ)在Postgis數(shù)據(jù)庫中。緩存信息由redis數(shù)據(jù)庫處理。
(2)系統(tǒng)支撐:根據(jù)業(yè)務(wù)功能,提供數(shù)據(jù)的存儲(chǔ)與傳輸,包含sql處理、數(shù)據(jù)緩存、文件IO,主要由Jva Spring 的MyBatis做ORM。
(3)業(yè)務(wù)應(yīng)用層:包含無人機(jī)數(shù)據(jù)處理,服務(wù)器監(jiān)測(cè)、權(quán)限管理、靜態(tài)資源解析,主要模塊為封裝 ODM進(jìn)行無人機(jī)數(shù)據(jù)處理。其中數(shù)據(jù)傳輸處理與轉(zhuǎn)換依據(jù)功能需求和業(yè)務(wù)層基于 JAVA spring框架設(shè)計(jì)并封裝restful風(fēng)格接口。
(4)前端交互與可視化:采用 VUE框架結(jié)合Cesium將上層業(yè)務(wù)平臺(tái)中的各個(gè)業(yè)務(wù)模塊進(jìn)行聚合進(jìn)行前端搭建。Vue組件式開發(fā)登陸認(rèn)證、上傳下載表單、獲取數(shù)據(jù)信息等界面,結(jié)合Cesium做三維前端可視化。
本文中無人機(jī)數(shù)據(jù)處理系統(tǒng)主要為 WebGIS系統(tǒng)和傳統(tǒng)C/S結(jié)構(gòu)相比,要充分發(fā)揮Web應(yīng)用的內(nèi)在潛力,挖掘應(yīng)用深度和擴(kuò)大適應(yīng)能力,需要采用先進(jìn)的應(yīng)用架構(gòu)和以實(shí)用為根本準(zhǔn)則,使得系統(tǒng)既能滿足業(yè)務(wù)需求,又能適應(yīng)將來發(fā)展需要[2]。
本文無人機(jī)數(shù)據(jù)處理系統(tǒng)是以Web開發(fā)技術(shù)和三維 GIS技術(shù)為研究支撐,以上一節(jié)中軟件系統(tǒng)總體架構(gòu)的基礎(chǔ)上,切分成多個(gè)微服務(wù)進(jìn)行實(shí)現(xiàn)的。在主要業(yè)務(wù)服務(wù)中,通過http請(qǐng)求在服務(wù)之間進(jìn)行通信。
影像數(shù)據(jù)處理服務(wù)包含所有涉及無人機(jī)傾斜數(shù)據(jù)處理、轉(zhuǎn)換、提取元數(shù)據(jù)的功能聚合為一個(gè)服務(wù),有著完整的的日志記錄和本地?cái)?shù)據(jù)庫,其中負(fù)責(zé)傾斜數(shù)據(jù)處理的ODM、成果數(shù)據(jù)轉(zhuǎn)換的obtTo3D-tiles為微服務(wù)在框架中 service層進(jìn)行微服務(wù)控制與調(diào)用,提取元數(shù)據(jù)的GDAL作為開發(fā)庫直接在service層中開發(fā)調(diào)用,主要UML框架如圖2所示。
ODM官方支持 linuix下docker的封裝,數(shù)據(jù)處理前后通過訪問數(shù)據(jù)存儲(chǔ)服務(wù)記錄元數(shù)據(jù)。當(dāng)有新的計(jì)算請(qǐng)求時(shí),訪問服務(wù)器和Docker容器監(jiān)測(cè)服務(wù)來進(jìn)行業(yè)務(wù)判斷,如果服務(wù)器壓力過大則進(jìn)行消息和任務(wù)隊(duì)列。數(shù)據(jù)處理主要依靠docker-java創(chuàng)建Docker鏡像,推送命令到Docker內(nèi)封裝的ODM計(jì)算模塊執(zhí)行運(yùn)算, 依靠docker-java管理整個(gè)Docker容器的生命周期。以此實(shí)現(xiàn)了后端進(jìn)行無人機(jī)數(shù)據(jù)處理的功能并發(fā)布服務(wù)。
圖2 數(shù)據(jù)處理UMLFig.2 Data processing UML
通過docker pull opendronemap/opendronemap安裝在docker安裝ODM的鏡像,通過Maven在Java工程中引入Java-docker包,通過createContainer、startContainer等進(jìn)行容器的控制,通過 Java的Process在docker具體容器中調(diào)用ODM命令進(jìn)行數(shù)據(jù)處理,根據(jù)原始無人機(jī)數(shù)據(jù)目錄在Process中執(zhí)行本地命令:
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 對(duì) odm_test_1/images目錄下的圖像文件同時(shí)進(jìn)行正射影像(odm_orthophoto)和紋理網(wǎng)面建模(odm_texturing)的圖像處理,opendronemap/opendronemap是指明需要調(diào)用的鏡像,這里是調(diào)用Repository為opendronemap/opendronemap的鏡像,可以用該鏡像的 tag(如果有設(shè)置的話)和鏡像ID替代。產(chǎn)生數(shù)據(jù)如圖3所示。
圖3 正射影像和傾斜模型Fig.3 Orthophoto and oblique photogrammetric model
執(zhí)行過程中會(huì)返回處理狀態(tài)信息如圖4所示,通過 Process讀取信息并進(jìn)行正則分析提取進(jìn)度百分比,以服務(wù)方式發(fā)布json數(shù)據(jù)在前端展示進(jìn)度。
圖4 數(shù)據(jù)處理狀態(tài)Fig.4 Data processing status
成果三維模型數(shù)據(jù)為.obj格式,為支持前端大數(shù)據(jù)量三維可視化需求,需要對(duì)數(shù)據(jù)進(jìn)行三維切片。此功能通過部署單獨(dú)的 nodejs微服務(wù)集成obtTo3D-tiles開源工具做轉(zhuǎn)換。
目前三維數(shù)據(jù)主要以非結(jié)構(gòu)化數(shù)據(jù)形式生產(chǎn)和應(yīng)用,無人機(jī)數(shù)據(jù)處理主要涉及三維模型、點(diǎn)云等數(shù)據(jù)。涉及文件格式種類繁多,包括.pcd、.obj、.stl、.3Ds、3Dtiles等。
obj文件是一種標(biāo)準(zhǔn)的3D模型文件格式,很適合用于 3D軟件模型之間的互導(dǎo)[3]。obj文件包含.obj、.mtl和紋理圖片,其中.obj文件提供幾何信息,.mtl文件定義材質(zhì)信息;
3D Tiles是一種三位瓦片技術(shù),在gltf的基礎(chǔ)上加入了分層LOD的結(jié)構(gòu),是專門為大量地理3D數(shù)據(jù)流式傳輸和海量渲染而設(shè)計(jì)的一種格式,也開源WebGL框架Cesium的官方格式。其用于流式傳輸和渲染大量 3D地理空間內(nèi)容,例如攝影測(cè)量,3D建筑,BIM/CAD,實(shí)例化特征和點(diǎn)云。它定義了分層數(shù)據(jù)結(jié)構(gòu)和一組可交付內(nèi)容的圖塊格式。在3D Tiles中,tileset是按空間數(shù)據(jù)結(jié)構(gòu)(即tree)組織的一組tile。至少一個(gè)tileet JSON文件描述了tileet,其中該JSON文件包含tileet元數(shù)據(jù)和tile對(duì)象樹,其中每個(gè)對(duì)象都可以引用表1中的格式對(duì)應(yīng)的可渲染內(nèi)容。
表1 Tile引用格式Tab.1 Tile reference format
tile的內(nèi)容除了以上的渲染內(nèi)容,還包括特定格式的二進(jìn)制塊,包含特征表和批處理表。上述的批量3D模型(b3Dm)和實(shí)例3D模型(i3Dm)是基于glTF構(gòu)建的,點(diǎn)云格式不嵌入gltf中。tile如圖5所示以樹的結(jié)構(gòu)來組織,其結(jié)合了層次LOD的概念,優(yōu)化渲染空間數(shù)據(jù)。在樹結(jié)構(gòu)中,每個(gè) tile都有一個(gè)邊界包圍盒在空間中完全包圍該 tile和子節(jié)點(diǎn)的數(shù)據(jù)。其中,樹的組織結(jié)構(gòu)可以是kd樹,四叉樹或者grid。
圖5 Tileset樹Fig.5 Tileset tree
數(shù)據(jù)存儲(chǔ)是指對(duì)空間數(shù)據(jù)邏輯模型描述的數(shù)據(jù)組織關(guān)系和編排方式,對(duì)地理信息系統(tǒng)中數(shù)據(jù)存儲(chǔ)、查詢檢索和應(yīng)用分析等操作處理的效率有著至關(guān)重要的影響。本方案同時(shí)同一空間數(shù)據(jù)邏輯模型采用了多種空間數(shù)據(jù)結(jié)構(gòu)[4],針對(duì)標(biāo)準(zhǔn)和協(xié)議的不同存在著不同的數(shù)據(jù)格式。其中正射影像、3DTiles等ODM的成果數(shù)據(jù)采用文件格式進(jìn)行非結(jié)構(gòu)化存儲(chǔ),通過GDAL庫和其他技術(shù)提取的文件的元數(shù)據(jù)及矢量信息通過數(shù)據(jù)庫進(jìn)行存儲(chǔ),最后通過數(shù)據(jù)庫中存儲(chǔ)文件地址與非結(jié)構(gòu)化文件系統(tǒng)進(jìn)行關(guān)聯(lián)。
(1)非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)
通過 ODM進(jìn)行無人機(jī)數(shù)據(jù)處理后,可獲得點(diǎn)云、數(shù)字表面模型、紋理數(shù)字表面模型、正射成像、分類點(diǎn)云、數(shù)字高程模型[1]。其與原始數(shù)據(jù)都以文件形式存儲(chǔ),為支持Cesium.js的前端可視化,格式轉(zhuǎn)換后的 3DTiles等數(shù)據(jù)以文件格式存儲(chǔ),具體轉(zhuǎn)換前后文件組織如圖6所示。數(shù)據(jù)庫里只存放地址、鏈接、元數(shù)據(jù)信息和用戶信息進(jìn)行關(guān)聯(lián)。
圖6 用戶文件和轉(zhuǎn)換數(shù)據(jù)用戶文件組織Fig.6 User file organization and transform data user file organization
做非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)處理時(shí),需盡可能使用單獨(dú)的服務(wù)器,原因如下:多種格式數(shù)據(jù)內(nèi)容,且需要數(shù)據(jù)處理時(shí)需要依據(jù)文件處理,沒必要放數(shù)據(jù)庫;數(shù)據(jù)處理和傳輸時(shí)占用帶寬和計(jì)算資源,如果數(shù)據(jù)庫和應(yīng)用分離(即不再同一臺(tái)服務(wù)器),那么取得一個(gè)圖片需要從客戶端到應(yīng)用端取數(shù)據(jù),應(yīng)用又需要從數(shù)據(jù)庫去取,這樣會(huì)占用大量的帶寬,同時(shí)這也會(huì)在數(shù)據(jù)庫服務(wù)器和應(yīng)用服務(wù)器兩處 IO上形成瓶頸;如果圖片單獨(dú)放在服務(wù)器上,取圖片的時(shí)候,則只需要客戶端通過HTTP協(xié)議去圖片服務(wù)器上取,減少帶寬占用。并且,這里的IO瓶頸只存在圖片服務(wù)器上,會(huì)快很多。
(2)數(shù)據(jù)庫設(shè)計(jì)
數(shù)據(jù)庫內(nèi)數(shù)據(jù)為用戶數(shù)據(jù)、部分osm的矢量數(shù)據(jù)和提取的無人機(jī)的元數(shù)據(jù),其中元數(shù)據(jù)主要為柵格數(shù)據(jù)的地理元數(shù)據(jù)(空間坐標(biāo))。連接系統(tǒng)部分為Spring mybatis框架,在實(shí)際開發(fā)的時(shí)將其作為持久層框架簡(jiǎn)化sql操作。
數(shù)據(jù)庫管理系統(tǒng)為Postgis,可以通過存儲(chǔ)的空間數(shù)據(jù)建立空間索引并集成部分空間運(yùn)算,其優(yōu)勢(shì)是既可以方便數(shù)據(jù)統(tǒng)計(jì)和監(jiān)測(cè),又可以在大量地理信息數(shù)據(jù)中快速查詢符合條件的非結(jié)構(gòu)化數(shù)據(jù)文件地址,通過傳文件地址方便前端進(jìn)行快速可視化,其具體組織如圖7。
圖7 數(shù)據(jù)庫設(shè)計(jì)Fig.7 Database design
需要?jiǎng)討B(tài)展示和處理部分矢量數(shù)據(jù),由于 shp格式數(shù)據(jù)處理和查詢較慢(一定條件下Postgis的表查詢不建立索引比shp格式的數(shù)據(jù)存儲(chǔ)快125倍,建立索引快338倍),因此按照osm格式在Postgis中建表,存儲(chǔ)矢量數(shù)據(jù)。圖8為具體表結(jié)構(gòu)。
數(shù)據(jù)處理后產(chǎn)生多種格式文件,其中正射影像和傾斜模型帶有地理信息,可以直接應(yīng)用于GIS系統(tǒng)中。數(shù)據(jù)處理轉(zhuǎn)換后的 3DTiles發(fā)布為靜態(tài)數(shù)據(jù),前端使用 Vue.js集成 Cecium進(jìn)行三維數(shù)據(jù)展示。
Vue是目前流行的前端三大框架之一,其異步批處理方式更新 DOM加速運(yùn)行。提供組件開發(fā)用于解耦,將可復(fù)用的組件組合入應(yīng)用程序。緊湊且無依賴。具有表達(dá)式無需聲明依賴的可推導(dǎo)屬性(computed properties)。Cesium源碼使用ES6的模塊化方式開發(fā),通過gulp進(jìn)行構(gòu)建和封裝,VueCli3版本后直接將Cesium打包后的文件直接放在public下,部署時(shí)直接復(fù)制到發(fā)布包的根目錄相應(yīng)文件夾下,不進(jìn)行后續(xù)的webpack處理。
在VueCli中由于組件間數(shù)據(jù)傳輸通過data直接綁定數(shù)據(jù),部分場(chǎng)景下,例如Cesium加載大量數(shù)據(jù)渲染情況下,會(huì)導(dǎo)致框架本身對(duì)數(shù)據(jù)持續(xù)進(jìn)行監(jiān)測(cè)影響渲染效率,因此需要將含有大量數(shù)據(jù)變化的對(duì)象提升為全局對(duì)象,不在data中綁定。因此在引入Cesium時(shí),在main.js中全局引用:
import Cesium from "cesium/Cesium";
import"../node_modules/cesium/Source/Widgets/
widgets.css";
//全局注冊(cè)變量
Vue.prototype.Cesium=Cesium;
//將viewer放到全局對(duì)象當(dāng)中;
let viewer = new Cesium.Viewer('container');
window.earth = viewer;
通過 new Cesium.Cesium3DTileset({url: '3DTiles的json索引文件的url'})創(chuàng)建三維模型,viewer.scene.primitives.add函數(shù)添加進(jìn)場(chǎng)景中,完成三維可視化。開發(fā)測(cè)試時(shí)使用nodejs環(huán)境提供的server運(yùn)行,通過webpack技術(shù)進(jìn)行打包優(yōu)化。
圖8 數(shù)據(jù)表Fig.8 Data table
處理后數(shù)據(jù)雖然自帶地理信息,但是由于系統(tǒng)本身未加載地形,所以需要設(shè)置模型貼地。直接調(diào)用函數(shù)進(jìn)行設(shè)置,調(diào)整高度,height表示物體離地面的高度,偏移矩陣 modelMatrix可以由一個(gè) translation來確定,通過調(diào)整height來獲得不同的modelMatrix,視角縮放到瓦片集的時(shí)候調(diào)用changeHeight函數(shù),加載處理后的3DTiles效果如圖9所示。
圖9 Cesium加載3DTilesFig.9 Cesium load 3DTiles
本文通過研究Web應(yīng)用系統(tǒng)和三維GIS技術(shù),結(jié)合三維GIS集成無人機(jī)數(shù)據(jù)處理的需求,對(duì)無人機(jī)數(shù)據(jù)處理和可視化系統(tǒng)進(jìn)行研究與設(shè)計(jì)。本文提出的系統(tǒng)方案釆用當(dāng)前前沿的三維WebGIS技術(shù),該結(jié)構(gòu)各部分組件之間配合良好,功能強(qiáng)大,主要數(shù)據(jù)處理部分ODM通過docker-java封裝,單獨(dú)與Java Spring框架結(jié)合劃分微服務(wù),方便開發(fā)調(diào)用和擴(kuò)展?;贘ava Spring框架與開源WebGIS技術(shù)結(jié)合起來,在 Web應(yīng)用系統(tǒng)通用功能方面釆用 Springboot+Mybatis+Vuejs的架構(gòu)確保了平臺(tái)的安全性,完整性、可移植性和可擴(kuò)展性。在GIS特有功能實(shí)現(xiàn)上采用PostGIS作為空間數(shù)據(jù)庫,GeoServer作為地圖應(yīng)用服務(wù)器,采用 GeoWebCache為地圖緩存[5],以Cesium為客戶端。以Tomcat為Web服務(wù)器搭建完成了無人機(jī)數(shù)據(jù)處理系統(tǒng)。
系統(tǒng)所使用的開發(fā)庫均為開源軟件,降低了開發(fā)成本,也使將來系統(tǒng)升級(jí)和功能擴(kuò)展有了保障。在下一步的學(xué)習(xí)過程中將后端數(shù)據(jù)處理通過k8s技術(shù),重新拆分微服務(wù)并進(jìn)行 Docker容器的封裝來集成大規(guī)模服務(wù)器集群下的容器擴(kuò)展。