矢量瓦片的常識

一、矢量瓦片的基本原理和相關(guān)格式

現(xiàn)階段,電子地圖瓦片主要使用兩種方式,一種是傳統(tǒng)的柵格瓦片,另外一種是新出的矢量瓦片(Vector Tiles),前者是采用四叉樹金字塔模型的分級方式,將地圖切割成無數(shù)大小相等的矩形柵格圖片,由這些矩形柵格圖片按照一定規(guī)則拼接成不同層級的地圖顯示。

矢量瓦片類似柵格瓦片,是將矢量數(shù)據(jù)用多層次模型分割成矢量要素描述文件存儲在服務(wù)器端,再到客戶端根據(jù)指定樣式進(jìn)行渲染繪制地圖,在單個矢量瓦片上存儲著投影于一個矩形區(qū)域內(nèi)的幾何信息和屬性信息。當(dāng)客戶端通過分布式網(wǎng)絡(luò)獲取矢量瓦片、地圖標(biāo)注字體、圖標(biāo)、樣式文件等數(shù)據(jù)后,最終在客戶端進(jìn)行渲染輸出地圖。

矢量瓦片沒有統(tǒng)一數(shù)據(jù)標(biāo)注,mapbox基于Google protocol buffers制定了MAPBOX CECTOR TILE SPECIFICATION通用的矢量瓦片數(shù)據(jù)標(biāo)準(zhǔn),被許多公司和組織采用。

矢量瓦片數(shù)據(jù)組織分成兩層,一層是地圖表達(dá)范圍內(nèi)的瓦片數(shù)據(jù)集組織模型,另一層是單個瓦片內(nèi)要素的組織模型。

矢量瓦片數(shù)據(jù)集的組織模型類似柵格瓦片金字塔模型,包含坐標(biāo)系、投影方式、瓦片編號已實(shí)現(xiàn)任意精度、空間位置與矢量瓦片的對應(yīng)關(guān)系,并被柵格瓦片規(guī)范相互兼容,這樣方便將矢量瓦片轉(zhuǎn)換成柵格瓦片,畢竟兩者采用相似的投影方式和瓦片編號方式。

單個瓦片要素的組織模型將幾何信息和屬性信息分開存儲,幾何信息主要包括點(diǎn)、線、面和未知要素類,元數(shù)據(jù)信息包含了圖層屬性和要素屬性。

用于描述矢量瓦片屬性信息和幾何信息的文件格式主要有GML/Cesium Vector Tiles/GeoJson(.json)/TopoJSON(.topjson)/Google Protocol Buffers(PBF),其中GeoJSON是一種基于Javascript對象表示法的地理空間信息數(shù)據(jù)交換格式,通用性強(qiáng),易讀取,幾乎所有的GIS引擎都支持該格式的動態(tài)渲染電子地圖數(shù)據(jù),但該格式還是容易有信息冗余的情況。TopoJSON是在GeoJSON上共享幾何要素拓?fù)渚幋a,減少冗余信息的數(shù)據(jù)格式,但它的讀取性較差,支持該格式的軟件不多,所有每次讀取需要使用專門的工具進(jìn)行轉(zhuǎn)換才可以,支持該格式的軟件有著名的Web三維軟件Cesium JS(該產(chǎn)品是有AGI公司開發(fā)的一款開源三維地圖的JS庫,主要是可以用于時(shí)空數(shù)據(jù)領(lǐng)域的一些三維開發(fā),它在github上已經(jīng)有6.2K個star了,github地址如下:https://github.com/CesiumGS/cesium),PBF是一種更高效輕便的結(jié)構(gòu)化數(shù)據(jù)存儲格式,將矢量瓦片數(shù)據(jù)打包成矢量瓦片包可以便于網(wǎng)絡(luò)傳輸和數(shù)據(jù)庫存儲,常見的矢量瓦片有VTPK格式(用于ArcGIS)、MBTiles格式(用于SQLite數(shù)據(jù)庫存儲)等。

雖然矢量瓦片也采用金字塔的方式進(jìn)行存儲數(shù)據(jù),但是由于其默認(rèn)網(wǎng)格數(shù)較高,以PBF為例,單個矢量瓦片的網(wǎng)格是4096*4096,所以在視網(wǎng)膜屏等設(shè)備上也顯示地很清楚,而不會出現(xiàn)鋸齒,同時(shí)這個網(wǎng)格數(shù)可以隨時(shí)進(jìn)行修改調(diào)整,以更精確的方式來記錄幾何位置信息從而適應(yīng)不同屏幕的要求。同時(shí),在矢量瓦片中,會將其幾何信息轉(zhuǎn)換成指令集表達(dá),再將指令存儲到32位無符號整數(shù)進(jìn)行存儲。而在存儲屬性信息是,則是以不同的是表示,geojson直接標(biāo)注,PBF則是用索引號進(jìn)行標(biāo)注。

矢量瓦片之所以能夠在客戶端進(jìn)行快速渲染,主要得益于客戶端圖形渲染技術(shù)的發(fā)展,推動了地圖渲染引擎的快速發(fā)展,常見的圖形渲染技術(shù)有OpenGL/WebGL等,而OpenGL和WebGL是底層3D繪圖技術(shù)標(biāo)注,根據(jù)這些標(biāo)準(zhǔn)衍生出了許多地圖渲染引擎,例如使用OpenGL 圖形API的開源3D渲染引擎Tangram(包括用于瀏覽器渲染引擎Tangram-JS和移動終端渲染引擎Tangram-ES,該產(chǎn)品有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)。

矢量瓦片所使用的樣式文件是用來在客戶端定義繪制地圖數(shù)據(jù)源、繪制順序和繪制樣式等規(guī)則的文件,比如Mapbox使用的json樣式文件可以讓用戶利用Mapbox GL JS地圖引擎實(shí)時(shí)渲染出互動性強(qiáng)的3D場景地圖。

二、矢量瓦片和柵格瓦片的優(yōu)劣勢

使用矢量瓦片地圖來提供地圖比柵格瓦片地圖由更好的顯示效果,互動性也強(qiáng),實(shí)現(xiàn)二三維一體化,更新速度快,地圖樣式快速切換,占用空間少,無極縮放顯示等特點(diǎn)。

其中占用空間少是和柵格瓦片進(jìn)行的對比,傳統(tǒng)的柵格瓦片每一張瓦片大小在十幾KB左右,雖然看上去每張瓦片的大小不大,但是若放到全國或世界范圍內(nèi)來看的,需要的瓦片數(shù)據(jù)量極大,按照四叉樹金字塔切割的柵格瓦片的上一級的某張瓦片可以切割成下一級的四張瓦片,因此,瓦片的總量也是極快的增加,甚至最終所需存儲空間可以達(dá)到TB級別,而矢量瓦片就相對小很對,以全國數(shù)據(jù)的切圖來看,最終所需的切圖所需存儲空間也僅需要GB級別的就可以了。同時(shí),由于矢量瓦片的渲染是在客戶端進(jìn)行的,它僅需要將請求到的數(shù)據(jù)按照樣式文件進(jìn)行渲染即可,這讓矢量瓦片在不改變切圖比例與地圖內(nèi)容的情況下,可以很快的調(diào)整地圖樣式,而不用為調(diào)整地圖樣式而重新進(jìn)行切圖,并且矢量瓦片和柵格瓦片雖然都需要對矢量數(shù)據(jù)進(jìn)行切圖預(yù)處理,但實(shí)際上由于矢量瓦片切圖僅是針對幾何信息和屬性信息進(jìn)行分層處理,所以它相對于柵格瓦片需要對圖像分割來說速度要快很對,全國數(shù)據(jù)的柵格切圖工作基本上是以周為單位的處理,而矢量瓦片可能僅需幾天時(shí)間,這對于某些需要快速處理的項(xiàng)目來說具有先天優(yōu)勢,簡單的將矢量瓦片和柵格瓦片的優(yōu)劣勢進(jìn)行比較后,可以得到以下表格內(nèi)容:

優(yōu)勢劣勢

矢量瓦片瓦片占用空間低,瓦片切圖效率高,渲染地圖效果快,可以隨時(shí)動態(tài)調(diào)整地圖樣式,地圖分辨率高。對客戶端性能要求比較高,對舊設(shè)備兼容性存在問題。

柵格瓦片瓦片提前渲染,對客戶端性能要求低,性能穩(wěn)定。瓦片占用空間高,瓦片切圖效率低,無法隨時(shí)動態(tài)調(diào)整地圖樣式,地圖分辨率低,加載速度比較慢。

鑒于矢量瓦片的優(yōu)勢以及各方面的考慮,現(xiàn)在大部分互聯(lián)網(wǎng)地圖服務(wù)提供商都開始在其網(wǎng)站上提供的地圖服務(wù)換成矢量瓦片進(jìn)行地圖展示,這里面就包括百度地圖、高德地圖、騰訊地圖、谷歌地圖等,但是依然會有不少互聯(lián)網(wǎng)地圖服務(wù)提供商依據(jù)在提供柵格瓦片地圖,這里有搜狗地圖、Bing Map、天地圖·北京等。(以上信息是截止本次文章撰寫時(shí)統(tǒng)計(jì)的,不排除后來存在變動。)

三、矢量瓦片切片的主要技術(shù)流程

雖有現(xiàn)在矢量瓦片已經(jīng)逐步成為一張地圖瓦片的主流方式,但是各大廠商的切片工具和運(yùn)行環(huán)境卻還是各不相同,常用的矢量瓦片切片工具有Mapbox的Mapbox Studio和Tippecanoe(前者需要訪問Mapbox的在線服務(wù),后者為Mapbox的開源產(chǎn)品)、OGC的開源產(chǎn)品GeoServer、Esri的ArcGIS Pro、Osgeo的開源產(chǎn)品MapServer等,這些工具都可以對矢量數(shù)據(jù)按照矢量瓦片要求進(jìn)行切圖,雖然這些工具不一致,但它們都需要遵循矢量四叉書金字塔模型的原理,將矢量數(shù)據(jù)發(fā)布成各自格式的矢量瓦片數(shù)據(jù)包,同時(shí),它們的主要技術(shù)方法是一致,基本按照以下流程進(jìn)行:

①獲取矢量數(shù)據(jù);

1.1、獲取矢量文件(.shp/.tab等);

1.2、矢量數(shù)據(jù)入庫形成矢量數(shù)據(jù)表格;

②矢量瓦片制作;

2.1、獲取切圖范圍、切圖方式、切圖等級等信息,確保切片后能滿足使用;

2.2、獲取多層矢量瓦片數(shù)據(jù)表;

2.3、將矢量瓦片文件(Geojson/Topojson/PBF等)放入到不同圖層下;

③服務(wù)發(fā)布與展示

3.1、以服務(wù)的形式將矢量瓦片發(fā)布出來,并提供給客戶端;

3.2、客戶端按照一定調(diào)用規(guī)則調(diào)用矢量瓦片服務(wù),并按照樣式文件進(jìn)行前端渲染展示。

基本上大部分的切片工具都是按照這一流程對矢量數(shù)據(jù)進(jìn)行的切片工作,即使是不同的廠商和切片工具,只需要按照類似過程進(jìn)行處理即可完成切片工作,另外在2018年,OGC也參與到矢量瓦片這一技術(shù)的研究中,驗(yàn)證了相關(guān)信息, 并形成了相關(guān)報(bào)告,詳見https://www.ogc.org/projects/initiatives/vt-pilot-2018。

另外,不同切片工具按照不同的切片方案產(chǎn)生的矢量瓦片數(shù)據(jù)占用存儲大小也不一致,主要原因是在于其保留的矢量瓦片的屬性信息不同導(dǎo)致的,在瓦片幾何信息一致的情況下,切片方案內(nèi)制定的矢量瓦片屬性信息規(guī)則不一樣,其最終產(chǎn)生的矢量瓦片規(guī)則也會存在差異,這種差異最終影響的不僅僅是矢量瓦片占用的存儲空間,也會影響切片工具在進(jìn)行切圖工作所需要耗費(fèi)的時(shí)間上,例如ArcGIS Pro在進(jìn)行切片是會按照一定抽稀策略來對矢量數(shù)據(jù)的屬性信息進(jìn)行抽稀,僅保留有用的屬性信息,而使用GeoServer的切片工具則會保留全部的屬性信息,這就導(dǎo)致兩種最終切片的存儲空間的巨大差異,例如一個城市的地圖,用ArcGIS Pro切片會有幾百M(fèi)B的矢量瓦片包,而用GeoServer則會需要幾百GB的矢量瓦片包,因此在使用不同切片工具生產(chǎn)矢量瓦片的時(shí)候需要考慮到這些內(nèi)容。

四、跨平臺調(diào)用矢量瓦片數(shù)據(jù)

由于矢量瓦片沒有統(tǒng)一標(biāo)準(zhǔn),因此我們在互聯(lián)網(wǎng)上常見的使用矢量瓦片的互聯(lián)網(wǎng)地圖在制作矢量瓦片的時(shí)候只需要遵循矢量四叉樹金字塔模型的原理即可,因此,高德地圖、百度地圖等互聯(lián)網(wǎng)地圖提供商在使用矢量瓦片的時(shí)候紛紛按照自己的矢量瓦片原則進(jìn)行地圖切片,這就導(dǎo)致了你在使用它的地圖瓦片時(shí),必須按照它制定的規(guī)則進(jìn)行渲染才能將地圖顯示出來,那么不同切圖工具切出來的矢量瓦片是否夠相互調(diào)用了,答案是肯定的,但是你在調(diào)用它的瓦片時(shí)還是需要遵守它的切圖規(guī)則來進(jìn)行。

跨平臺調(diào)用的時(shí)候,可以通過架設(shè)一套微服務(wù)來將請求的矢量瓦片數(shù)據(jù)規(guī)格轉(zhuǎn)成被請求的矢量瓦片數(shù)據(jù)規(guī)格,通過微服務(wù)將客戶端的請求進(jìn)行重新編碼后發(fā)送至服務(wù)器端進(jìn)行請求,再將服務(wù)器端的返回的數(shù)據(jù)按照客戶端的請求規(guī)格再次進(jìn)行編碼后返回給客戶端進(jìn)行渲染展現(xiàn)。

具體如何實(shí)現(xiàn)跨越參考不同平臺的的開發(fā)文檔進(jìn)行設(shè)置,這里就不在細(xì)聊了,再聊下去就不是常識了。

另外附上一些可以參考的開發(fā)文檔的訪問鏈接:

①GeoServer開發(fā)文檔:https://docs.geoserver.org/

②MapServer開發(fā)文檔:https://www.osgeo.cn/mapserver/documentation.html

③tippecanoe開發(fā)文檔:https://github.com/mapbox/tippecanoe

④Mapbox GL JS開發(fā)文檔:https://docs.mapbox.com/mapbox-gl-js/api/

⑤Mapbox Vector Tiles API 開發(fā)文檔: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開發(fā)手冊:https://cesium.com/docs/


原文地址:

聊一聊矢量瓦片的常識 - JackSirius的文章 - 知乎

https://zhuanlan.zhihu.com/p/272203128

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容