高效地圖緩存分包封裝技術(shù)研究與實(shí)現(xiàn)

鄭天宇,茍宇

( 北京超圖軟件股份有限公司,北京 100015)

論文來(lái)源:《測(cè)繪與空間地理信息》第36卷 增刊

摘要:論述了一種高性能的地圖緩存的分包封裝技術(shù)。通過(guò)高效的算法,將大數(shù)據(jù)量的緩存瓦片封裝為多個(gè)獨(dú)立緩存瓦片包。并通過(guò)多線程等并行技術(shù),有效地提升了緩存的生成效率,加快緩存的讀取速度,降低緩存分發(fā)、部署難度。該技術(shù)較好地解決了大數(shù)據(jù)量下緩存數(shù)據(jù)存儲(chǔ)復(fù)雜性的問(wèn)題。

關(guān)鍵詞: 瓦片式地圖緩存,分包封裝技術(shù),高性能

0 引 言

地理信息系統(tǒng)中的地圖緩存得到了越來(lái)越廣泛的應(yīng)用[1]。Google Maps,Bing Maps,Yahoo Maps、天地圖等都使用地圖緩存來(lái)提供地圖在線瀏覽服務(wù)。通過(guò)將矢量地圖在發(fā)布前渲染生成為地圖緩存,可以避免在提供在線服務(wù)期間動(dòng)態(tài)地生成服務(wù)使用者所請(qǐng)求的圖片,進(jìn)而提高服務(wù)速度,改善服務(wù)體驗(yàn)[2]。但是,傳統(tǒng)的瓦片地圖緩存生成方式將地圖瓦片生成為外存儲(chǔ)器上分散的圖片文件。這種方式雖然能夠滿足地圖緩存預(yù)先生成的需要,也相對(duì)于在服務(wù)使用者請(qǐng)求到來(lái)時(shí)進(jìn)行實(shí)時(shí)渲染要快得多,但是,該方法仍然存在不足:

1) 瓦片文件分散、占用空間大。由于地圖瓦片文件數(shù)量大以及外存儲(chǔ)器所使用的文件系統(tǒng)中多存在最小分配空間限制,存儲(chǔ)在外存儲(chǔ)器上所造成的存儲(chǔ)碎片增多;再加上單個(gè)地圖瓦片圖片體積小,使得實(shí)際數(shù)據(jù)占用存儲(chǔ)空間的比例相對(duì)于存儲(chǔ)碎片的比例小,外存儲(chǔ)器的空間利用率顯著下降。

2) 瓦片存儲(chǔ)在外存儲(chǔ)器上的文件系統(tǒng)中,占用了大量的目錄項(xiàng),造成了查找單個(gè)瓦片文件的速度下降顯著。

3) 數(shù)據(jù)在移動(dòng)時(shí)需要對(duì)每一個(gè)瓦片進(jìn)行操作,數(shù)據(jù)的遷移和部署過(guò)程復(fù)雜,耗時(shí)長(zhǎng)。

4) 分散的瓦片進(jìn)行版權(quán)保護(hù)時(shí)需要通過(guò)在瓦片圖片上加上水印的方式[3],只能夠保護(hù)發(fā)布后的瓦片不會(huì)被盜用。在某些情況下需要地圖瓦片在未授權(quán)的情況下不能夠使用,就必須在文件讀取和傳播上進(jìn)行限制。將瓦片保存為零散圖片文件的方式并不能進(jìn)行此種保護(hù)。

由于分散式的地圖緩存存在的以上種種不足,需要開發(fā)其它的存儲(chǔ)形式來(lái)進(jìn)行地圖瓦片的保存。

本文介紹了一種高性能的地圖緩存文件的分包封裝技術(shù)。該技術(shù)通過(guò)將大量分散的地圖瓦片文件封裝進(jìn)數(shù)量較少的包中,克服了分散式地圖緩存存在的弊端。

1 地圖緩存存儲(chǔ)結(jié)構(gòu)

分包式地圖緩存將整個(gè)地圖緩存區(qū)域分為不同的大小相等的數(shù)據(jù)區(qū)域。每個(gè)區(qū)域中的瓦片被封裝在各個(gè)分包之中。所有分包加上地圖緩存的元數(shù)據(jù)組成了地圖緩存。

客戶端在請(qǐng)求緩存瓦片的時(shí)候都存在局部性的特點(diǎn),即在一段時(shí)間內(nèi)的瓦片請(qǐng)求都集中在某一個(gè)區(qū)域之內(nèi)。為了利用該特點(diǎn),將一個(gè)矩形區(qū)域內(nèi)的所有瓦片存儲(chǔ)在一個(gè)包內(nèi)。一個(gè)單獨(dú)的包可以存儲(chǔ) x 行 x 列的瓦片。同時(shí)在包的起始位置放置該包內(nèi)所有瓦片存儲(chǔ)位置偏移量的索引。

地圖緩存內(nèi)部包含有不同層級(jí)的數(shù)據(jù),例如 Google Maps 包含 18 個(gè)不同的層級(jí)下的數(shù)據(jù)。每一層級(jí)的數(shù)據(jù)又被分割為不同區(qū)域分別存放。圖 1 描繪了此種存儲(chǔ)方式的地圖緩存的結(jié)構(gòu)。

1. 1 元數(shù)據(jù)文件

地圖緩存的元數(shù)據(jù)文件用來(lái)對(duì)于整個(gè)緩存進(jìn)行說(shuō)明。在地圖緩存進(jìn)行操作時(shí),程序根據(jù)元數(shù)據(jù)來(lái)獲取地圖緩存的各個(gè)參數(shù)。元數(shù)據(jù)采用 xml 格式保存。元數(shù)據(jù)文件的內(nèi)容包括各個(gè)層級(jí)的比例尺,數(shù)據(jù)的投影和大地參考系信息,緩存數(shù)據(jù)格式,存儲(chǔ)類型等信息。

1. 2 層級(jí)目錄

瓦片緩存被按照不同的層級(jí)被分別放置到不同的路徑下。該方式也能簡(jiǎn)化緩存的分割、提取和局部數(shù)據(jù)的更新等操作。

1. 3 行劃分和列劃分

在每一個(gè)層級(jí)下,整個(gè)緩存范圍被劃分為 m 行、n 列張瓦片。為了避免將所有瓦片文件保存在一個(gè)目錄下造成該目錄的目錄項(xiàng)過(guò)多,繼而導(dǎo)致查找讀取速度減慢,需要將所有瓦片分別封裝進(jìn)入不同的分包內(nèi)。每個(gè)行下包含多個(gè)列。對(duì)于指定的行、列位置,所有的瓦片都被封裝至一個(gè)分包內(nèi)。

1. 4 分包內(nèi)部結(jié)構(gòu)

分包內(nèi)的數(shù)據(jù)按照固定的格式進(jìn)行組織,如圖 2所示。

更多內(nèi)容請(qǐng)點(diǎn)擊下方的PDF下載