基於PG與PostGIS搭建實時矢量瓦片服務
在PG相關分享上已經分享過兩次關於PG與PostGIS做實時矢量切片這塊的內容了。這次寫幾篇博客來分享這塊的知識。
矢量瓦片(MVT)
本文中提到的矢量瓦片爲Mapbox Vector Tile格式,簡稱MVT。
MVT標準
MVT標準參考Mapbox官方文檔。傳送門鏈接
矢量瓦片優勢
- 可以支持高分辨率屏幕的顯示
- 地圖渲染在前端,可以支持一套數據隨意更改配圖方案,解決傳統柵格瓦片動態樣式上的問題
- 要素查詢可以在前端進行
- 保持了矢量數據的優勢,同時採用切片方式又提高了傳輸上的效率
實時矢量瓦片
顧明思議,矢量瓦片不在使用工具線下進行預先切片,採用即時瀏覽即時傳輸矢量瓦片。
爲什麼要有實時的矢量瓦片
採用實時切的矢量瓦片可以做到數據編輯功能。如果採用預先切片方式,那麼在數據編輯後,瀏覽的數據還是舊的數據,做到實時的矢量瓦片後,編輯數據之後瀏覽到的矢量瓦片就是最新數據。這樣就可以解決數據編輯後瓦片不是最新的問題。
PostGIS中矢量切片相關函數
本文介紹使用PG+PostGIS來做到實時的矢量瓦片,在實戰之前先介紹幾個用到的矢量瓦片相關的函數。
主要函數:
- ST_AsMvtGeom 將Geom轉化爲MVT的geom
- ST_AsMVT 將geom轉換爲MVT數據
- ST_TileEnvelope(3.0以上支持) 根據行列號獲取Envelope
輔助函數:
- ST_Transform 座標轉換函數,用它可以做到支持任何座標系的矢量瓦片
- ST_Simplify 簡化,用它來做線或者面的簡化
- ST_SimplifyPreserveTopology 與簡化類似
實戰
思路:
- 前端地圖庫瀏覽時,將請求URL傳到後臺
- 後端實現URL的服務,根據x、y、z獲取對應範圍數據,使用sql查詢到數據返回給前端
只有點層的SQL語句
點、線、面層在一起的SQL
寫在最後
-
本文先介紹如何使用PG+PostGIS生成矢量瓦片。後續會寫幾篇一些小的優化技巧,用來支持大數據量下的瀏覽,歡迎關注。
-
本人寫了後端服務以及前端瀏覽(mapboxgljs)的源代碼,後端服務使用Go與Node.js分別實現了一遍,以下附上源代碼地址,github鏈接覺得有用動動手給個star。
-
在分享會上的PPT分享給大家,傳送門
關於作者
GISer
小劉先森
QQ: 1016817543
郵箱:[email protected]
github:https://github.com/MrSmallLiu (歡迎star)
相關鏈接
以下爲本人蔘與開發的一些庫,歡迎各位Star、Issues、PR