向澤君,徐占華,饒 鳴,龍 川
(1. 重慶市勘測院,重慶 400020; 2. 重慶數(shù)字城市科技有限公司,重慶 400020)
WebGIS是Internet技術(shù)應(yīng)用于GIS開發(fā)的地理信息系統(tǒng)。其使用的靜態(tài)背景地圖多采用預(yù)先生成的柵格瓦塊地圖,然后通過超文本傳輸協(xié)議(hyper-text transfer protocol,HTTP)的方式發(fā)布。這種方式減少了服務(wù)器端動(dòng)態(tài)生成地圖圖片的計(jì)算壓力,是目前采用最多的WebGIS技術(shù)之一。
柵格瓦塊地圖一般的發(fā)布方式是:使用工具把矢量地圖按行列切割為大小統(tǒng)一的柵格小圖片并存儲(chǔ)于地圖目錄Root下;將這些柵格小圖片拷貝至Web 服務(wù)器上并發(fā)布出去;客戶端程序根據(jù)當(dāng)前地圖范圍計(jì)算待加載的柵格小圖片的統(tǒng)一資源定位符(universal resource locator,URL)路徑,并根據(jù)該URL路徑查找對應(yīng)柵格小圖片的存儲(chǔ)位置;最后客戶端通過HTTP加載對應(yīng)的柵格小圖片。
目前,柵格瓦塊地圖一般通過IIS軟件發(fā)布出去,IIS軟件發(fā)布方式存在以下缺點(diǎn):將矢量地圖切割成海量柵格小圖片,增大了磁盤空間的占有量,此外在柵格小圖片存儲(chǔ)于地圖目錄Root過程中,針對大量相同的圖片(諸如空白圖片)均按照行列分別重復(fù)存儲(chǔ),進(jìn)一步增大了磁盤空間的占有量。
將柵格小圖片拷貝至Web服務(wù)器上并發(fā)布出去,由于海量柵格小圖片的數(shù)量較多,需要消耗較長的時(shí)間來拷貝數(shù)據(jù)。
在根據(jù)URL路徑查找對應(yīng)柵格小圖片的位置時(shí),IIS軟件只能依賴文件系統(tǒng),幾乎每次訪問,都要進(jìn)行磁盤IO,查找效率低。
為了解決以上問題,本文提出了一種海量柵格瓦塊地圖發(fā)布方法,屬于地圖發(fā)布領(lǐng)域。該方法包括以下步驟(如圖1所示):
1) 將矢量地圖切割成多個(gè)柵格小圖片并存儲(chǔ)于地圖目錄Root中,遍歷該地圖目錄Root中的柵格小圖片并打包至數(shù)據(jù)文件中,由此減小了磁盤空間的占有量。
2) 建立索引文件,該索引文件用于表示URL路徑與數(shù)據(jù)文件中對應(yīng)柵格小圖片存儲(chǔ)位置的索引關(guān)系;該索引文件使用路徑與文件名分別編碼的方法進(jìn)行壓縮存儲(chǔ),可一次性加載到內(nèi)存,利用索引文件查找柵格小圖片時(shí)不必訪問磁盤,進(jìn)一步提高了查找效率。
3) 根據(jù)客戶端請求的URL路徑及索引文件,在數(shù)據(jù)文件中查找與該URL路徑對應(yīng)的柵格小圖片的存儲(chǔ)位置,讀取該柵格小圖片并發(fā)送給客戶端。
圖1 設(shè)計(jì)思路
“http:∥www.digitalcq.com/dlg/L00/R000000d3/C0000011d.jpg”,URL中除去服務(wù)路徑外,與圖片文件路徑相關(guān)的部分為“dlg/L00/R000000d3/C0000011d.jpg”。
文件包括路徑“dlg/L00/R000000d3/”和文件名“C0000011d.jpg”。如果在索引內(nèi)部使用字符串,字符串比較時(shí)間較長,最好把字符串壓縮編碼為整數(shù),便于快速建立索引。以1 MB文件量計(jì)算,最底層的圖片行數(shù)約為1 KB,目錄數(shù)量約為1 KB,每一個(gè)目錄的文件數(shù)量約為1 KB。可以看出,目錄數(shù)量應(yīng)該不會(huì)超過10 KB,不同文件名的數(shù)量也不會(huì)超過10 KB。因此把“dlg/L00/R000000d3/C0000011d.jpg”分為兩個(gè)部分進(jìn)行壓縮編碼,即目錄部分“dlg/L00/R000000d3/”和文件名部分“C0000011d.jpg”。編碼方法是把目錄名加入字典中,然后對字典中的所有項(xiàng)賦一個(gè)不同的short integer;同時(shí)把文件名加入另一個(gè)字典,然后把字典中的所有項(xiàng)賦一個(gè)不同的short integer。把兩個(gè)short integer合并為一個(gè)32 bit的integer作為文件的內(nèi)部ID(如圖2所示)。
圖2 文件索引
索引表項(xiàng)組成:32 bit的ID+64 bit的偏移+32 bit的長度,共16字節(jié);把1 MB數(shù)量級(jí)的文件索引項(xiàng)升序排序?yàn)閿?shù)組(大小為16 MB內(nèi)存),每次搜索使用二叉搜索,只需要進(jìn)行32次整數(shù)比較就可以找到目標(biāo)。
把文件名轉(zhuǎn)換為ID的方法:首先將文件的路徑和文件名分開,路徑部分在第一個(gè)字典中查找路徑的ID;然后在第二個(gè)字典中查找文件名的ID,兩個(gè)ID合并后極為該文件的ID。
偏移與長度信息及時(shí)更改在數(shù)據(jù)文件中的位置。
索引建立主要是排序與哈希操作。索引文件可以選用文件數(shù)據(jù)庫,也可以自己開發(fā)相關(guān)排序算法。打包過程:深度遍歷目錄樹,將每一個(gè)文件寫入打包文件,記錄其偏移和長度信息,并將文件名、偏移、長度信息寫到文本文件。
創(chuàng)建索引具體算法如下:
1) 初始化路徑哈希表Hash_Path、文件名哈希表Hash_Name和數(shù)組FArray={},其中該路徑哈希表Hash_Path中路徑的標(biāo)號(hào)Path_ID初始化為0,該文件名哈希表Hash_Name中文件名的標(biāo)號(hào)Name_ID初始化為0。
2) 在地圖目錄Root中的柵格小圖片打包至數(shù)據(jù)文件的過程中,依次將各柵格小圖片 LF=(path, size, fno, offset)寫入Fdb中間文件,在建立索引文件的過程中打開該中間文件Fdb。其中,LF.path表示柵格小圖片LF的存儲(chǔ)路徑;LF.size表示柵格小圖片LF的大??;LF.fno表示柵格小圖片LF所在數(shù)據(jù)文件Fi的編號(hào);LF.offset表示柵格小圖片LF在數(shù)據(jù)文件Fi中的偏移。
3) 從該中間文件Fdb中讀取一個(gè)柵格小圖片LF的存儲(chǔ)路徑LF.path,并將LF.path分解為路徑部分PATH和文件名部分NAME。
4) 按照柵格小圖片的讀取順序?qū)υ摉鸥裥D片的路徑部分PATH和文件名部分NAME分別進(jìn)行標(biāo)號(hào),其中路徑部分PATH的標(biāo)號(hào)記為PID,文件名部分NAME的標(biāo)號(hào)記為NID,如果路徑哈希表Hash_Path中不存在PATH,則PID=PID+1,并將(PATH,PID)插入Hash_Path中;如果文件名哈希表Hash_Name中不存在NAME,則NID=NID+1,并將(NAME,NID)插入該文件名哈希表Hash_Name中。
5) 確定該柵格小圖片的標(biāo)號(hào)FID=PID<<16 | NID,并且將(FID,LF.size,LF.fno,LF.offset)存儲(chǔ)至數(shù)組FArray{}末尾,其中<<表示左移運(yùn)算符,|表示或運(yùn)算符。
6) 重復(fù)執(zhí)行步驟3)—5),直至該中間文件Fdb中所有柵格小圖片讀取完成。
7) 按照各柵格小圖片的標(biāo)號(hào)FID大小對該數(shù)組FArray{}進(jìn)行排序。
8) 將該路徑哈希表Hash_Path、文件名哈希表Hash_Name及數(shù)組FArray{}的內(nèi)容寫入索引文件中,建立索引文件。
在建立索引文件的過程中,本方法采用路徑名與文件名分別壓縮編碼的方式,減少索引所占的空間,達(dá)到了壓縮的目的,索引文件可一次性讀入內(nèi)存;并且利用索引查找柵格小圖片時(shí)不必訪問磁盤,進(jìn)一步提高了查找效率。
該索引文件通過加密算法進(jìn)行加密,提高了索引的安全性。加密算法可以選用DES對打包的小文件進(jìn)行加密,但是在客戶端必須使用相同的解密算法。加密算法對打包和發(fā)布服務(wù)是相對獨(dú)立的。
緩沖塊是對數(shù)據(jù)文件的緩存。緩存塊為64 KB,一個(gè)緩沖塊大約存放4~6個(gè)小圖片;并且這幾個(gè)小圖片在空間相鄰,可以一次IO全部讀入緩沖塊。
緩沖塊在緩存池中管理,可以用哈希表建立緩沖塊首地址與緩沖塊的快速映射關(guān)系。緩沖塊數(shù)量受最大緩存容量的限制,由緩沖塊頭的鏈表指針建立鏈表,鏈表頭部的緩沖塊是最近訪問過的緩存數(shù)據(jù),緩存塊鏈表末尾的是很長時(shí)間沒有訪問的緩沖塊。如果有新的塊要讀入,可以先釋放隊(duì)列末尾的緩沖塊(如圖3所示)。
圖3 緩沖管理
程序架構(gòu)如圖4所示,TCP監(jiān)聽服務(wù)監(jiān)聽幾個(gè)端口的TCP連接,每一個(gè)端口對應(yīng)一個(gè)格式解析方式。
各個(gè)端口接收到的請求都統(tǒng)一放到一個(gè)請求隊(duì)列中。在工作線程池中的空閑線程從請求隊(duì)列中獲取一個(gè)請求。解析HTTP,計(jì)算文件ID,然后再查找緩沖塊,最后發(fā)送數(shù)據(jù)。
如果在緩沖池中沒有找到緩沖塊,該請求就會(huì)停止,工作線程把該請求放入磁盤IO等待隊(duì)列,同時(shí)啟動(dòng)一個(gè)IO請求。緩存池IO線程異步非阻塞地完成磁盤IO操作,當(dāng)一個(gè)緩沖塊讀滿后,該線程把這個(gè)緩存塊放入緩沖池,同時(shí)把等待該緩沖塊的請求放入請求就緒隊(duì)列。工作線程繼續(xù)抓取就緒隊(duì)列的請求進(jìn)行處理,主要是發(fā)起網(wǎng)絡(luò)IO操作。具體工作由網(wǎng)絡(luò)IO線程異步非阻塞地進(jìn)行,當(dāng)操作完成后,請求結(jié)束,釋放相關(guān)資源。最近被訪問的緩沖塊被移動(dòng)到緩沖塊隊(duì)列的頭部。
圖4 程序架構(gòu)
異步非阻塞的網(wǎng)絡(luò)IO和磁盤IO采用ACE的Proactor框架。該技術(shù)非常成熟,異步各大網(wǎng)絡(luò)企業(yè)用于服務(wù)器程序開發(fā)。
通過采用上述技術(shù)方案,在100~150個(gè)并發(fā)的情況下,請求時(shí)間可維持在1 s以內(nèi)。本方法的有益效果如下:
1) 本方法將海量柵格小圖片打包至數(shù)據(jù)文件中,減小了磁盤空間的占有量;在根據(jù)URL路徑查找對應(yīng)柵格小圖片時(shí),不是依賴于文件系統(tǒng)逐一查找,而是通過索引的形式查找,提高了查找效率;此外,該索引文件存儲(chǔ)在內(nèi)存中,利用索引文件查找柵格小圖片時(shí)不必訪問磁盤,進(jìn)一步提高了查找效率。
2) 本方法針對大量相同的圖片(如空白圖片),設(shè)置模板文件,在將海量柵格小圖片打包至數(shù)據(jù)文件的過程中,首先將柵格小圖片與該模板文件進(jìn)行比較,如果相同則不再重復(fù)存儲(chǔ),因此進(jìn)一步減小了磁盤空間的占有量。
3) 深度遍歷該地圖目錄Root時(shí),按照名稱大小順序依次讀取各柵格小圖片,由于柵格小圖片的名稱大小反映了柵格小圖片在空間上的鄰近關(guān)系,當(dāng)加載某一柵格小圖片時(shí)會(huì)將與其鄰近的圖片一起加載,從而可以減少磁盤IO的訪問次數(shù),提高服務(wù)性能。
4) 在建立索引文件的過程中,本方法采用路徑和文件名壓縮編碼的方式減少了相同路徑與同名文件的數(shù)量,達(dá)到了壓縮的目的,減少了內(nèi)存使用量。
5) 索引文件通過加密算法進(jìn)行加密,提高了索引的安全性。
6) 本方法采用數(shù)據(jù)緩存機(jī)制讀取該柵格小圖片,減少了磁盤訪問次數(shù),提高了訪問效率。
7) 本方法支持增量發(fā)布和局部更新,避免了全范圍內(nèi)地圖的重新切割,減少了工作量。
參考文獻(xiàn):
[1] 劉鎮(zhèn).遙感影像瓦片金字塔模型研究[J].科技創(chuàng)新導(dǎo)報(bào),2008(6):199-200.
[2] 周鄭芳,鄧雪清,郭健,等.遙感影像分布式存儲(chǔ)模型[J].測繪科學(xué)與工程,2008,28(4):10-14.
[3] 尹棋.WebGIS中地圖發(fā)布的一種改進(jìn)方案[J].中國高新技術(shù)企業(yè),2008(22):127-129.
[4] 任小利,王遠(yuǎn)飛.三重金字塔模型及遙感影像管理系統(tǒng)研究[J].世界科技與發(fā)展,2010(4):466-468.
[5] 朱欣焰.面向網(wǎng)絡(luò)的海量影像空間數(shù)據(jù)在線分發(fā)技術(shù)[J].武漢大學(xué)學(xué)報(bào):信息科學(xué)版,2003,28(3):288-293.
[6] 蘇旭明,譚建成.WebGIS中瓦片地圖關(guān)鍵技術(shù)研究[J].北京測繪,2012(2):9-12.
[7] 趙大龍,孫恒宇.地圖切片技術(shù)分析與簡單實(shí)現(xiàn)[J].測繪與空間地理信息,2010(1):116-118.
[8] 陶志剛,趙敬道,譚建成.地理空間索引技術(shù)研究[J].測繪學(xué)院學(xué)報(bào),2002(1):76-78.
[9] 劉吉夫,陳颙,陳棋福,等.WebGIS應(yīng)用現(xiàn)狀及發(fā)展趨勢[J].地震,2003,23(4):10-20.
[10] 張劍波,劉丹,吳信才.GIS中柵格數(shù)據(jù)存儲(chǔ)管理的研究與實(shí)現(xiàn) [J].桂林工學(xué)院學(xué)報(bào),2006,26(1):54-58.