向澤君,徐占華,饒 鳴,龍 川
(1. 重慶市勘測院,重慶 400020; 2. 重慶數字城市科技有限公司,重慶 400020)
WebGIS是Internet技術應用于GIS開發的地理信息系統。其使用的靜態背景地圖多采用預先生成的柵格瓦塊地圖,然后通過超文本傳輸協議(hyper-text transfer protocol,HTTP)的方式發布。這種方式減少了服務器端動態生成地圖圖片的計算壓力,是目前采用最多的WebGIS技術之一。
柵格瓦塊地圖一般的發布方式是:使用工具把矢量地圖按行列切割為大小統一的柵格小圖片并存儲于地圖目錄Root下;將這些柵格小圖片拷貝至Web 服務器上并發布出去;客戶端程序根據當前地圖范圍計算待加載的柵格小圖片的統一資源定位符(universal resource locator,URL)路徑,并根據該URL路徑查找對應柵格小圖片的存儲位置;最后客戶端通過HTTP加載對應的柵格小圖片。
目前,柵格瓦塊地圖一般通過IIS軟件發布出去,IIS軟件發布方式存在以下缺點:將矢量地圖切割成海量柵格小圖片,增大了磁盤空間的占有量,此外在柵格小圖片存儲于地圖目錄Root過程中,針對大量相同的圖片(諸如空白圖片)均按照行列分別重復存儲,進一步增大了磁盤空間的占有量。
將柵格小圖片拷貝至Web服務器上并發布出去,由于海量柵格小圖片的數量較多,需要消耗較長的時間來拷貝數據。
在根據URL路徑查找對應柵格小圖片的位置時,IIS軟件只能依賴文件系統,幾乎每次訪問,都要進行磁盤IO,查找效率低。
為了解決以上問題,本文提出了一種海量柵格瓦塊地圖發布方法,屬于地圖發布領域。該方法包括以下步驟(如圖1所示):
1) 將矢量地圖切割成多個柵格小圖片并存儲于地圖目錄Root中,遍歷該地圖目錄Root中的柵格小圖片并打包至數據文件中,由此減小了磁盤空間的占有量。
2) 建立索引文件,該索引文件用于表示URL路徑與數據文件中對應柵格小圖片存儲位置的索引關系;該索引文件使用路徑與文件名分別編碼的方法進行壓縮存儲,可一次性加載到內存,利用索引文件查找柵格小圖片時不必訪問磁盤,進一步提高了查找效率。
3) 根據客戶端請求的URL路徑及索引文件,在數據文件中查找與該URL路徑對應的柵格小圖片的存儲位置,讀取該柵格小圖片并發送給客戶端。

圖1 設計思路
“http:∥www.digitalcq.com/dlg/L00/R000000d3/C0000011d.jpg”,URL中除去服務路徑外,與圖片文件路徑相關的部分為“dlg/L00/R000000d3/C0000011d.jpg”。
文件包括路徑“dlg/L00/R000000d3/”和文件名“C0000011d.jpg”。如果在索引內部使用字符串,字符串比較時間較長,最好把字符串壓縮編碼為整數,便于快速建立索引。以1 MB文件量計算,最底層的圖片行數約為1 KB,目錄數量約為1 KB,每一個目錄的文件數量約為1 KB。可以看出,目錄數量應該不會超過10 KB,不同文件名的數量也不會超過10 KB。因此把“dlg/L00/R000000d3/C0000011d.jpg”分為兩個部分進行壓縮編碼,即目錄部分“dlg/L00/R000000d3/”和文件名部分“C0000011d.jpg”。編碼方法是把目錄名加入字典中,然后對字典中的所有項賦一個不同的short integer;同時把文件名加入另一個字典,然后把字典中的所有項賦一個不同的short integer。把兩個short integer合并為一個32 bit的integer作為文件的內部ID(如圖2所示)。

圖2 文件索引
索引表項組成:32 bit的ID+64 bit的偏移+32 bit的長度,共16字節;把1 MB數量級的文件索引項升序排序為數組(大小為16 MB內存),每次搜索使用二叉搜索,只需要進行32次整數比較就可以找到目標。
把文件名轉換為ID的方法:首先將文件的路徑和文件名分開,路徑部分在第一個字典中查找路徑的ID;然后在第二個字典中查找文件名的ID,兩個ID合并后極為該文件的ID。
偏移與長度信息及時更改在數據文件中的位置。
索引建立主要是排序與哈希操作。索引文件可以選用文件數據庫,也可以自己開發相關排序算法。打包過程:深度遍歷目錄樹,將每一個文件寫入打包文件,記錄其偏移和長度信息,并將文件名、偏移、長度信息寫到文本文件。
創建索引具體算法如下:
1) 初始化路徑哈希表Hash_Path、文件名哈希表Hash_Name和數組FArray={},其中該路徑哈希表Hash_Path中路徑的標號Path_ID初始化為0,該文件名哈希表Hash_Name中文件名的標號Name_ID初始化為0。
2) 在地圖目錄Root中的柵格小圖片打包至數據文件的過程中,依次將各柵格小圖片 LF=(path, size, fno, offset)寫入Fdb中間文件,在建立索引文件的過程中打開該中間文件Fdb。其中,LF.path表示柵格小圖片LF的存儲路徑;LF.size表示柵格小圖片LF的大小;LF.fno表示柵格小圖片LF所在數據文件Fi的編號;LF.offset表示柵格小圖片LF在數據文件Fi中的偏移。
3) 從該中間文件Fdb中讀取一個柵格小圖片LF的存儲路徑LF.path,并將LF.path分解為路徑部分PATH和文件名部分NAME。
4) 按照柵格小圖片的讀取順序對該柵格小圖片的路徑部分PATH和文件名部分NAME分別進行標號,其中路徑部分PATH的標號記為PID,文件名部分NAME的標號記為NID,如果路徑哈希表Hash_Path中不存在PATH,則PID=PID+1,并將(PATH,PID)插入Hash_Path中;如果文件名哈希表Hash_Name中不存在NAME,則NID=NID+1,并將(NAME,NID)插入該文件名哈希表Hash_Name中。
5) 確定該柵格小圖片的標號FID=PID<<16 | NID,并且將(FID,LF.size,LF.fno,LF.offset)存儲至數組FArray{}末尾,其中<<表示左移運算符,|表示或運算符。
6) 重復執行步驟3)—5),直至該中間文件Fdb中所有柵格小圖片讀取完成。
7) 按照各柵格小圖片的標號FID大小對該數組FArray{}進行排序。
8) 將該路徑哈希表Hash_Path、文件名哈希表Hash_Name及數組FArray{}的內容寫入索引文件中,建立索引文件。
在建立索引文件的過程中,本方法采用路徑名與文件名分別壓縮編碼的方式,減少索引所占的空間,達到了壓縮的目的,索引文件可一次性讀入內存;并且利用索引查找柵格小圖片時不必訪問磁盤,進一步提高了查找效率。
該索引文件通過加密算法進行加密,提高了索引的安全性。加密算法可以選用DES對打包的小文件進行加密,但是在客戶端必須使用相同的解密算法。加密算法對打包和發布服務是相對獨立的。
緩沖塊是對數據文件的緩存。緩存塊為64 KB,一個緩沖塊大約存放4~6個小圖片;并且這幾個小圖片在空間相鄰,可以一次IO全部讀入緩沖塊。
緩沖塊在緩存池中管理,可以用哈希表建立緩沖塊首地址與緩沖塊的快速映射關系。緩沖塊數量受最大緩存容量的限制,由緩沖塊頭的鏈表指針建立鏈表,鏈表頭部的緩沖塊是最近訪問過的緩存數據,緩存塊鏈表末尾的是很長時間沒有訪問的緩沖塊。如果有新的塊要讀入,可以先釋放隊列末尾的緩沖塊(如圖3所示)。

圖3 緩沖管理
程序架構如圖4所示,TCP監聽服務監聽幾個端口的TCP連接,每一個端口對應一個格式解析方式。
各個端口接收到的請求都統一放到一個請求隊列中。在工作線程池中的空閑線程從請求隊列中獲取一個請求。解析HTTP,計算文件ID,然后再查找緩沖塊,最后發送數據。
如果在緩沖池中沒有找到緩沖塊,該請求就會停止,工作線程把該請求放入磁盤IO等待隊列,同時啟動一個IO請求。緩存池IO線程異步非阻塞地完成磁盤IO操作,當一個緩沖塊讀滿后,該線程把這個緩存塊放入緩沖池,同時把等待該緩沖塊的請求放入請求就緒隊列。工作線程繼續抓取就緒隊列的請求進行處理,主要是發起網絡IO操作。具體工作由網絡IO線程異步非阻塞地進行,當操作完成后,請求結束,釋放相關資源。最近被訪問的緩沖塊被移動到緩沖塊隊列的頭部。

圖4 程序架構
異步非阻塞的網絡IO和磁盤IO采用ACE的Proactor框架。該技術非常成熟,異步各大網絡企業用于服務器程序開發。
通過采用上述技術方案,在100~150個并發的情況下,請求時間可維持在1 s以內。本方法的有益效果如下:
1) 本方法將海量柵格小圖片打包至數據文件中,減小了磁盤空間的占有量;在根據URL路徑查找對應柵格小圖片時,不是依賴于文件系統逐一查找,而是通過索引的形式查找,提高了查找效率;此外,該索引文件存儲在內存中,利用索引文件查找柵格小圖片時不必訪問磁盤,進一步提高了查找效率。
2) 本方法針對大量相同的圖片(如空白圖片),設置模板文件,在將海量柵格小圖片打包至數據文件的過程中,首先將柵格小圖片與該模板文件進行比較,如果相同則不再重復存儲,因此進一步減小了磁盤空間的占有量。
3) 深度遍歷該地圖目錄Root時,按照名稱大小順序依次讀取各柵格小圖片,由于柵格小圖片的名稱大小反映了柵格小圖片在空間上的鄰近關系,當加載某一柵格小圖片時會將與其鄰近的圖片一起加載,從而可以減少磁盤IO的訪問次數,提高服務性能。
4) 在建立索引文件的過程中,本方法采用路徑和文件名壓縮編碼的方式減少了相同路徑與同名文件的數量,達到了壓縮的目的,減少了內存使用量。
5) 索引文件通過加密算法進行加密,提高了索引的安全性。
6) 本方法采用數據緩存機制讀取該柵格小圖片,減少了磁盤訪問次數,提高了訪問效率。
7) 本方法支持增量發布和局部更新,避免了全范圍內地圖的重新切割,減少了工作量。
參考文獻:
[1] 劉鎮.遙感影像瓦片金字塔模型研究[J].科技創新導報,2008(6):199-200.
[2] 周鄭芳,鄧雪清,郭健,等.遙感影像分布式存儲模型[J].測繪科學與工程,2008,28(4):10-14.
[3] 尹棋.WebGIS中地圖發布的一種改進方案[J].中國高新技術企業,2008(22):127-129.
[4] 任小利,王遠飛.三重金字塔模型及遙感影像管理系統研究[J].世界科技與發展,2010(4):466-468.
[5] 朱欣焰.面向網絡的海量影像空間數據在線分發技術[J].武漢大學學報:信息科學版,2003,28(3):288-293.
[6] 蘇旭明,譚建成.WebGIS中瓦片地圖關鍵技術研究[J].北京測繪,2012(2):9-12.
[7] 趙大龍,孫恒宇.地圖切片技術分析與簡單實現[J].測繪與空間地理信息,2010(1):116-118.
[8] 陶志剛,趙敬道,譚建成.地理空間索引技術研究[J].測繪學院學報,2002(1):76-78.
[9] 劉吉夫,陳颙,陳棋福,等.WebGIS應用現狀及發展趨勢[J].地震,2003,23(4):10-20.
[10] 張劍波,劉丹,吳信才.GIS中柵格數據存儲管理的研究與實現 [J].桂林工學院學報,2006,26(1):54-58.