本文由 dbaplus 社羣授權轉載。
之前介紹瞭如何使用PG與PostGIS搭建實時矢量瓦片服務,但未介紹如何做優化,對於日常項目使用基本可以滿足。這篇文章主要試介紹如何瀏覽百萬級要素,示例爲300萬點要素。
《基於PG與PostGIS搭建實時矢量瓦片服務》:https://blog.csdn.net/qq_35241223/article/details/106439268
背景介紹
對於某些應用場景,數據量很容易達到百萬級要素,數據每天都在改變。而且還要考慮在1-6級這種小級別時候的數據展示,那麼這個時候僅僅是PG與PostGIS簡單的矢量瓦片服務比較困難達到客戶想要的效果,這個時候就要考慮做一些優化了。
優化方法
百萬級要素優化對於不同的業務來說,有相應不同的解決辦法,沒有最好,只有更好,這個時候要做考量,下面介紹幾個常用的會考慮使用的方法:
1、依據業務,對要素進行抽稀過濾
根據業務層面,在不同場景瀏覽不同的要素,雖然總的要素在幾百萬,但是這個時候過濾一部分後剩餘要素可以進行實時矢量瓦片展示。
2、幾種抽稀過濾的算法
除第一種方法外,其餘幾種方法包含一些個人的想法與思路,其它小夥伴有其他好的思路,或者對我的想法思路有疑問的話,歡迎在評論區留言。
1)道格拉斯-普客算法(DP)
該算法個人理解爲是簡化的算法,對於線或者面的邊界,可以使用該算法對節點進行抽稀,達到對線或者面的簡化。但是爲什麼在點要素抽稀過濾中也介紹該算法呢?
答案:在軌跡數據中,每一次存儲的都是點位信息(點),所以對於該種數據可以使用該算法進行過濾,但是對於一個點即代表一種信息的數據來說,該算法不太適用。
2)基於網格的抽稀過濾算法
該算法結果爲均勻分佈。
- 根據數據範圍以及閾值將範圍劃分網格。
- 遍歷網格,利用網格與數據求交(使用PostgreSQL的gist索引,加快速度),計算交到的要素。
- 將交到要素隨機選取一個,其餘要素捨棄。
- 遍歷完網格後,即可完成要素過濾。
本人寫了一個簡單的實現,供各位參考。
github鏈接:https://github.com/MrSmallLiu/point_dilution
3)基於距離的抽稀過濾算法
該算法結果爲均勻分佈。
- 設置距離閾值。
- 選取初始點,計算其它點到該點的距離,閾值範圍內的點,捨棄。
- 從上次結果中,選取另一個點作爲基準點,再次執行(2)的步驟,只需計算保留下來的點。
- 全部點計算完成後,即可完成要素抽稀過濾。
4)基於隨機數的抽稀過濾算法
該算法結果可以保持數據疏密。
對於大數據量時的隨機數,可以達到僞隨機性,所以可以利用該算法進行隨機性的抽稀。
- 設置經驗閾值,例如r=0.5,同時因爲該算法效率可以實時進行,可以考慮基於每一次查詢矢量切片時,根據級別設置閾值。
- 查詢的sql語句中或者其它方式後面添加where條件,where random()>0.5時保留要素。
- 基於以上就可以完成50%的抽稀率。
使用的侷限:
- 對於小數據量可能效果達不到。
優勢:
- 效率很高,可以不用提前處理數據。
- 可以將random()做到數據字段中,使用btree加速。
- 設置字段中後,可以保證例如小級後的結果例如3級,在後續級別中保留例如4-18級。
5)基於網格與隨機數抽稀過濾算法
該算法結果可以保持數據疏密。
- 根據範圍與網格大小閾值,劃分數據網格。
- 遍歷網格,利用網格與數據求交(使用PostgreSQL的gist索引,加快速度),計算交到的要素。
- 在網格內根據隨機數,將網格內數據隨機丟棄一些。
- 網格遍歷完成後,即完成數據抽稀過濾。
該算法彌補了單純基於數據數的一些侷限性,不會導致數據存在缺塊(對於大數據量,可能性微乎其微)。
6)基於距離並保持疏密程度的抽稀過濾算法
該算法結果可以保持數據疏密。
- 設置距離閾值,設置丟棄比例。
- 選取初始點,遍歷其它要素,計算其它要素到該要素的距離,小於距離閾值的歸爲一片。
- 將該片數據,基於丟棄比例,捨棄一部分要素。
- 繼續下一個點爲基準點,循環(2)(3)的步驟。
- 全部要素完成後,即可完成數據抽稀過濾。
以上即爲介紹的幾種抽稀過濾算法,可以在合適的場景使用合適的方式。其中雖然有些算法存在侷限性(基於隨機數的算法),但是對於大數據量來說,可能性很低,並且效率極高,可以做到實時,以下效果也是採用該方法。
效果展示
示例:
- 數據量: 本示例數據量爲300萬點要素;
- 抽稀過濾方法: 基於隨機數抽稀過濾,將random字段添加到字段中,同時利用該方法結合經驗值,實時抽稀過濾展示(例如:<4級:0.2,4-6級:0.4,7-9:0.7,>10不抽稀過濾);
- 數據展示方法: 實時矢量切片,結合根據級別抽稀過濾。
效果圖:
寫在最後
以上優化方法僅爲個人的一些經驗以及思路,有錯誤的地方歡迎留言,一起交流,向您學習。
作者介紹:
劉航,國信司南地理信息技術有限公司GIS研發工程師、技術經理。
原文鏈接: