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