方登茂,張曉平,劉梁
(西安市勘察測(cè)繪院,陜西 西安 710000)
伴隨互聯(lián)網(wǎng)和地理信息技術(shù)的飛速發(fā)展,以制圖表達(dá)為主的紙質(zhì)地圖已經(jīng)全面被電子地圖替代。早期的電子地圖受數(shù)據(jù)量和計(jì)算機(jī)性能約束,無(wú)法滿足電子地圖實(shí)時(shí)在線訪問的需求。柵格瓦片的出現(xiàn),極大地改變了電子地圖加載緩慢、效率低下等問題[1]。隨著地理空間大數(shù)據(jù)時(shí)代的來(lái)臨,不同精度、尺度、維度的地理空間數(shù)據(jù)呈爆炸式增長(zhǎng)[2],傳統(tǒng)柵格瓦片作為緩存數(shù)據(jù),靈活性不足、交互性差、處理周期長(zhǎng),在海量數(shù)據(jù)加載和大數(shù)據(jù)實(shí)時(shí)可視化方面已無(wú)優(yōu)勢(shì)可言[3]。Mapbox于2016年推出了全新的矢量瓦片標(biāo)準(zhǔn),已經(jīng)被國(guó)內(nèi)外主流的商業(yè)軟件和開源平臺(tái)所采用[4]。目前國(guó)內(nèi)學(xué)者在矢量瓦片的可視化渲染[5]、索引優(yōu)化[6]、并行處理[7]、服務(wù)應(yīng)用[8]等方面已經(jīng)有了較多的研究,但在矢量瓦片數(shù)據(jù)組織與生產(chǎn)方面并沒有太大突破。
《新型基礎(chǔ)測(cè)繪體系數(shù)據(jù)庫(kù)建設(shè)試點(diǎn)技術(shù)指南》中指出,“一庫(kù)多能、按需組裝”是未來(lái)我國(guó)地理實(shí)體基礎(chǔ)時(shí)空數(shù)據(jù)庫(kù)的建設(shè)目標(biāo)。本研究在當(dāng)前矢量瓦片相關(guān)應(yīng)用研究的基礎(chǔ)上,基于PostGIS空間數(shù)據(jù)庫(kù),提出了一種無(wú)須事先創(chuàng)建索引和生產(chǎn)瓦片,通過(guò)客戶端請(qǐng)求和服務(wù)端按需響應(yīng)的方式實(shí)時(shí)創(chuàng)建矢量瓦片,簡(jiǎn)化了矢量瓦片的應(yīng)用流程,實(shí)現(xiàn)了矢量瓦片的實(shí)時(shí)創(chuàng)建和按需組裝,擴(kuò)展了矢量瓦片的應(yīng)用方式,可為新型基礎(chǔ)測(cè)繪數(shù)據(jù)庫(kù)建設(shè)提供技術(shù)參考。
矢量瓦片是矢量數(shù)據(jù)多尺度表達(dá)的一種形式,按照特定的規(guī)則對(duì)原始矢量數(shù)據(jù)進(jìn)行分割,采用分級(jí)金字塔的形式進(jìn)行調(diào)用,矢量瓦片格式緊湊、生產(chǎn)效率高、樣式可動(dòng)態(tài)編輯,交互性強(qiáng)[9]。區(qū)別于柵格瓦片,矢量瓦片以二進(jìn)制的方式直接存儲(chǔ)矢量數(shù)據(jù)的描述性信息,包含了瓦片范圍內(nèi)矢量的幾何編碼和屬性編碼。Mapbox的矢量瓦片(mvt)文件采用Google Protocol Buffers(pbf)進(jìn)行編碼,該編碼具有跨平臺(tái)、易擴(kuò)展、通用性強(qiáng)等優(yōu)點(diǎn),便于數(shù)據(jù)的高效渲染和快速查詢[10]。
Mapbox矢量瓦片(mvt)不存儲(chǔ)矢量數(shù)據(jù)的空間范圍和投影等信息,單個(gè)mvt文件采用屏幕坐標(biāo)存儲(chǔ)矢量數(shù)據(jù)的幾何信息。瓦片的左上角為坐標(biāo)系的原點(diǎn),X軸向右為正,Y軸向下為正。解碼器可通過(guò)解析一系列指令,按照坐標(biāo)序列生成幾何圖形編碼。如圖1所示為面狀信息的圖形編碼存儲(chǔ),通過(guò)MoveTo指令確定屏幕點(diǎn)坐標(biāo),通過(guò)LineTo指令結(jié)合相對(duì)位移確定下一節(jié)點(diǎn)位置,ClosePath用于閉合圖形。
Mapbox矢量瓦片(mvt)的屬性數(shù)據(jù)被編碼在矢量要素的一系列標(biāo)簽對(duì)象中,標(biāo)簽引用的key值與幾何圖形中指定的原始key值對(duì)應(yīng)的值一致。對(duì)于復(fù)雜圖形,這種方式可以消除具有相同鍵和相似值引起的屬性冗余,具體原理如圖2所示,左側(cè)表示原始矢量數(shù)據(jù)的GeoJSON格式,右側(cè)為矢量瓦片的屬性編碼。
圖1 Mapbox矢量瓦片的幾何編碼方式
圖2 Mapbox矢量瓦片的屬性編碼方式
PostGIS以插件的形式擴(kuò)展了PostgreSQL數(shù)據(jù)庫(kù)對(duì)空間數(shù)據(jù)類型、空間索引和空間函數(shù)的支持,將PostgreSQL數(shù)據(jù)庫(kù)升級(jí)為空間數(shù)據(jù)庫(kù),實(shí)現(xiàn)了空間數(shù)據(jù)的存儲(chǔ)、管理和操作。PostGIS以WKB(well-known binary)方式存儲(chǔ)和管理矢量數(shù)據(jù),WKB格式是WKT(well-known text)格式的二進(jìn)制表達(dá),WKT(Well-known text)是開放地理空間聯(lián)盟OGC制定的一種文本標(biāo)記語(yǔ)言,用于表示矢量幾何對(duì)象、空間參照系統(tǒng)及空間參照系統(tǒng)之間的轉(zhuǎn)換。如表1表達(dá)了矢量數(shù)據(jù)的WKT和GeoJSON格式。
PostGIS將矢量數(shù)據(jù)的圖形和屬性分別以相應(yīng)的字段存儲(chǔ)于Postgresql的表結(jié)構(gòu)中,使矢量數(shù)據(jù)的圖形與屬性均可作為數(shù)據(jù)庫(kù)字段進(jìn)行管理和操作。如圖3所示為POI點(diǎn)的shapefile數(shù)據(jù)在數(shù)據(jù)庫(kù)表結(jié)構(gòu)中的存儲(chǔ),geom字段表達(dá)了矢量數(shù)據(jù)的圖形,以WKB格式存儲(chǔ)。
WKT格式和GeoJSON格式對(duì)照 表1
圖3 矢量數(shù)據(jù)在PostGIS中的存儲(chǔ)
Mapbox矢量瓦片采用Web Mercator作為默認(rèn)投影方式,使用了和Google地圖相同的瓦片編號(hào)方式,實(shí)現(xiàn)了全球不同分辨率和任意范圍坐標(biāo)與實(shí)際空間位置的一一對(duì)應(yīng)。以“https://{address}/{version}/{name}/{z}/{x}/{y}.mvt”為例,該矢量瓦片的請(qǐng)求url主要包含了4個(gè)參數(shù):name代表矢量瓦片服務(wù)的名稱;z代表當(dāng)前請(qǐng)求數(shù)據(jù)所在的層級(jí);x代表該層級(jí)下瓦片所處的行號(hào);y代表該層級(jí)下瓦片所處的列號(hào)。遵循以上4個(gè)參數(shù),以PostGIS存儲(chǔ)的矢量數(shù)據(jù)為數(shù)據(jù)源,構(gòu)建服務(wù)端矢量瓦片API,按照客戶端的請(qǐng)求按需生產(chǎn)和組裝矢量瓦片,并將生成的mvt文件實(shí)時(shí)返回客戶端,具體流程如圖4所示:
圖4 矢量瓦片按需組裝技術(shù)流程
(1)矢量瓦片的客戶端可支持Web端、桌面端、移動(dòng)端,采用對(duì)應(yīng)的地圖引擎或SDK按照矢量瓦片的服務(wù)地址實(shí)時(shí)請(qǐng)求服務(wù)端的API,并接收服務(wù)端返回的矢量瓦片數(shù)據(jù)進(jìn)行可視化渲染;
(2)服務(wù)端接收客戶端的請(qǐng)求參數(shù),獲取矢量瓦片的服務(wù)名、層級(jí)、瓦片行號(hào)和瓦片列號(hào),結(jié)合Google地圖的瓦片編號(hào)方式和文獻(xiàn)[11],通過(guò)z,x和y計(jì)算對(duì)應(yīng)瓦片的坐標(biāo)范圍;
(3)服務(wù)端按照請(qǐng)求的服務(wù)名和瓦片的坐標(biāo)范圍組裝檢索對(duì)應(yīng)矢量數(shù)據(jù)的SQL語(yǔ)句。主要是通過(guò)瓦片的服務(wù)名確定對(duì)應(yīng)的矢量數(shù)據(jù)表,以瓦片坐標(biāo)范圍作為空間約束,執(zhí)行空間查詢,獲取對(duì)應(yīng)瓦片的幾何圖形和屬性信息,并采用PostGIS的ST_AsMvtGeom和ST_AsMVT函數(shù)將該瓦片對(duì)應(yīng)的矢量數(shù)據(jù)轉(zhuǎn)換為Mapbox的mvt格式;
(4)數(shù)據(jù)庫(kù)執(zhí)行SQL查詢語(yǔ)句,返回對(duì)應(yīng)的矢量瓦片數(shù)據(jù),服務(wù)端設(shè)置響應(yīng)標(biāo)頭和狀態(tài)碼,組裝mvt格式的二進(jìn)制流,并向客戶端返回矢量瓦片數(shù)據(jù)。
相對(duì)于柵格瓦片,矢量瓦片通常由地圖引擎在前端進(jìn)行直接渲染,由特定的渲染描述文件實(shí)現(xiàn)矢量數(shù)據(jù)的可視化?;赪ebGL技術(shù),前端地圖引擎可以承載海量數(shù)據(jù)的實(shí)時(shí)渲染,如圖5所示,客戶端地圖引擎接收服務(wù)端返回的二進(jìn)制矢量瓦片、字體庫(kù)和樣式文件,按樣式文件進(jìn)行配置和讀取,保證了各個(gè)圖層的高效渲染和表達(dá)。
圖5 矢量瓦片的前端渲染方式
本實(shí)驗(yàn)采用PostGIS空間數(shù)據(jù)庫(kù)存儲(chǔ)原始矢量數(shù)據(jù),按照矢量瓦片按需組裝與渲染的技術(shù)流程,基于Node.js開發(fā)了矢量瓦片的服務(wù)端應(yīng)用,并通過(guò)前端的地圖引擎進(jìn)行調(diào)用和可視化渲染,對(duì)矢量瓦片按需組裝的技術(shù)進(jìn)行了實(shí)現(xiàn)和驗(yàn)證。
本實(shí)驗(yàn)以西安市約10 000 km2范圍內(nèi)的建筑物面、道路線和興趣點(diǎn)作為實(shí)驗(yàn)數(shù)據(jù),數(shù)據(jù)總大小為 3.32 GB,數(shù)據(jù)總記錄為498.1萬(wàn)條。將所有矢量數(shù)據(jù)統(tǒng)一轉(zhuǎn)換至Web Mercator投影坐標(biāo)系下,建立了對(duì)應(yīng)的數(shù)據(jù)庫(kù)表結(jié)構(gòu),采用PostGIS的Shapefile Import工具將原始Shapefile數(shù)據(jù)導(dǎo)入PostGIS空間數(shù)據(jù)庫(kù),并配置了相關(guān)坐標(biāo)基準(zhǔn)參數(shù),實(shí)現(xiàn)了空間數(shù)據(jù)與屬性數(shù)據(jù)的結(jié)構(gòu)化存儲(chǔ)。具體數(shù)據(jù)信息如表2所示。
本次實(shí)驗(yàn)所采用的數(shù)據(jù) 表2
本實(shí)驗(yàn)服務(wù)器端硬件處理器為Intel(R) Core(TM) i5-4430 CPU 3.00GHz,內(nèi)存 32 GB,Postgresql數(shù)據(jù)庫(kù)版本為v11.7,PostGIS版本為v3.1,Node.js版本為v14.2,前端地圖引擎采用Mapbox GL JS v2.2。
為了測(cè)試和分析矢量瓦片按需組裝的性能,服務(wù)端程序以單進(jìn)程的方式部署,客戶端基于Mapbox開發(fā)測(cè)試頁(yè)面,實(shí)現(xiàn)了不同數(shù)據(jù)類型矢量瓦片的動(dòng)態(tài)請(qǐng)求、按需組裝和實(shí)時(shí)渲染。具體結(jié)果如圖6所示:
由于本研究并沒有考慮要素綜合及數(shù)據(jù)壓縮,原始矢量數(shù)據(jù)在所有層級(jí)下均完全可見,地圖層級(jí)越小,單個(gè)瓦片的矢量要素?cái)?shù)據(jù)量越大。本實(shí)驗(yàn)通過(guò)抓取同一地圖視角內(nèi)不同層級(jí)下矢量瓦片請(qǐng)求的響應(yīng)時(shí)間,統(tǒng)計(jì)了15級(jí)~20級(jí)下不同圖層的平均響應(yīng)速度和矢量瓦片的平均大小,用于分析矢量瓦片的加載效率。
圖6 矢量瓦片按需組裝可視化渲染
矢量瓦片響應(yīng)速度及數(shù)據(jù)量統(tǒng)計(jì) 表3
如表3所示,從總體上來(lái)看,單進(jìn)程下矢量瓦片數(shù)據(jù)響應(yīng)性能優(yōu)異,客戶端渲染流暢,實(shí)時(shí)性好,按需組裝效率高。在最大縮放級(jí)別下,平均響應(yīng)時(shí)間能保證在 300 ms以內(nèi),L18級(jí)~L20級(jí)別下,服務(wù)端的響應(yīng)性能相差不大。隨著地圖縮放級(jí)別的變小,所請(qǐng)求瓦片的數(shù)據(jù)量變大,矢量瓦片的實(shí)時(shí)組裝性能略有衰減,服務(wù)端組裝和響應(yīng)消耗的時(shí)間變長(zhǎng),但總體響應(yīng)速度均在 984 ms以內(nèi)。實(shí)驗(yàn)證明,無(wú)論是單圖層請(qǐng)求還是多圖層的請(qǐng)求,在約500萬(wàn)規(guī)模的數(shù)據(jù)量下,該方法的按需組裝效率完全能夠滿足日常應(yīng)用和可視化的要求。
本文基于PostGIS空間數(shù)據(jù)庫(kù),提出了一種服務(wù)端矢量瓦片按需組裝技術(shù),并以點(diǎn)狀、線狀和面狀矢量數(shù)據(jù)進(jìn)行了按需組裝實(shí)驗(yàn),得到了以下結(jié)論:
(1)該方法無(wú)須預(yù)先創(chuàng)建索引和生產(chǎn)瓦片,由服務(wù)端實(shí)時(shí)響應(yīng)數(shù)據(jù)請(qǐng)求,實(shí)用性強(qiáng)、實(shí)時(shí)性好,矢量瓦片能夠隨著空間數(shù)據(jù)庫(kù)的更新動(dòng)態(tài)組裝,保證了數(shù)據(jù)的現(xiàn)勢(shì)性,也為矢量瓦片數(shù)據(jù)的動(dòng)態(tài)更新提供了新的思路;
(2)服務(wù)端的實(shí)時(shí)組裝性能優(yōu)異,在單進(jìn)程下能夠承載500萬(wàn)規(guī)模要素的實(shí)時(shí)矢量切片訪問,大比例尺下要素組裝和瓦片響應(yīng)均在毫秒級(jí);
(3)該方法擴(kuò)展性強(qiáng)、交互性好,依托關(guān)系型數(shù)據(jù)庫(kù),能夠靈活表達(dá)多維度的語(yǔ)義信息,從而實(shí)現(xiàn)矢量瓦片與專題數(shù)據(jù)的動(dòng)態(tài)集成和屬性重組;
(4)按照特定的分類、分級(jí)和數(shù)據(jù)標(biāo)準(zhǔn),采用該方法建立地理實(shí)體數(shù)據(jù)庫(kù),能夠?yàn)椤耙粠?kù)多能、按需組裝”的新型基礎(chǔ)測(cè)繪建設(shè)提供技術(shù)參考。
下一步的研究工作是在當(dāng)前技術(shù)路線的基礎(chǔ)上,采用數(shù)據(jù)庫(kù)集群和多進(jìn)程的方式存儲(chǔ)和管理城市級(jí)海量數(shù)據(jù),實(shí)現(xiàn)矢量瓦片數(shù)據(jù)的并行處理、高并發(fā)請(qǐng)求、地理分析、矢量查詢等應(yīng)用。