一、矢量瓦片的基本原理和相關格式
現階段,電子地圖瓦片主要使用兩種方式,一種是傳統的柵格瓦片,另外一種是新出的矢量瓦片(Vector Tiles),前者是采用四叉樹金字塔模型的分級方式,將地圖切割成無數大小相等的矩形柵格圖片,由這些矩形柵格圖片按照一定規則拼接成不同層級的地圖顯示。
矢量瓦片類似柵格瓦片,是將矢量數據用多層次模型分割成矢量要素描述文件存儲在服務器端,再到客戶端根據指定樣式進行渲染繪制地圖,在單個矢量瓦片上存儲著投影于一個矩形區域內的幾何信息和屬性信息。當客戶端通過分布式網絡獲取矢量瓦片、地圖標注字體、圖標、樣式文件等數據后,最終在客戶端進行渲染輸出地圖。
矢量瓦片沒有統一數據標注,mapbox基于Google protocol buffers制定了MAPBOX CECTOR TILE SPECIFICATION通用的矢量瓦片數據標準,被許多公司和組織采用。
矢量瓦片數據組織分成兩層,一層是地圖表達范圍內的瓦片數據集組織模型,另一層是單個瓦片內要素的組織模型。
矢量瓦片數據集的組織模型類似柵格瓦片金字塔模型,包含坐標系、投影方式、瓦片編號已實現任意精度、空間位置與矢量瓦片的對應關系,并被柵格瓦片規范相互兼容,這樣方便將矢量瓦片轉換成柵格瓦片,畢竟兩者采用相似的投影方式和瓦片編號方式。
單個瓦片要素的組織模型將幾何信息和屬性信息分開存儲,幾何信息主要包括點、線、面和未知要素類,元數據信息包含了圖層屬性和要素屬性。
用于描述矢量瓦片屬性信息和幾何信息的文件格式主要有GML/Cesium Vector Tiles/GeoJson(.json)/TopoJSON(.topjson)/Google Protocol Buffers(PBF),其中GeoJSON是一種基于Javascript對象表示法的地理空間信息數據交換格式,通用性強,易讀取,幾乎所有的GIS引擎都支持該格式的動態渲染電子地圖數據,但該格式還是容易有信息冗余的情況。TopoJSON是在GeoJSON上共享幾何要素拓撲編碼,減少冗余信息的數據格式,但它的讀取性較差,支持該格式的軟件不多,所有每次讀取需要使用專門的工具進行轉換才可以,支持該格式的軟件有著名的Web三維軟件Cesium JS(該產品是有AGI公司開發的一款開源三維地圖的JS庫,主要是可以用于時空數據領域的一些三維開發,它在github上已經有6.2K個star了,github地址如下:https://github.com/CesiumGS/cesium),PBF是一種更高效輕便的結構化數據存儲格式,將矢量瓦片數據打包成矢量瓦片包可以便于網絡傳輸和數據庫存儲,常見的矢量瓦片有VTPK格式(用于ArcGIS)、MBTiles格式(用于SQLite數據庫存儲)等。
雖然矢量瓦片也采用金字塔的方式進行存儲數據,但是由于其默認網格數較高,以PBF為例,單個矢量瓦片的網格是4096*4096,所以在視網膜屏等設備上也顯示地很清楚,而不會出現鋸齒,同時這個網格數可以隨時進行修改調整,以更精確的方式來記錄幾何位置信息從而適應不同屏幕的要求。同時,在矢量瓦片中,會將其幾何信息轉換成指令集表達,再將指令存儲到32位無符號整數進行存儲。而在存儲屬性信息時,則是以不同的形式表示,geojson直接標注,PBF則是用索引號進行標注。
矢量瓦片之所以能夠在客戶端進行快速渲染,主要得益于客戶端圖形渲染技術的發展,推動了地圖渲染引擎的快速發展,常見的圖形渲染技術有OpenGL/WebGL等,而OpenGL和WebGL是底層3D繪圖技術標注,根據這些標準衍生出了許多地圖渲染引擎,例如使用OpenGL 圖形API的開源3D渲染引擎Tangram(包括用于瀏覽器渲染引擎Tangram-JS和移動終端渲染引擎Tangram-ES,該產品有mapzen開源提供,github地址為https://github.com/tangrams/tangram,具有1.7K個star)、Mapbox使用的Mapbox GL地圖渲染引擎(包含瀏覽器渲染引擎Mapbox GL JS和移動端渲染引擎Mapbox GL Native,github地址為https://github.com/mapbox/mapbox-gl-js ,具有6.4k個star)。
矢量瓦片所使用的樣式文件是用來在客戶端定義繪制地圖數據源、繪制順序和繪制樣式等規則的文件,比如Mapbox使用的json樣式文件可以讓用戶利用Mapbox GL JS地圖引擎實時渲染出互動性強的3D場景地圖。
二、矢量瓦片和柵格瓦片的優劣勢
使用矢量瓦片地圖來提供地圖比柵格瓦片地圖有更好的顯示效果,互動性也強,實現二三維一體化,更新速度快,地圖樣式快速切換,占用空間少,無極縮放顯示等特點。
其中占用空間少是和柵格瓦片進行的對比,傳統的柵格瓦片每一張瓦片大小在十幾KB左右,雖然看上去每張瓦片的大小不大,但是若放到全國或世界范圍內來看的,需要的瓦片數據量極大,按照四叉樹金字塔切割的柵格瓦片的上一級的某張瓦片可以切割成下一級的四張瓦片,因此,瓦片的總量也是極快的增加,甚至最終所需存儲空間可以達到TB級別,而矢量瓦片就相對小很對,以全國數據的切圖來看,最終所需的切圖所需存儲空間也僅需要GB級別的就可以了。同時,由于矢量瓦片的渲染是在客戶端進行的,它僅需要將請求到的數據按照樣式文件進行渲染即可,這讓矢量瓦片在不改變切圖比例與地圖內容的情況下,可以很快的調整地圖樣式,而不用為調整地圖樣式而重新進行切圖,并且矢量瓦片和柵格瓦片雖然都需要對矢量數據進行切圖預處理,但實際上由于矢量瓦片切圖僅是針對幾何信息和屬性信息進行分層處理,所以它相對于柵格瓦片需要對圖像分割來說速度要快很對,全國數據的柵格切圖工作基本上是以周為單位的處理,而矢量瓦片可能僅需幾天時間,這對于某些需要快速處理的項目來說具有先天優勢,簡單的將矢量瓦片和柵格瓦片的優劣勢進行比較后,可以得到以下表格內容:
瓦片形式 | 優勢 | 劣勢 |
矢量瓦片 | 瓦片占用空間低,瓦片切圖效率高,渲染地圖效果快,可以隨時動態調整地圖樣式,地圖分辨率高。 | 對客戶端性能要求比較高,對舊設備兼容性存在問題。 |
柵格瓦片 | 瓦片提前渲染,對客戶端性能要求低,性能穩定。 | 瓦片占用空間高,瓦片切圖效率低,無法隨時動態調整地圖樣式,地圖分辨率低,加載速度比較慢。 |
鑒于矢量瓦片的優勢以及各方面的考慮,現在大部分互聯網地圖服務提供商都開始在其網站上提供的地圖服務換成矢量瓦片進行地圖展示,這里面就包括百度地圖、高德地圖、騰訊地圖、谷歌地圖等,但是依然會有不少互聯網地圖服務提供商依據在提供柵格瓦片地圖,這里有搜狗地圖、Bing Map、天地圖·北京等。(以上信息是截止本次文章撰寫時統計的,不排除后來存在變動。)
三、矢量瓦片切片的主要技術流程
雖有現在矢量瓦片已經逐步成為一張地圖瓦片的主流方式,但是各大廠商的切片工具和運行環境卻還是各不相同,常用的矢量瓦片切片工具有Mapbox的Mapbox Studio和Tippecanoe(前者需要訪問Mapbox的在線服務,后者為Mapbox的開源產品)、OGC的開源產品GeoServer、Esri的ArcGIS Pro、Osgeo的開源產品MapServer等,這些工具都可以對矢量數據按照矢量瓦片要求進行切圖,雖然這些工具不一致,但它們都需要遵循矢量四叉書金字塔模型的原理,將矢量數據發布成各自格式的矢量瓦片數據包,同時,它們的主要技術方法是一致,基本按照以下流程進行:
①獲取矢量數據;
1.1、獲取矢量文件(.shp/.tab等);
1.2、矢量數據入庫形成矢量數據表格;
②矢量瓦片制作;
2.1、獲取切圖范圍、切圖方式、切圖等級等信息,確保切片后能滿足使用;
2.2、獲取多層矢量瓦片數據表;
2.3、將矢量瓦片文件(Geojson/Topojson/PBF等)放入到不同圖層下;
③服務發布與展示
3.1、以服務的形式將矢量瓦片發布出來,并提供給客戶端;
3.2、客戶端按照一定調用規則調用矢量瓦片服務,并按照樣式文件進行前端渲染展示。
基本上大部分的切片工具都是按照這一流程對矢量數據進行的切片工作,即使是不同的廠商和切片工具,只需要按照類似過程進行處理即可完成切片工作,另外在2018年,OGC也參與到矢量瓦片這一技術的研究中,驗證了相關信息, 并形成了相關報告,詳見https://www.ogc.org/projects/initiatives/vt-pilot-2018 。
另外,不同切片工具按照不同的切片方案產生的矢量瓦片數據占用存儲大小也不一致,主要原因是在于其保留的矢量瓦片的屬性信息不同導致的,在瓦片幾何信息一致的情況下,切片方案內制定的矢量瓦片屬性信息規則不一樣,其最終產生的矢量瓦片規則也會存在差異,這種差異最終影響的不僅僅是矢量瓦片占用的存儲空間,也會影響切片工具在進行切圖工作所需要耗費的時間上,例如ArcGIS Pro在進行切片是會按照一定抽稀策略來對矢量數據的屬性信息進行抽稀,僅保留有用的屬性信息,而使用GeoServer的切片工具則會保留全部的屬性信息,這就導致兩種最終切片的存儲空間的巨大差異,例如一個城市的地圖,用ArcGIS Pro切片會有幾百MB的矢量瓦片包,而用GeoServer則會需要幾百GB的矢量瓦片包,因此在使用不同切片工具生產矢量瓦片的時候需要考慮到這些內容。
四、跨平臺調用矢量瓦片數據
由于矢量瓦片沒有統一標準,因此我們在互聯網上常見的使用矢量瓦片的互聯網地圖在制作矢量瓦片的時候只需要遵循矢量四叉樹金字塔模型的原理即可,因此,高德地圖、百度地圖等互聯網地圖提供商在使用矢量瓦片的時候紛紛按照自己的矢量瓦片原則進行地圖切片,這就導致了你在使用它的地圖瓦片時,必須按照它制定的規則進行渲染才能將地圖顯示出來,那么不同切圖工具切出來的矢量瓦片是否夠相互調用了,答案是肯定的,但是你在調用它的瓦片時還是需要遵守它的切圖規則來進行。
跨平臺調用的時候,可以通過架設一套微服務來將請求的矢量瓦片數據規格轉成被請求的矢量瓦片數據規格,通過微服務將客戶端的請求進行重新編碼后發送至服務器端進行請求,再將服務器端的返回的數據按照客戶端的請求規格再次進行編碼后返回給客戶端進行渲染展現。
具體如何實現跨越參考不同平臺的的開發文檔進行設置,這里就不在細聊了,再聊下去就不是常識了。
另外附上一些可以參考的開發文檔的訪問鏈接:
①GeoServer開發文檔:https://docs.geoserver.org/
②MapServer開發文檔:https://www.osgeo.cn/mapserver/documentation.html
③tippecanoe開發文檔:https://github.com/mapbox/tippecanoe
④Mapbox GL JS開發文檔:https://docs.mapbox.com/mapbox-gl-js/api/
⑤Mapbox Vector Tiles API 開發文檔:https://docs.mapbox.com/api/maps/#vector-tiles
⑥ArcGIS Pro快速入門教程:https://pro.arcgis.com/zh-cn/pro-app/get-started/introducing-arcgis-pro.htm
⑦Cesium開發手冊:https://cesium.com/docs/
參考文獻:
[1]胡振彪, 趙軍, 韓磊,等. 矢量電子地圖瓦片制作性能評估與應用[J]. 測繪科學, 2020, v.45;No.260(02):142-148+169.
[2]翁世杰, 朱雪堅, 黃婷,等. 基于Mapbox矢量切片在線配圖平臺的設計與實現[J]. 地理信息世界, 2018, v.25;No.130(04):72-76.
[3]陳舉平,丁建勛.矢量瓦片地圖關鍵技術研究[J].地理空間信息,2017,15(08):44-47+10.
[4]ESCAGE.【GISER && Painter】矢量切片(Vector tile)[EB/OL].https://www.cnblogs.com/escage/p/6387529.html,2017-02-13.