雷 瑛
(1.甘肅省基礎(chǔ)地理信息中心,甘肅 蘭州 730000)
地理國情數(shù)據(jù)要素的空間表達(dá)是基于“所見即所得”的表現(xiàn)形式[9],其矢量要素表達(dá)較為細(xì)碎和密集,給空間拓?fù)溆嬎銕碇笖?shù)級內(nèi)存壓力,同時隨著數(shù)據(jù)量的劇增及客戶端服務(wù)訪問需求的加大,會影響服務(wù)器端對矢量切片數(shù)據(jù)的訪問性能[1-10]。
針對以上問題,本文結(jié)合項目實踐,從3個方面改進(jìn)技術(shù),優(yōu)化流程,提升矢量地圖服務(wù)的訪問效率,實現(xiàn)地理國情海量空間數(shù)據(jù)快速高效的展示。
空間矢量數(shù)據(jù)壓縮本質(zhì)上是利用地圖綜合概念,采用道格拉斯—普克算法(douglas–peucker algo?rithm)[11],通過線要素化簡方式,有選擇性地去掉線上的點,并對其他點進(jìn)行合理位移,以盡可能地保持曲線的形狀特征,最終實現(xiàn)矢量瓦片地圖在客戶端高效的多尺度漸進(jìn)式可視化[12-13]。
道格拉斯-普克算法是將曲線近似表示為一系列點,并減少點的數(shù)量的一種算法。算法的基本思路是對每一條曲線的首末點虛連一條直線,求所有點與直線的距離,并找出最大距離值(dmax),用dmax與限差D相比:若dmax<D,這條曲線上的中間點則全部舍去;若dmax≥D,則保留dmax對應(yīng)的坐標(biāo)點,并以該點為界,把曲線分為兩部分,對這兩部分重復(fù)使用該方法[14-15]。
1.1.1 設(shè)置最大距離值
對線面圖形采用道格拉斯-普克算法進(jìn)行空間壓縮,不同地圖級別設(shè)置不同的最大距離值,如表1所示。最大距離值設(shè)置以經(jīng)緯度坐標(biāo)系為例說明。
表1 最大距離設(shè)置樣例
1.1.2 空間數(shù)據(jù)壓縮
壓縮方法如下:
1)在曲線首尾兩點間虛連一條直線,求出其余各點到該直線的距離,如圖1a。
圖1 空間數(shù)據(jù)壓縮算法
2)選其最大者與閾值相比較,若大于閾值,則離該直線距離最大的點保留,否則將直線兩端點間的各點全部舍去,如圖1b,第4點保留。
3)依據(jù)所保留的點,將已知曲線分成兩部分處理,重復(fù)第a、b步迭代操作,即仍選距離最大者與閾值比較,依次取舍,直到無點可舍去,最后得到滿足給定精度限差的曲線點坐標(biāo),如圖1c、d依次保留第6點、7點,舍去其他點,即完成線的化簡。
通過訪問數(shù)據(jù)庫的方式來實時獲取切片數(shù)據(jù)查詢時間較長,將已獲取的切片數(shù)據(jù)通過MongoDB進(jìn)行緩存處理,以減少數(shù)據(jù)庫訪問次數(shù)。MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,與傳統(tǒng)文件存儲比較,具有高可用的二級索引(文本搜索和地理位置)、高聚合數(shù)據(jù)分析框架、高性能、存儲數(shù)據(jù)方便、支持查詢、使用高效的二進(jìn)制數(shù)據(jù)存儲、自動處理碎片、文件存儲格式為BSON等特點。為了防止單點故障,當(dāng)發(fā)生硬件故障或者其他原因造成的宕機(jī)時,需要使用副本進(jìn)行恢復(fù),建立MongoDB副本集群。
1.2.1 集群架構(gòu)
不同場景下需要建立不同方式的集群,此處建立副本集群,共3個節(jié)點,一個主節(jié)點,另外2個副本節(jié)點,如圖2所示。
圖2 集群架構(gòu)圖
1.2.2 地圖服務(wù)數(shù)據(jù)集合
將每個地圖服務(wù)的矢量切片緩存數(shù)據(jù)存儲在MongoDB中的一個數(shù)據(jù)集合中。集合元素如表2所示。
表2 矢量切片緩存集合元素
復(fù)雜的圖形相交時,直接使用Java-vec?tor-tile-master開源算法計算切片會出現(xiàn)切片數(shù)據(jù)錯誤,導(dǎo)致前端頁面渲染出現(xiàn)異常,此時,應(yīng)對算法進(jìn)行優(yōu)化[16],剔除錯誤情況。
1.3.1 錯誤情況
由于單張矢量切片的范圍是4 096×4 096的矩形面,地理國情監(jiān)測空間矢量線圖形與單張切片矩形范圍面相交有可能會出現(xiàn)相交結(jié)果為線或者點的情況;地理國情監(jiān)測空間矢量面圖形與切片矩形面相交有可能會出現(xiàn)相交結(jié)果為點的情況。如果產(chǎn)生的圖形類型與輸入的圖形類型不一致,會導(dǎo)致前端展示部分切片缺失的情況,如圖3所示。
圖3 Java-vector-tile-master算法錯誤情況
1.3.2 源碼優(yōu)化
原始開源代碼僅支持單部分要素的處理,不支持多部分要素,如遇到多部分要素,生成的矢量切片數(shù)據(jù)在前端展示時會出現(xiàn)切片缺失的情況,需修改開源代碼以支持多部分要素的情況。
為驗證優(yōu)化效果,選取某縣的地表覆蓋數(shù)據(jù)作為測試數(shù)據(jù),在相同軟硬件環(huán)境下,記錄優(yōu)化前和優(yōu)化后不同級別下單張切片的請求時間、切片大小和前端顯示結(jié)果來分析優(yōu)化效果,數(shù)據(jù)情況見表3。
表3 實驗數(shù)據(jù)說明
通過采用優(yōu)化前后的2個不同的矢量切片地圖服務(wù),在相同的軟硬件環(huán)境下,對相同的數(shù)據(jù)調(diào)用,客戶端的響應(yīng)時間優(yōu)化前見表4和圖4,優(yōu)化后見表5和圖5。
表4 優(yōu)化前效率表
圖4 優(yōu)化前效果圖
表5 優(yōu)化后效率
圖5 優(yōu)化后效果圖
采用Douglas–Peucker算法對地理國情監(jiān)測空間矢量數(shù)據(jù)進(jìn)行壓縮,確??臻g圖形基本形狀不變的前提下,剔除圖形中多余的點,降低圖形的空間大小和空間復(fù)雜度,提升了切片計算的效率,降低了切片大小。
采用MongoDB集群持久化切片,將已獲取的切片數(shù)據(jù)進(jìn)行緩存處理,降低了訪問數(shù)據(jù)庫的次數(shù),減少了獲取切片的時間,增強(qiáng)了獲取切片緩存數(shù)據(jù)的穩(wěn)定性。
采用優(yōu)化后的Java-vector-tile-master算法,剔除圖形在復(fù)雜相交情況下獲取切片數(shù)據(jù)錯誤的情況,確保切片數(shù)據(jù)的正確性,避免了前端頁面渲染出現(xiàn)異常的問題。
綜上所述,本文針對地理國情監(jiān)測海量數(shù)據(jù)高效可視化所提出的優(yōu)化矢量數(shù)據(jù)空間壓縮算法和Ja?va-vector-tile-master算法,結(jié)合MongoDB集群持久化切片技術(shù),使得優(yōu)化后較優(yōu)化前不同級別請求響應(yīng)時間提升了50%~80%,不同級別切片大小壓縮了35%~60%,極大地提升了矢量瓦片地圖的訪問效率,實現(xiàn)了客戶端海量空間數(shù)據(jù)的高效可視化。