摘要
隨着 WebGIS 越來越深入人們的生活,人們對 WebGIS 的響應效率、交互性、渲染效果等方面的要求越來越高。現有的網絡地圖瓦片服務已不能完全滿足人們的需求,矢量地圖瓦片技術應運而生。本文主要研究了矢量瓦片的圖形數據和要素數據的編碼、矢量瓦片的組織存儲方式並實現了對矢量瓦片的實時渲染,表明矢量地圖瓦片技術克服了傳統柵格瓦片的缺陷,在交互性、渲染效果及屬性查詢等方面具有很大的優勢和很高的應用價值。
關鍵詞
網絡地圖服務; 矢量地圖瓦片; 編碼; 地圖樣式
地圖已經成為人們工作、學習、生活不可缺少的科學工具[1] 。隨着互聯網技術的不斷發展與完善,產生了一種全新的地圖應用方式———網絡地圖。尤其是當地圖瓦片的概念被提出以來 [2-3] ,地圖瓦片服務快速發展和壯大,Google map、Esri online、天地圖、百度地圖、高德地圖等在線地圖服務相繼出現。這些服務均采用相似的技術,利用金字塔模型緩存多分辨率的柵格瓦片數據,減少了網絡傳輸量,顯著提高了網絡地圖的響應速度,促進了網絡地圖在人們日常生活中的廣泛應用,改變了人們的生活方式。然而由於客戶端獲取到的是預生成的柵格瓦片圖像,在前端的交互性和空間分析等方面還不能完全滿足客戶的需求,隨着 HTML5 技術的發展,網絡地圖的矢量渲染克服了以往的瓶頸。矢量瓦片緩存技術開始發揮其優勢,煥發新的活力,以 Mapbox 為代表的矢量地圖瓦片服務吸引着越來越多人的關注。本文對矢量地圖瓦片技術進行了探討,並通過試驗進行了驗證。
一、主要技術
1. 基於網絡的地圖瓦片服務
網絡地圖瓦片服務(web map tile service),是一種基於瓦片的網絡地圖服務,它以瓦片為單位組織地圖數據
[3-4] ,用戶依據所需空間范圍獲取地圖瓦片數據,實現對局部地圖的快速訪問。網絡地圖瓦片服務依據一定的數學規則,把地圖按照固定的多級比例尺分層,並從每層圖片的左上角開始,按照從左至右、從上到下的順序切割成相同大小(如 256×256 像素)的正方形地圖瓦片,形成一層一層的瓦片矩陣,構成整個瓦片金字塔。瓦片金字塔(瓦片大小 256×256 像素)的組成關系見表 1。
tile(地圖瓦片)技術的出現,將 WebGIS 向前推進了一大步。地圖瓦片技術地解決了客戶端請求地圖時的渲染效率問題和瀏覽器兼容問題。在繼谷歌地圖之后的其他 WebGIS 地圖服務,基本都采用這種技術。矢量數據的瓦片技術也遵循同樣的思路,只是分塊的數據不是柵格圖像,而是矢量數據。當然不管是柵格數據的瓦片化,還是矢量數據的瓦片化,其目的都是通過分塊的方式減少網絡傳輸量,從而縮短響應時間,提高用戶的體驗。而矢量數據的
瓦片化,可以更好地實現客戶端和服務器的交互。
2. 矢量瓦片的編碼技術
柵格瓦片是將圖像切割成一個個 JPEG 或 PNG圖片,而矢量圖層具有多種編碼格式,如 shapefile、GeoJSON 等。為了節省存儲空間和方便管理,Map-box 制定了一種矢量瓦片數據的編碼方法———Vec-tor Tile 規范
[5] ,可以在節省空間的同時實現地圖的快速繪制與屬性數據的快速查詢。Vector Tile 運用Google Protocol Buffers 作為編碼方式,Google Proto-col Buffers 是一種支持多種語言(如 C++、Python等)多平台的可擴展的序列化結構化數據存儲格式,通過自定義數據結構可以跨平台跨語言地實現矢量數據的存儲,而且它以二進制流形式進行存儲,大大節省了存儲空間。Vector Tile 依據投影坐標及瓦片組織體系,實現地理區域范圍與瓦片編號的一
一對應關系。每個 Vector Tile 至少包含一個 Layer,每個 Layer 中又包含其圖形要素和屬性信息,圖形信息被分解成一系列 Line to、Move to、ClosePath 繪圖命令,一個 command id 代表一種操作,其中 1 代表 Move to,2 代表 Line to,7 代表 ColsePath。Line to和 Move to 均有兩個參數,而且每個命令都有一個命令執行次數,參數采取 zigzag 的編碼方式,小的正值和負值的編碼均為小整數,因此參數的編碼值ParameterInteger 的計算公式是 ParameterInteger =(value << 1) ^ (value >> 31)(value 為參數的實際值)。·MoveTo(3,6)·LineTo(5,6)
·LineTo(12,22)·ClosePath以上命令的編碼如圖 1 所示。
3. 瓦片存儲技術
瓦片化之后面臨的一個問題是如何合理存儲規模巨大的瓦片文件,如 16 級可能形成上億數量級的瓦片文件[6] ,此外還面臨快速遷移和離線利用問題。傳統文件系統磁盤存儲碎片化嚴重,影響 IO 性能,且數據可遷移性差,備份、遷移或恢復耗時都很漫長[7] 。Mapbox 公司制定了一種公開的瓦片管理和存儲規范———MBTiles [8] 。MBTiles 規定將生成的瓦片數據存儲在一個 SQLite 數據庫中,形成一個MBTiles 文件,即一個瓦片數據集,實現存儲空間的集約化。由於 SQLite 數據庫兼容大多數主流平台,包括移動平台 Android、iOS,且具有遷移簡單、免安裝的特性[9] ,可以實現地圖瓦片的便捷使用、管理和遷移。將 MBTiles 文件存儲在本地,還可以實現地圖在移動終端的離線顯示。這是對於地圖瓦片存儲和服務的輕便、簡單文件解決方案。MBTiles 文件主要由元數據表(metadata)、tiles視圖和 grid 表組成。metadata 表采用鍵值對的形式來存儲地圖瓦片數據的相關設置,包括兩個文本類型的字段”name”和”value”。元數據表的各字段(keys)說明見表 2。tiles 視圖由兩個表:map 表和 images 表關聯得到,其結構及說明見表 3。
images 表的結構見表 4。
tile_data 存儲 PNG 或 JPG 格式圖像的二進制流數據或矢量數據經 Vector Tile 規范編碼的二進制流數據。
tiles 視圖的結構見表 5。
使用 tiles 視圖的優勢在於可以減少冗余瓦片。地圖中海洋或空曠的土地等區域包含有成千上萬重復而冗余的純色瓦片,類似太平洋中蔚藍色的瓦片,在小比例尺中,它可能只有幾張,但在大比例尺(如1 ∶ 10 000)的地圖中,就會存在上百萬個單一顏色的藍色瓦片。MBTiles 通過拆分瓦片索引表 map 和瓦片數據表 images,使用視圖的方式來關聯二者,這樣成千上萬的瓦片索引就可以指向同一個瓦片圖像,從而大大減少存儲冗余的純色瓦片,提升磁盤利用率及瓦片檢索效率。
4. UTFgrid 技術和要素屬性的利用
在網絡地圖服務的應用中,如果包含較多的鼠標交互操作,傳統做法是在地圖上疊加要素圖層,每個要素有自己的熱點和事件,用於完成鼠標交互。但在大數據量、高並發請求的環境中,客戶端尤其是移動終端上,就不能很好地渲染大數據量的地理要素,面臨嚴重的性能問題 [10] 。這種情況下,出現了一張地圖瓦片結合要素屬性信息的緩存方式,也就是在地圖瓦片之外,額外存儲了按照格網划分的要素屬性信息。這種預先划分的要素屬性信息,稱為屬性瓦片,目前最具代表性的是 MBTiles 規范附屬的 UTFGrid 規范[11] 。
UTFGrid 的解決方式是將這些點或多邊形網格化,在每個像素上存儲一個字符,不同的屬性用不同的字符表示,然后將這個字符表存到 JSON 結構中。這樣,一個 256×256 像素的瓦片會附着一個 256×256 字符表,如果 2×2 像素對應一個 grid,那么就有128×128 個字符表,每個不同的字符就像一個索引去關聯更完整的信息。
UTFGrid 瓦片數據是一個便捷的查找表,包括三部分內容:grid 二維數組、keys 一維數組及 data 對象。grid 二維數組存儲了 256×256 個字符表或128×128 個字符表或 2n×2n 字符表(n≤16),這些字符為 unicode 字符。keys 存儲地理要素信息的密鑰key。data 是個對象,存儲了密鑰 key 對應的地理要素信息。三者之間的關系為:grid 中的每一個字符都對應了一個地理要素的 Key,通過 Key 才能在 data 中找到地圖要素的信息,如圖 2 所示。
每個 UTFGrid 中的字符對應 keys 映射的不同要素。在上述的格網中,字符映射如下:
! => Portugal(葡萄牙)
.# => Spain(西班牙)
$ => Morocco(摩洛哥)
每個像素就是一個觸發點,通過與觸發點交互實現要素屬性的交互和顯示。如當鼠標移動到瓦片上時,根據鼠標在瓦片上的相對位置,獲取到字符表中相應的字符,如在以上的格網中,4 行、58 列查找#字符。通過交互獲得的字符成為下一步關聯其他業務數據的索引,如人口、領土面積等。
5. 靈活地圖樣式配置
圖 3 所示為矢量瓦片地圖樣式設置的主要原理。
對於傳統的柵格地圖瓦片服務,瓦片生成后,用戶只能見到一種風格的地圖,若要改變風格,必須重新配圖和切圖,費時費力。而運用矢量地圖瓦片服務,用戶可以在切片以后,根據自己的需要實時改變地圖的樣式,並且獲得較高分辨率的輸出圖像,提升了用戶交互性和展現靈活性。矢量瓦片數據可以隨用戶要求靈活改變地圖的可視化樣式(點符號、線符號、面符號、文本標注等),為整個圖層換一種展示風格,也可以控制圖層的顯示及顯示的內容
[12] 。如可以為整個鐵路層設置符號為 ( 寬度為 3,顏色為 RGB(170,170,170)),也可以為鐵路層的高鐵要素設置符號為 (寬度為 4,顏色為 RGB(0,176,80))。
樣式化數據是瓦片數據的子集,而瓦片數據通常是用於切片數據源的子集,一套瓦片數據可以支持多種樣式化的地圖,從而形成多個地圖模板(可視化的展示)。
二、應用試驗
為了測試網絡矢量地圖瓦片技術,本文下載OSM 的中國數據,基於開源代碼,研究了網絡矢量地圖瓦片的關鍵技術:矢量瓦片切片、矢量瓦片存儲、矢量瓦片多終端顯示、矢量瓦片多樣式顯示、矢量瓦片高分辨率輸出等。圖 4 是將道路要素層實時更改其渲染樣式得到的結果。
三、結束語
本文面向城市水務管理對信息化建設的迫切需求,采用 Flex 和 Web Service 技術並結合 ArcGISServer 平台,在數字城市地理信息公共服務平台基礎上構建了水文水資源“一張圖”管理系統,為水雨情防御和應急指揮提供了實時的水文水資源空間信息共享平台、空間分析手段及決策依據。