百萬級要素優化:基於PG與PostGIS的實時矢量瓦片服務

本文由 dbaplus 社羣授權轉載。

之前介紹瞭如何使用PG與PostGIS搭建實時矢量瓦片服務,但未介紹如何做優化,對於日常項目使用基本可以滿足。這篇文章主要試介紹如何瀏覽百萬級要素,示例爲300萬點要素。

《基於PG與PostGIS搭建實時矢量瓦片服務》:https://blog.csdn.net/qq_35241223/article/details/106439268

背景介紹

對於某些應用場景,數據量很容易達到百萬級要素,數據每天都在改變。而且還要考慮在1-6級這種小級別時候的數據展示,那麼這個時候僅僅是PG與PostGIS簡單的矢量瓦片服務比較困難達到客戶想要的效果,這個時候就要考慮做一些優化了。

優化方法

百萬級要素優化對於不同的業務來說,有相應不同的解決辦法,沒有最好,只有更好,這個時候要做考量,下面介紹幾個常用的會考慮使用的方法:

1、依據業務,對要素進行抽稀過濾

根據業務層面,在不同場景瀏覽不同的要素,雖然總的要素在幾百萬,但是這個時候過濾一部分後剩餘要素可以進行實時矢量瓦片展示。

2、幾種抽稀過濾的算法

除第一種方法外,其餘幾種方法包含一些個人的想法與思路,其它小夥伴有其他好的思路,或者對我的想法思路有疑問的話,歡迎在評論區留言。

1)道格拉斯-普客算法(DP)

該算法個人理解爲是簡化的算法,對於線或者面的邊界,可以使用該算法對節點進行抽稀,達到對線或者面的簡化。但是爲什麼在點要素抽稀過濾中也介紹該算法呢?

答案:在軌跡數據中,每一次存儲的都是點位信息(點),所以對於該種數據可以使用該算法進行過濾,但是對於一個點即代表一種信息的數據來說,該算法不太適用。

2)基於網格的抽稀過濾算法

該算法結果爲均勻分佈。

  1. 根據數據範圍以及閾值將範圍劃分網格。
  2. 遍歷網格,利用網格與數據求交(使用PostgreSQL的gist索引,加快速度),計算交到的要素。
  3. 將交到要素隨機選取一個,其餘要素捨棄。
  4. 遍歷完網格後,即可完成要素過濾。

本人寫了一個簡單的實現,供各位參考。

github鏈接:https://github.com/MrSmallLiu/point_dilution

3)基於距離的抽稀過濾算法

該算法結果爲均勻分佈。

  1. 設置距離閾值。
  2. 選取初始點,計算其它點到該點的距離,閾值範圍內的點,捨棄。
  3. 從上次結果中,選取另一個點作爲基準點,再次執行(2)的步驟,只需計算保留下來的點。
  4. 全部點計算完成後,即可完成要素抽稀過濾。

4)基於隨機數的抽稀過濾算法

該算法結果可以保持數據疏密。

對於大數據量時的隨機數,可以達到僞隨機性,所以可以利用該算法進行隨機性的抽稀。

  1. 設置經驗閾值,例如r=0.5,同時因爲該算法效率可以實時進行,可以考慮基於每一次查詢矢量切片時,根據級別設置閾值。
  2. 查詢的sql語句中或者其它方式後面添加where條件,where random()>0.5時保留要素。
  3. 基於以上就可以完成50%的抽稀率。

使用的侷限:

  1. 對於小數據量可能效果達不到。

優勢:

  1. 效率很高,可以不用提前處理數據。
  2. 可以將random()做到數據字段中,使用btree加速。
  3. 設置字段中後,可以保證例如小級後的結果例如3級,在後續級別中保留例如4-18級。

5)基於網格與隨機數抽稀過濾算法

該算法結果可以保持數據疏密。

  1. 根據範圍與網格大小閾值,劃分數據網格。
  2. 遍歷網格,利用網格與數據求交(使用PostgreSQL的gist索引,加快速度),計算交到的要素。
  3. 在網格內根據隨機數,將網格內數據隨機丟棄一些。
  4. 網格遍歷完成後,即完成數據抽稀過濾。

該算法彌補了單純基於數據數的一些侷限性,不會導致數據存在缺塊(對於大數據量,可能性微乎其微)。

6)基於距離並保持疏密程度的抽稀過濾算法

該算法結果可以保持數據疏密。

  1. 設置距離閾值,設置丟棄比例。
  2. 選取初始點,遍歷其它要素,計算其它要素到該要素的距離,小於距離閾值的歸爲一片。
  3. 將該片數據,基於丟棄比例,捨棄一部分要素。
  4. 繼續下一個點爲基準點,循環(2)(3)的步驟。
  5. 全部要素完成後,即可完成數據抽稀過濾。

以上即爲介紹的幾種抽稀過濾算法,可以在合適的場景使用合適的方式。其中雖然有些算法存在侷限性(基於隨機數的算法),但是對於大數據量來說,可能性很低,並且效率極高,可以做到實時,以下效果也是採用該方法。

效果展示

示例:

  • 數據量: 本示例數據量爲300萬點要素;
  • 抽稀過濾方法: 基於隨機數抽稀過濾,將random字段添加到字段中,同時利用該方法結合經驗值,實時抽稀過濾展示(例如:<4級:0.2,4-6級:0.4,7-9:0.7,>10不抽稀過濾);
  • 數據展示方法: 實時矢量切片,結合根據級別抽稀過濾。

效果圖:

寫在最後

以上優化方法僅爲個人的一些經驗以及思路,有錯誤的地方歡迎留言,一起交流,向您學習。

作者介紹

劉航,國信司南地理信息技術有限公司GIS研發工程師、技術經理。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=2650792661&idx=2&sn=4f12ce2610c8f938b0580117cec7e652&chksm=f3f95740c48ede562aa4d81696661f17ac039ac4b51d75b9288280f6a6e88e5220fbf9776d3d&scene=27#wechat_redirect

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