地圖區域大數據量 marker 坐標點高效抽稀算法


按網上的思路一般要寫雙層循環,第一層循環遍歷點集合,時間復雜度為O(N),第二層循環遍歷結果集,逐一計算距離,距離小於閾值的不加入結果集,距離大於閾值的加入結果集,時間復雜度為O(M),雙層循環總時間復雜度為O(N * M)。

新的算法思路:坐標點的經緯度經過計算得到的結果作為HashMap的Key,坐標相近的點的Key相同,利用HashMap降低時間復雜度,不需要第二層循環遍歷,把時間復雜度由O(N * M)降為O(N)。

該算法的優點:1、抽稀后坐標點位置均勻,2、計算效率高(時間復雜度:O(N)),3、算法邏輯簡單,4、計算結果冪等(結果集確定,多次重復計算結果集相同)。

 

代碼:

//抽稀
if (mapZoom >= 15 && mapZoom <= 16) {
    currentMarkerMap = new HashMap();

    var getKey = function (lng, lat, len, ratio) { //如果計算結果數量較少,就調大ratio
        var a = (10000 + lng * ratio).toString().substr(0, len);
        var b = (10000 + lat * ratio).toString().substr(0, len)
        return a + "," + b;
    };

    for (var i = 0; i < forAdd.length; i++) {
        var marker = forAdd[i];

        var key;
        if (mapZoom == 15) key = getKey(marker.geometry.x, marker.geometry.y, 9, 1);
        if (mapZoom == 16) key = getKey(marker.geometry.x, marker.geometry.y, 10, 1);

        if (!currentMarkerMap.containsKey(key)) {
            currentMarkerMap.put(key, marker);
        }
    }
}
View Code

說明:代碼中 forAdd 變量是抽稀前的坐標點集合,currentMarkerMap 變量是HashMap集合(HashMap是自己實現的JS類),定義代碼如下:

var forClear = [];
var currentMarkerMap = new HashMap();
View Code

效果圖:

縮小:

放大:

動態效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM