王文杰,申傳慶,張 哲,王麗惠
(1.自然資源部陜西基礎(chǔ)地理信息中心,陜西 西安 710054;2.自然資源部第一地形測量隊,陜西 西安 710054)
目前,地圖服務(wù)的種類一般包括瓦片地圖服務(wù)WMTS(web map tile service),動態(tài)地圖服務(wù)WMS(web map service),要素地圖服務(wù)WFS(web feature service)等幾種類型,不同服務(wù)在前端顯示的技術(shù)有所不同。其中瓦片地圖服務(wù)又稱緩存地圖服務(wù),地圖緩存是通過預(yù)先制作完成的不同比例尺級別的地圖分塊圖像(瓦片)進(jìn)行分發(fā),是實現(xiàn)地圖使用的一種非常有效的方法。但其在地圖顯示時,按空間范圍進(jìn)行顯示控制比較困難;動態(tài)地圖服務(wù)與瓦片地圖服務(wù)使用方式類似,二者的主要區(qū)別是動態(tài)地圖的圖層內(nèi)容可以指定,但該方法是在服務(wù)端渲染,因性能原因應(yīng)用較少[1-3]。要素地圖服務(wù)則可以通過屬性、空間范圍等參數(shù)篩選需要顯示的數(shù)據(jù),數(shù)據(jù)過濾效率較低,且需要前端自定義渲染,主要用于數(shù)據(jù)檢索方面。文獻(xiàn)[4]針對ArcGIS 的動態(tài)服務(wù)提出了一種圖像處理的方式實現(xiàn)范圍控制,顯示效果較好,但對瓦片服務(wù)的控制無法實現(xiàn)。文獻(xiàn)[5]對瓦片服務(wù)請求返回的圖片進(jìn)行相交判斷,實時裁切達(dá)到范圍顯示控制,但是由于計算量較大,影響了地圖顯示的效率。文獻(xiàn)[6]嘗試了基于Html5 頁面CSS不規(guī)則遮罩的控制方法,該方法性能因遮罩范圍的坐標(biāo)復(fù)雜度而受到限制。文獻(xiàn)[7]利用ArcGIS Server SOE 和種子填充算法,實現(xiàn)了對ArcGIS 地圖服務(wù)的定制范圍和圖層類別的顯示控制,但只能服務(wù)于Arc-GIS 動態(tài)圖層服務(wù),操作復(fù)雜且容易導(dǎo)致地圖服務(wù)異常。從前面列舉的文獻(xiàn)可以看出,對電子地圖顯示范圍控制多是基于傳統(tǒng)柵格地圖,隨著矢量瓦片地圖逐步成為地圖服務(wù)應(yīng)用的熱點,本文主要研究基于矢量瓦片的電子地圖顯示范圍控制方法。
矢量瓦片地圖是一種基于四叉樹金字塔模型,將矢量數(shù)據(jù)按地理格網(wǎng)進(jìn)行分割形成瓦片數(shù)據(jù),客戶端根據(jù)地圖顯示范圍從服務(wù)器獲取相應(yīng)的瓦片,通過指定樣式在客戶端實現(xiàn)地圖的實時繪制[1]。針對矢量瓦片技術(shù),Mapbox 公司制定的矢量瓦片規(guī)范(Mapbox Vector Tile Specification)已經(jīng)被眾多公司和組織所采用,它是一種節(jié)省存儲空間的數(shù)據(jù)編碼方式,能夠在客戶端高效渲染或查詢要素信息。
Mapbox地圖渲染樣式規(guī)范定義了一套地圖所呈現(xiàn)的視覺外觀配置方法,內(nèi)容包括繪制數(shù)據(jù)源、過濾器、圖層樣式、字體等內(nèi)容。其中對矢量圖層的渲染,首先定義ID,引用一個瓦片數(shù)據(jù)源(source),指定的要素內(nèi)容(source-layer),并可對source-layer 內(nèi)容進(jìn)行過濾(filter),然后定義要素渲染的具體參數(shù)(paint)。
基于矢量瓦片技術(shù),研究一種只發(fā)布一套地圖,可實現(xiàn)對該地圖內(nèi)任意區(qū)域單獨顯示的技術(shù)方法,尤其適用于按多級行政區(qū)劃顯示地圖的應(yīng)用中。在發(fā)布完一幅全域地圖后,當(dāng)需要單獨顯示其中某一子域范圍內(nèi)地圖時,只需要從全域地圖中選取子域地圖進(jìn)行展示,而無需再對子域單獨發(fā)布一個的地圖。
矢量瓦片是一種在客戶端進(jìn)行渲染的新型矢量地圖服務(wù),支持地圖樣式的靈活配置,基于此特性,對需要按范圍控制顯示的矢量數(shù)據(jù),可通過前端數(shù)據(jù)過濾的方式對實現(xiàn)數(shù)據(jù)顯示范圍的控制。首先按最小空間單元分割并賦予范圍屬性值,然后進(jìn)行矢量數(shù)據(jù)瓦片,在發(fā)布為矢量瓦片服務(wù)后,客戶端進(jìn)行地圖渲染時可對矢量瓦片按空間范圍屬性標(biāo)識進(jìn)行過濾,從而實現(xiàn)地圖顯示范圍的控制。
矢量瓦片地圖顯示范圍控制的實現(xiàn)流程總體分為兩步,一是在矢量數(shù)據(jù)預(yù)處理與瓦片時,在矢量數(shù)據(jù)屬性中增加區(qū)域標(biāo)識碼;二是對地圖服務(wù)調(diào)用時,在服務(wù)訪問參數(shù)中設(shè)置區(qū)域標(biāo)識碼參數(shù),在返回的矢量瓦片樣式文件中自動添加區(qū)域標(biāo)識碼過濾配置,從而在地圖展示時可實現(xiàn)按區(qū)域進(jìn)行地圖展示。
在數(shù)據(jù)預(yù)處理階段,首先將矢量數(shù)據(jù)按最小區(qū)域單元(如行政區(qū)劃中的村界)進(jìn)行分割,然后根據(jù)數(shù)據(jù)所在的空間區(qū)域?qū)?shù)據(jù)添加區(qū)域代碼屬性(如賦予數(shù)據(jù)所屬行政區(qū)劃中村的代碼值),如果需要按多級空間范圍展示,可對矢量數(shù)據(jù)添加多個級別的空間區(qū)域代碼屬性(如行政區(qū)劃中村所在的鄉(xiāng)鎮(zhèn)代碼、區(qū)縣代碼等)。由于矢量瓦片本身會對矢量數(shù)據(jù)進(jìn)行分割,因此按區(qū)域?qū)κ噶繑?shù)據(jù)進(jìn)行分割,不影響數(shù)據(jù)內(nèi)容的準(zhǔn)確性。
全域范圍P包含子域P1、P2、P3,矢量線要素A包含在全域P中,同時分布在子域P1、P2、P3中,P為一級區(qū)域,P1、P2、P3為二級區(qū)域。在數(shù)據(jù)預(yù)處理階段,在P1、P2、P3的邊界處對A進(jìn)行斷開處理,得到A的子集a1、a2、a3。對a1、a2、a3添加1級區(qū)域?qū)傩訪1,并賦值為P;對a1、a2、a3添加2 級區(qū)域?qū)傩訪2,根據(jù)其所處的2 級空間區(qū)域,分別賦值為P1、P2、P3,屬性設(shè)置結(jié)果如表1所示。
表1 矢量數(shù)據(jù)屬性賦值
圖1 與表1 表示了空間區(qū)域劃分為兩級的情況,如果P1、P2、P3繼續(xù)分割為更小的子域,則需要對a1、a2、a3按更小子域的邊界進(jìn)行分割,同時增加新的子域?qū)傩訪n,屬性賦值以此類推。
圖1 矢量數(shù)據(jù)預(yù)處理
對完成預(yù)處理的矢量數(shù)據(jù),進(jìn)行矢量數(shù)據(jù)切片,并將區(qū)域?qū)傩裕ㄈ?.2 屬性L1、L2)輸出到矢量瓦片中,然后發(fā)布為矢量瓦片服務(wù)。目前常用的矢量數(shù)據(jù)瓦片的商業(yè)工具有ESRI公司的ArcGIS Pro和北京超圖地理信息技術(shù)有限公司的SuperMap iDesktop等,開源工 具 有Geoserver、Mapbox、TileStache、Mapnik 等,各種軟件對矢量數(shù)據(jù)瓦片的包裝格式各不相同,但底層實現(xiàn)都是PBF(google protocol buffers)格式。對矢量瓦片地圖服務(wù)發(fā)布支持的軟件有ArcGIS Portal、SuperMap IServer、GeoServer、Mapbox等。
發(fā)布完成的矢量瓦片地圖,先配置地圖樣式,然后通過Web API進(jìn)行調(diào)用?;谑噶客咂碾娮拥貓D顯示范圍控制是渲染時通過設(shè)置數(shù)據(jù)過濾條件實現(xiàn)的,數(shù)據(jù)過濾條件在地圖渲染時的樣式文件中進(jìn)行配置,由客戶端指定。
如表2 所示,過濾條件以鍵值對應(yīng)的方式進(jìn)行表示。filter為過濾標(biāo)識,其值為一個數(shù)組對象。
表2 顯示范圍過濾條件配置
在實際應(yīng)用中,按行政區(qū)劃對地圖進(jìn)行顯示,是電子地圖顯示范圍過濾最常見的一種應(yīng)用場景。按本文所述技術(shù)原理,以安康市綜合電子地圖為實驗數(shù)據(jù),采用GeoServer制作并發(fā)布矢量瓦片地圖服務(wù),對安康市綜合電子地圖進(jìn)行控制顯示范圍實驗。
在發(fā)布完成矢量瓦片地圖服務(wù)之后,默認(rèn)展示地圖為安康市全域地圖,如圖1 所示。樣式中數(shù)據(jù)過濾配置為filter:["all",["in","CITYCODE","610900"]],其中CITYCODE為市級區(qū)劃代碼的屬性名,610900為安康市區(qū)劃代碼值。
當(dāng)只顯示安康市一個子域旬陽市(縣級市)的地圖時,數(shù)據(jù)過濾配置為filter: ["all", ["in", "COUNTYCODE", "610928"]],其中COUNTYCODE 為縣級區(qū)劃代碼的屬性名,610928 為旬陽市(縣級市)的區(qū)劃代碼值。
當(dāng)同時顯示安康市內(nèi)2 個子域?qū)庩兛h與旬陽市的地圖時, 數(shù)據(jù)過濾配置為filter: ["all", ["in", "COUNTYCODE","610928","610922"],其中,610928為旬陽市(縣級市)的區(qū)劃代碼值,610922為寧陜縣的區(qū)劃代碼值。如需顯示2個以上子域,配置與此類似。
當(dāng)不顯示安康市內(nèi)子域旬陽市的地圖時,數(shù)據(jù)過濾配置為filter: ["none", ["in", "COUNTYCODE", "610928"]],其中,610928 為旬陽市(縣級市)的區(qū)劃代碼值。如需不顯示2個以上子域,配置與此類似。
傳統(tǒng)的地圖服務(wù)應(yīng)用中,如果需要按范圍顯示地圖,則是將數(shù)據(jù)預(yù)先按范圍進(jìn)行裁切,然后發(fā)布為多個地圖服務(wù),這顯然是一種數(shù)據(jù)體不同,其他操作與配置基本相同的服務(wù)提供方式,這種方式對服務(wù)發(fā)布與管理的壓力較大。如上述實驗中的4 種地圖范圍場景,傳統(tǒng)地圖服務(wù)需要發(fā)布4 個單獨的服務(wù),而通過設(shè)置過濾條件的矢量瓦片地圖只需發(fā)布一個服務(wù)即可實現(xiàn)。
本文方法是在客戶端通過數(shù)據(jù)過濾方式實現(xiàn)電子地圖按范圍顯示,發(fā)布一套地圖可支持多種顯示范圍。經(jīng)過實踐驗證,在地理信息服務(wù)應(yīng)用領(lǐng)域內(nèi)能夠滿足地圖按范圍顯示的需求,但這種機(jī)制并沒有從數(shù)據(jù)源頭對數(shù)據(jù)內(nèi)容進(jìn)行控制,如果涉及按空間范圍進(jìn)行數(shù)據(jù)安全控制時,該方法有不足之處。由于矢量瓦片數(shù)據(jù)是一種可編輯的數(shù)據(jù),討論在服務(wù)端直接對數(shù)據(jù)內(nèi)容按空間范圍進(jìn)行過濾時,可以進(jìn)一步拓展矢量瓦片服務(wù)按范圍展示的應(yīng)用場景。