-
需求場景
Web端通過地圖範圍變化事件,動態請求加載空間數據庫中的點數據進行展示,指定的屏幕像素範圍內,在不同的地圖縮放級別顯示不同數量的點(大比例尺下展示較多的點,表比例尺下加載一些特徵點展示),從而使Web頁面能夠更爲美觀的展示數據。
-
技術點
聚合算法,屏幕像素轉地圖距離、PostGIS、查詢優化、存儲過程
-
接口參數
在此需求下,前端要調用服務接口,需要傳入指定的像素celCount,當前地圖分辨率mapResolution,當前地圖比例尺mapScale,要查詢的數據庫表名tableName。考慮到查詢返回一些點並不在當前屏幕顯示的地圖範圍內,爲避免顯示這些多餘的點而造成瀏覽器壓力,可將當前地圖範圍作爲查詢條件,因此,還需要傳入一個當前地圖範圍參數mapExtent。
-
實現流程
獲取數據表的空間範圍tableExtent——》與mapExtent求交得到tempExtent——》獲取tempExtent的空間矩形範圍showExtent——》根據celCount,mapResolution和mapScale計算屏幕像素對應的地圖距離showLen——》格網化分,根據showExtent和showLen計算橫向和縱向格網數量——》雙層for循環,用個網作爲查詢條件查詢數據庫在格網範圍內的點集合,求取距離集合質心點最近的點返回——》最終返回一個點集合
-
缺陷
使用格網將要查詢的數據範圍showExtent進行分割,在計算每個格網最終要顯示的點時都需要調用一個數據庫請求,在數據量大,像素數小的情況下,將顯示範圍在橫向和縱向進行分割,最終的格網數量很多,反覆調用數據庫請求會造成該應用接口的性能很低,在控制器設置超時時間的情況下,後臺沒有返回數據,造成請求超時,後臺出錯的假象,最終的計算結果也展示不出來。
-
優化
爲了減少數據庫請求的次數,使用存儲過程!將格網的橫向距離和縱向距離、橫向數量和縱向數量、showExtent的左上座標、數據表名作爲存儲過程的參數。存儲過程的核心實現如圖:
-
效果展示:
小比例尺下展示效果
大比例尺下展示效果
-
性能測試
100,0000數據量的動態查詢性能測試結果,時間:秒
|
10(像素)
|
20(像素) |
40(像素) |
60(像素) |
4508.93552506767 |
0.669 |
0.218 |
0.103 |
0.078 |
9017.87105013534 |
0.794 |
0.328 |
0.152 |
0.087 |
18035.7421002707 |
1.071 |
0.390 |
0.150 |
0.096 |
36071.4842005414 |
1.466 |
0.488 |
0.166 |
0.113 |
72142.9684010827 |
1.608 |
0.563 |
0.194 |
0.129 |
144285.936802165 |
1.711 |
0.587 |
0.211 |
0.163 |
288571.873604331 |
1.665 |
0.565 |
0.239 |
0.205 |
577143.7364428712 |
1.549 |
0.539 |
0.301 |
0.220 |
1154287.4728857423 |
1.728 |
0.737 |
0.387 |
0.337 |
2308574.9457714846 |
2.149 |
1.185 |
0.846 |
0.846 |
-
總結
在考慮實現該需求的時候,一直都在考慮這個功能是點抽稀的效果還是點聚合的效果。最終的結果說不上是抽稀結果也談不上聚合效果,但最終的結果實實在在的高效地實現了動態篩選數據並加載顯示在Web端。在參考了高德和Wish3D做的聚合標註效果之後,搜索了一些點抽稀和點聚合的相關算法,覺得兩者的實現和使用場景是有很大區別的。
首先,點抽稀的特徵抽稀結果是較少點的數量,最終保留的點的座標值仍然是原來的值。以地形高程採樣點爲例,矢量化原始採樣點數據,在一些區域存在密集程度較高的採樣點,統計該區域內的採樣點的高程值,若該區域密集點的高程值在高程差範圍內,在該比例尺該區域內則沒有必要保留所有的採樣點,需要對該區域內的高程點進行抽稀,通常會根據一些運算規則指定優先級,依據該優先級對高程差範圍內的採樣點進行抽稀,最終在能夠表現該區域地形形態的基礎上均勻地保留一些採樣點,以便於高效的進行差值運算獲得等高線、TIN和數字高程模型,最終能夠保證通過地形分析獲得最終想要的結果。
點的聚合在地圖點的展示形態上和點抽稀直觀的表現類似,大量的點在地圖上能夠動態且美觀的展示的實現,其實是聚合的實現效果。
聚合結果要展示聚合區域內數據最全面的信息,而且又不產生重疊覆蓋,動態比例尺下展示數據不僅需要保證地圖展示效果,而且展示出的點位又說明了點位數據的空間分佈特性,並且,最終的聚合點並不一定是原來數據中的點,有可能是通過聚合算法計算出的一個位置,這是與 點抽稀一個顯著的差別!!!!
試想,如果在篩選外業測量的地形數據點時,使用了聚合算法,就很有可能造成接下來差值結果與真是結果相差甚遠,接下來的地形分析也很有可能是錯誤的,這樣產生的最終決策也就不具備的參考價值。
本博客爲原創博客,擁有絕對版權,轉載請標明源地址:https://blog.csdn.net/luojingweikai/article/details/88401201
參考:https://blog.csdn.net/yaoxiaochuang/article/details/50571957