黃科佳,李少杰,左 堯,蔡文文,李紹俊,3,王少華,4,宋關(guān)福,3,鐘耳順,4
(1. 北京超圖軟件股份有限公司,北京 100015;2. 北京航空航天大學(xué),北京 100191;3. 國家測繪局 地理信息基礎(chǔ)軟件與應(yīng)用工程中心,北京 100101;4. 中國科學(xué)院 地理科學(xué)與資源研究所,北京 100101)
隨著互聯(lián)網(wǎng)的普及和信息技術(shù)的不斷發(fā)展,各種各樣的信息數(shù)據(jù)呈現(xiàn)出海量增長的趨勢。而WebGIS由于平臺獨立性、易訪問性、計算資源負(fù)載均衡等特點而成為地理信息領(lǐng)域的一大增長點[1-5]。但是面對海量的地理信息數(shù)據(jù),如何高效地進行管理、分析和顯示變得十分困難。同時,由于市場的擴大,用戶需求的不斷增加,WebGIS系統(tǒng)常常需要面臨著多用戶訪問、網(wǎng)絡(luò)帶寬資源受限等情況?,F(xiàn)有的WebGIS下載傳輸技術(shù)均基于單線程模型而設(shè)計,缺少同時發(fā)送網(wǎng)絡(luò)請求的機制,無法實現(xiàn)并行下載傳輸WebGIS發(fā)布的服務(wù)數(shù)據(jù),造成WebGIS數(shù)據(jù)傳輸?shù)男瘦^低[6-8]。如何把用戶請求的數(shù)據(jù)快速、準(zhǔn)確地管理和分析,并以高效、友好的可視化效果返回給用戶,是WebGIS系統(tǒng)迫切需要解決的關(guān)鍵問題之一。
此外,現(xiàn)有WebGIS技術(shù)大都采用單線程串行的方式,將下載數(shù)據(jù)序列化到磁盤或數(shù)據(jù)庫,需要時只能從磁盤或數(shù)據(jù)庫讀取數(shù)據(jù),每次向磁盤或數(shù)據(jù)庫存儲和讀取耗費大量的時間,無法直接使用當(dāng)前已下載的數(shù)據(jù),也無法復(fù)用頻繁使用的數(shù)據(jù)[9-11]?;谏鲜鰞?nèi)容,本文結(jié)合WebGIS數(shù)據(jù)在線傳輸?shù)奶攸c,根據(jù)分布式并行策略,開辟對應(yīng)線程間通信、調(diào)配計算任務(wù)、管理緩存空間資源、渲染任務(wù)資源的4個消息隊列,并設(shè)計了5個模塊以流程化的方式實現(xiàn)算法、模型管理,包括數(shù)據(jù)預(yù)處理模塊,消息隊列準(zhǔn)備模塊,數(shù)據(jù)下載控制模塊,循環(huán)控制模塊和地圖渲染模塊5個流程模塊,實現(xiàn)高性能的WebGIS數(shù)據(jù)傳輸和響應(yīng)服務(wù)。同時,本文還利用了客戶端動態(tài)內(nèi)存池LOD加載技術(shù),通過預(yù)定義內(nèi)存塊個數(shù)和內(nèi)存塊大小,實現(xiàn)內(nèi)存?zhèn)€數(shù)和內(nèi)存塊內(nèi)容的自適應(yīng)配置。通過任務(wù)消息隊列依次出/入隊列請求的方法實現(xiàn)高性能的WebGIS數(shù)據(jù)下載傳輸和加載,以解決現(xiàn)有技術(shù)不支持同步下載WebGIS數(shù)據(jù)和數(shù)據(jù)復(fù)用的問題,進一步為用戶提供更好的WebGIS數(shù)據(jù)訪問服務(wù)。
根據(jù)WebGIS數(shù)據(jù)在線傳輸和分布式并行模型的特點,研究設(shè)計開發(fā)了一種新型的GIS數(shù)據(jù)下載模型,如圖1所示。該模型通過開辟多個消息隊列,實現(xiàn)了線程間數(shù)據(jù)的實時通信。同時,劃分在線傳輸?shù)膯喂?jié)點數(shù)據(jù)為多個子節(jié)點數(shù)據(jù),每個子節(jié)點均設(shè)置一個任務(wù)線程、任務(wù)緩存和數(shù)據(jù)隊列,分別用于數(shù)據(jù)的通信,調(diào)配計算任務(wù)以及管理緩存空間資源。然后,通過多線程并行方法傳輸WebGIS數(shù)據(jù),實現(xiàn)軟件對系統(tǒng)資源最大化利用率。具體來講,本模型主要包括5個流程模塊,分別是數(shù)據(jù)預(yù)處理模塊,消息隊列準(zhǔn)備模塊,數(shù)據(jù)下載控制模塊,循環(huán)控制模塊和地圖渲染模塊。而在功能邏輯上,對應(yīng)于5個功能模塊,按順序可劃分成GIS數(shù)據(jù)的構(gòu)造初始化,生成離線數(shù)據(jù);發(fā)送多線程任務(wù),分發(fā)實時繪制任務(wù),生成網(wǎng)絡(luò)請求;生成下載消息隊列,多線程并行下載數(shù)據(jù);消息出入隊列管理和更新UI交互任務(wù);更新內(nèi)存池緩存隊列,符號化要素并實時渲染圖像結(jié)果,關(guān)聯(lián)屏幕顯示等。
圖1 WebGIS數(shù)據(jù)下載模型的模塊結(jié)構(gòu)圖Fig.1 Module structure of WebGIS data download model
1.1.1 數(shù)據(jù)預(yù)處理
數(shù)據(jù)預(yù)處理模塊,如圖2所示,主要負(fù)責(zé)WebGIS服務(wù)數(shù)據(jù)的獲取,并生成網(wǎng)絡(luò)下載數(shù)據(jù)集和地圖投影等配置信息存儲表。首先,初始化網(wǎng)絡(luò)服務(wù)環(huán)境,將WebGIS空間數(shù)據(jù)以XML或JSON等文件格式下載到本地系統(tǒng),同時獲取網(wǎng)絡(luò)服務(wù)的URL參數(shù)信息,并根據(jù)鍵值對的存儲規(guī)則解析XML或JSON文件。然后檢查網(wǎng)絡(luò)服務(wù)的有效性,過濾無效請求參數(shù)和服務(wù)類型。再獲取地圖范圍、地圖投影、下載數(shù)據(jù)風(fēng)格和數(shù)據(jù)格式等信息。最后,提取下載和顯示地圖所需的參數(shù)信息,從而得到地圖范圍、比例尺、地圖投影、下載請求規(guī)格信息,并按照網(wǎng)絡(luò)數(shù)據(jù)集構(gòu)造規(guī)則生成下載數(shù)據(jù)集和離線信息存儲表,用于后續(xù)的消息隊列中心提取數(shù)據(jù)構(gòu)造多線程下載任務(wù)和子線程繪制任務(wù)。
圖2 數(shù)據(jù)預(yù)處理模塊Fig.2 Data preprocessing module
1.1.2 消息隊列準(zhǔn)備
消息隊列準(zhǔn)備模塊如圖3所示,采用面向?qū)ο蟮亩鄳B(tài)基本設(shè)計原則,結(jié)合多線程同步編程模型,用于將WebGIS的網(wǎng)絡(luò)服務(wù)分解為具體的HTTP請求任務(wù),提供給數(shù)據(jù)下載模塊進行在線實時請求。具體來講,第一步,系統(tǒng)獲取用戶交互的手勢動作,并封裝成消息內(nèi)容,通過UI主線程調(diào)用WebGIS服務(wù)接口;第二步,UI主線程根據(jù)消息類型和消息內(nèi)容,發(fā)送地圖繪制任務(wù)給渲染子線程;第三步,渲染子線程接受到繪制任務(wù)后啟動渲染線程池,并查詢數(shù)據(jù)準(zhǔn)備階段生成的網(wǎng)絡(luò)數(shù)據(jù)集,計算出格網(wǎng)請求范圍及比例尺或瓦片行列號;第四步,選擇網(wǎng)絡(luò)請求的服務(wù)類型,提取該服務(wù)類型的數(shù)據(jù)下載內(nèi)容,生成符合WebGIS服務(wù)標(biāo)準(zhǔn)(REST或OGC等)的URL請求串。第五步,基于開源CURL庫,一種利用URL語法在命令行方式下工作的開源網(wǎng)絡(luò)文件傳輸下載庫,初始化網(wǎng)絡(luò)下載環(huán)境,得到基于HTTP協(xié)議的GET請求用于發(fā)送。
圖3 消息隊列準(zhǔn)備模塊Fig.3 Message queue preparation module
1.1.3 數(shù)據(jù)下載控制
數(shù)據(jù)下載控制模塊如圖4所示,負(fù)責(zé)在瀏覽網(wǎng)絡(luò)地圖的過程中提供實時下載網(wǎng)絡(luò)服務(wù)數(shù)據(jù),并循環(huán)控制總體下載進度和子線程下載順序。具體來講,第一步,將任務(wù)準(zhǔn)備階段的不同服務(wù)請求類型封裝成指定的網(wǎng)絡(luò)請求結(jié)構(gòu)體,通過任務(wù)下載管理類將請求結(jié)構(gòu)體加入消息隊列;第二步,消息隊列中心將任務(wù)結(jié)構(gòu)體解析成URL鍵值對,生成下載請求消息對象;第三步,消息隊列中心通知下載線程,多線程下載中心將請求消息對象出隊列,通過下載線程池將請求消息任務(wù)平均分配到各個子線程,完成任務(wù)分配后啟動線程池進行網(wǎng)絡(luò)下載。所有請求任務(wù)同步進行數(shù)據(jù)傳輸,傳輸結(jié)果I/O到磁盤對應(yīng)的文件目錄下,子線程數(shù)據(jù)傳輸完成后將文件存儲地址通過回調(diào)機制發(fā)送給請求結(jié)果中心,請求結(jié)果中心將下載圖像結(jié)果讀取到文件內(nèi)存,并生成柵格數(shù)據(jù)集。最后,將柵格數(shù)據(jù)集返回給地圖顯示模塊,用于后續(xù)的渲染引擎渲染出圖并關(guān)聯(lián)到屏幕顯示。
圖4 數(shù)據(jù)下載控制模塊Fig.4 Data download control module
1.1.4 循環(huán)控制
循環(huán)控制模塊如圖5所示,用于將發(fā)送的請求任務(wù)全部依次下載,直到完成所有任務(wù)得到每一個請求任務(wù)的磁盤數(shù)據(jù)文件為止。具體來講,首先,在數(shù)據(jù)下載模塊發(fā)送請求后,按照發(fā)送請求的順序依次獲取每個請求的下載狀態(tài)。如果狀態(tài)為未完成,則請求任務(wù)建立新的消息隊列,并觸發(fā)消息隊列再次發(fā)送請求任務(wù),直到下載完成或者此任務(wù)請求次數(shù)超過5次為止。然后,根據(jù)主界面交互操作,獲取新瀏覽區(qū)域的圖像范圍,構(gòu)成新的請求任務(wù)。按照圖像范圍的順時針順序添加到消息隊列,循環(huán)添加所有新請求任務(wù)。添加完成后觸發(fā)消息隊列開始請求服務(wù)器網(wǎng)絡(luò)數(shù)據(jù)。等待完成消息觸發(fā)后,開始遍歷消息中心的所有消息隊列,檢查是否存在未發(fā)出的任務(wù),有的話則將發(fā)送這些任務(wù)批量向服務(wù)端發(fā)送,不存在則系統(tǒng)進入睡眠等待狀態(tài),等待新任務(wù)的發(fā)送請求和未完成任務(wù)的再次發(fā)送請求??偠灾?,循環(huán)控制模塊的作用就是循環(huán)調(diào)度消息隊列模塊,建立消息實時出隊列和入隊列的更新機制,直到所有下載任務(wù)全部達到完成狀態(tài),得到最終的WebGIS網(wǎng)絡(luò)服務(wù)結(jié)果。
圖5 循環(huán)控制模塊Fig.5 Cycle control module
1.1.5 地圖渲染
地圖渲染模塊如圖6所示,用于獲取數(shù)據(jù)下載階段的圖像結(jié)果和當(dāng)前地圖的格網(wǎng)瓦片范圍和比例尺,將結(jié)果通過圖形繪制接口繪制到終端屏幕,以及響應(yīng)UI交互動作。顯示過程中,分別將本地下載完成的單張瓦片圖像讀取到柵格數(shù)據(jù)集,在柵格數(shù)據(jù)集中裁剪、拼接圖像,并將圖像融合成真彩色24位的單波段位圖。位圖結(jié)果通過圖形繪制接口構(gòu)造成一個點符號對象,按照256或512單元格分別構(gòu)造出若干個點符號對象,形成一個覆蓋設(shè)備屏幕的格網(wǎng)區(qū)域。對于超出部分通過GIS中面與面幾何裁剪方法處理。最后通過圖形繪制接口OpenGL將符號映射成紋理對象,在顯存內(nèi)部開辟一塊內(nèi)存用于保存紋理對象。最后,完成所有符號對象的繪制,通知UI主線程進行刷新,并拷貝顯存中內(nèi)存塊綁定到屏幕進行顯示。
圖6 地圖渲染模塊Fig.6 Map rendering module
在WebGIS數(shù)據(jù)傳輸中,客戶端訪問服務(wù)器的數(shù)據(jù)下載量巨大,因此提高傳輸效率是需要解決的一大問題。為此,本研究首先在圖像數(shù)據(jù)處理的系統(tǒng)中,利用GPU對數(shù)據(jù)紋理特征進行渲染,并通過OpenGL引擎的紋理映射表進行維護。這種方式可快速指定某個紋理綁定到顯存顯示,減輕了CPU的計算負(fù)荷。同時利用GPU強大的并行處理能力和LOD動態(tài)顯示的技術(shù)提供更快的圖形顯示。然后,我們還設(shè)計了客戶端下載地圖數(shù)據(jù)的動態(tài)緩存池,預(yù)先讀取數(shù)據(jù)到主存,并按照一定排序技術(shù)進行管理。該技術(shù)一般采用線性隊列等先入先出數(shù)據(jù)結(jié)構(gòu)實現(xiàn)。這樣可極大地降低客戶端向服務(wù)器發(fā)送下載請求的頻率,減少客戶端輸入/輸出(I/O)磁盤的次數(shù),從而提高客戶端訪問WebGIS數(shù)據(jù)的速度[12-14]。
緩存策略是緩存池技術(shù)中最重要的問題,良好的緩存策略會較好地實現(xiàn)高效緩存和資源有效利用間的平衡。本系統(tǒng)在主存創(chuàng)建一個先入先出的隊列來實現(xiàn)緩存池機制。
1.2.1 緩存數(shù)據(jù)存儲方法
圖像數(shù)據(jù)緩存策略分為橫向和縱向。橫向上,如圖7所示,將第n層中當(dāng)前視圖區(qū)域的圖像(i,j)添加到緩存池中。然后,將圖像(i,j)數(shù)據(jù)導(dǎo)入到緩存池中,周圍的(i-1,j-1)、(i,j-1)、(i+1,j-1)、(i-1,j)、(i+1,j)、(i-1,j+1)、(i,j+1)、(i+1,j+1)8幅圖像代表了它在第n層的延伸。而在縱向上,圖8中(i,j)表示第n層的圖像,(i,j)下面4個圖表示第n層圖像對應(yīng)在第n+1層按照比例尺對等規(guī)則劃分的4幅圖像。第n-1層的緩存圖像按照同樣的比例尺規(guī)則劃分為一個圖像,只占有第n層(i,j)圖像的1/4空間范圍。
在緩存過程中,第n層圖像(i,j)的延伸圖像在緩存過程中與第n層的其他圖像存在重復(fù)需進行過濾篩選,第n層圖像(i,j)的分割圖像在第n-1層與其他圖像的延伸圖像存在重復(fù)需進行過濾篩選,先從磁盤文件導(dǎo)入到內(nèi)存圖像,通過篩選剔除后的內(nèi)存圖像,再導(dǎo)入到緩存池中。
圖7 WebGIS數(shù)據(jù)延伸緩存機制Fig.7 WebGIS data extension caching mechanism
圖8 WebGIS數(shù)據(jù)拉伸緩存機制Fig.8 WebGIS data stretching caching mechanism
1.2.2 緩存數(shù)據(jù)加載方法
緩存數(shù)據(jù)加載方法如圖9所示,第n層比例尺存儲該層所有的延伸圖像,第n-1層存儲小于當(dāng)前比例尺的所有拉伸圖像,第n+1層存儲大于當(dāng)前比例尺的所有拉伸圖像。在顯示過程中按照第n層>第n+1層>第n-1層的紋理遍歷規(guī)則加載圖像。具體加載流程如下:
1)用戶瀏覽地圖至第n層,向系統(tǒng)發(fā)送顯示請求;
2)系統(tǒng)自動遍歷緩存池中第n層所有圖像,存在相交區(qū)域的圖像,通過紋理映射技術(shù)直接傳至顯存顯示,覆蓋空白區(qū)域的圖像,便于直觀展示當(dāng)前區(qū)域內(nèi)的最新圖像;
3)遍歷緩存池中第n+1層圖像,存在比例尺大于當(dāng)前視圖區(qū)域的圖像,并且和當(dāng)前視圖區(qū)域相交,并且該圖像區(qū)域在3)過程中沒有被執(zhí)行,通過紋理映射技術(shù)拉伸紋理緩存到顯存顯示,覆蓋空白區(qū)域的圖像;
4)遍歷緩存池中第n-1層圖像,存在比例尺小于當(dāng)前視圖區(qū)域的圖像,并且和當(dāng)前視圖區(qū)域相交,并且該圖像區(qū)域在4)過程中沒有被執(zhí)行,通過紋理映射技術(shù)拉伸紋理緩存到顯存顯示,覆蓋空白區(qū)域的圖像;
5)遍歷n層所有圖像,將所有和當(dāng)前視圖相交的圖像貼到顯存,覆蓋第n+1層或者第n-1層圖像,確保最終顯示的圖像都是最新圖像,不存在拉伸殘圖,完成整個紋理緩存的顯示過程。
圖9 WebGIS數(shù)據(jù)緩存加載復(fù)用三機制Fig.9 WebGIS data cache load reuse 3 mechanisms
對于用戶在客戶端進行的一般操作,所有當(dāng)前圖像可能延伸到的圖像數(shù)據(jù)均進行了緩存。理論上講,緩存池越大,緩存到內(nèi)存中的數(shù)據(jù)就越多,服務(wù)器接收到用戶請求時查找磁盤的次數(shù)越少,傳輸速率就越高。但服務(wù)器內(nèi)存有限,無需過多浪費,且應(yīng)預(yù)留內(nèi)存來處理其他請求。
為了進一步說明本研究算法的有效性,我們還對比分析了傳統(tǒng)算法比本研究高性能算法之間的性能。傳統(tǒng)的WebGIS動態(tài)渲染算法[15-18],采用單線程串行的計算方式,根據(jù)地圖可視范圍和可見網(wǎng)絡(luò)圖層,構(gòu)造空間查詢條件,分別對圖層對應(yīng)的網(wǎng)絡(luò)數(shù)據(jù)集進行空間查詢,得到結(jié)果記錄集,并將其劃分為瓦片數(shù)組,提取瓦片內(nèi)部的空間范圍瓦片行列號,構(gòu)造成網(wǎng)絡(luò)請求的URL地址,并通過HTTP請求第三方庫CURL發(fā)送請求地址到服務(wù)器,通過Get請求方式下載網(wǎng)絡(luò)數(shù)據(jù)到本地指定路徑下,完成下載過程。最后通過通知UI主線程啟動地圖渲染模塊,將下載完成的數(shù)據(jù)文件讀取并解析成圖像數(shù)組,通過圖形渲染接口將圖像數(shù)組繪制成顯存圖片,再更新到屏幕,完成整個WebGIS數(shù)據(jù)下載渲染過程。而本研究的算法根據(jù)分布式并行策略,開辟多線程通信策略,以流程化的方式實現(xiàn)算法和模型管理,實現(xiàn)高性能的WebGIS數(shù)據(jù)傳輸和響應(yīng)服務(wù)。同時,本文還利用了客戶端動態(tài)內(nèi)存池LOD加載技術(shù),極大地提升了WebGIS數(shù)據(jù)存取與顯示效率。
我們在主頻2.6 GHZ、內(nèi)存8 GB的8核處理器PC機中進行了多組對比分析實驗見表1,使用中國交通路網(wǎng)瓦片數(shù)據(jù)(數(shù)據(jù)量大小為23.31 GB),實現(xiàn)發(fā)現(xiàn)在REST網(wǎng)絡(luò)服務(wù)類型下,針對10、50、100三類GIS瓦片數(shù),相較于傳統(tǒng)下載算法,本研究算法性能提升均可達到5倍以上。同樣地,針對WMS網(wǎng)絡(luò)服務(wù)類型下,10、50、100三類GIS瓦片數(shù),本研究算法性能提升均可達到5倍以上,有著較好的渲染性能和顯示效果。
表1 兩種WebGIS下載算法測試結(jié)果Tab.1 Test results of two WebGIS download algorithms
然后,開啟不同線程請求數(shù)據(jù)的測試結(jié)果見表2。
表2 不同線程請求時間測試結(jié)果Tab.2 Test results of request times for different threads
研究發(fā)現(xiàn):①當(dāng)線程個數(shù)小于8個線程時,有空閑的CPU核心未被充分利用,隨著線程數(shù)的增加,更多地利用處理器資源,吞吐量線性增加,平均響應(yīng)時間線性減少,性能不斷提升;②當(dāng)線程個數(shù)達到8個線程,即與CPU核心數(shù)相等時,所有CPU核心被充分利用,各調(diào)度線程調(diào)度服務(wù)內(nèi)核并行計算,并發(fā)處理性能接近最優(yōu);③當(dāng)線程個數(shù)大于8個線程時,由于測試用的服務(wù)器CPU核心數(shù)只有8個,CPU會頻繁地進行線程切換操作,這會導(dǎo)致額外的CPU開銷,因此并發(fā)處理能力幾乎不能再線性增加。
數(shù)據(jù)傳輸是WebGIS中的核心技術(shù),也是影響WebGIS系統(tǒng)性能的一大關(guān)鍵點。本研究結(jié)合WebGIS數(shù)據(jù)在線傳輸?shù)奶攸c,基于多線程并行請求在線數(shù)據(jù)模型和客戶端動態(tài)內(nèi)存池LOD加載技術(shù)實現(xiàn)了軟件對系統(tǒng)資源利用最優(yōu)化,顯著提高硬件資源利用率,提高WebGIS計算效率和性能。具體來講,基于多線程間的通信效率,通過多線程并行方法將單節(jié)點數(shù)據(jù)分解為若干個子節(jié)點數(shù)據(jù)同步下載,提升了數(shù)據(jù)下載效率;采用圖像數(shù)據(jù)內(nèi)存池設(shè)計了圖像數(shù)據(jù)緩存機制,充分利用客戶端主存空間,降低了數(shù)據(jù)下載到本地后存儲磁盤的耗時。同時,根據(jù)并行策略,開辟4個消息隊列,實現(xiàn)線程間數(shù)據(jù)的通信,并將在線傳輸?shù)膯喂?jié)點數(shù)據(jù)分為若干個子節(jié)點數(shù)據(jù),分別為每個子節(jié)點開辟一個任務(wù)線程,一個任務(wù)緩存,一個數(shù)據(jù)隊列,用于數(shù)據(jù)的通信,調(diào)配計算任務(wù)及管理緩存空間資源。通過多線程并行方法傳輸WebGIS數(shù)據(jù),實現(xiàn)軟件對系統(tǒng)資源最大化利用率,提高軟件的網(wǎng)絡(luò)訪問效率和軟件的整體性能。最后,我們還對比分析了本研究算法與傳統(tǒng)數(shù)據(jù)下載模型的效率,發(fā)現(xiàn)本研究算法性能提升均可達到5倍以上,有著更加優(yōu)秀的GIS數(shù)據(jù)下載性能和渲染效果。