按網上的思路一般要寫雙層循環,第一層循環遍歷點集合,時間復雜度為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); } } }
說明:代碼中 forAdd 變量是抽稀前的坐標點集合,currentMarkerMap 變量是HashMap集合(HashMap是自己實現的JS類),定義代碼如下:

var forClear = []; var currentMarkerMap = new HashMap();
效果圖:
縮小:
放大:
動態效果: