潘 欣,佘向飛
(長春工程學院 計算機技術與工程學院,長春 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格式存儲的景觀所對應的區域?;A數據存儲部分主要負責以“工程”的粒度管理在文件系統中的數據,并可以將文件轉換為網絡數據流、利用三維模型形成快照圖像。
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調用工作;實驗表明,利用本系統可以大大地降低開發人員的工作量,使相關團隊可以用較小的成本開發相關產品,且具有較高的使用價值。