基於PG與PostGIS搭建實時矢量瓦片服務

在PG相關分享上已經分享過兩次關於PG與PostGIS做實時矢量切片這塊的內容了。這次寫幾篇博客來分享這塊的知識。

矢量瓦片(MVT)

本文中提到的矢量瓦片爲Mapbox Vector Tile格式,簡稱MVT。

MVT標準

MVT標準參考Mapbox官方文檔。傳送門鏈接

矢量瓦片優勢

  1. 可以支持高分辨率屏幕的顯示
  2. 地圖渲染在前端,可以支持一套數據隨意更改配圖方案,解決傳統柵格瓦片動態樣式上的問題
  3. 要素查詢可以在前端進行
  4. 保持了矢量數據的優勢,同時採用切片方式又提高了傳輸上的效率

實時矢量瓦片

顧明思議,矢量瓦片不在使用工具線下進行預先切片,採用即時瀏覽即時傳輸矢量瓦片。

爲什麼要有實時的矢量瓦片

採用實時切的矢量瓦片可以做到數據編輯功能。如果採用預先切片方式,那麼在數據編輯後,瀏覽的數據還是舊的數據,做到實時的矢量瓦片後,編輯數據之後瀏覽到的矢量瓦片就是最新數據。這樣就可以解決數據編輯後瓦片不是最新的問題。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章