按網上的思路一般要寫雙層回圈,第一層回圈遍歷點集合,時間復雜度為O(N),第二層回圈遍歷結果集,逐一計算距離,距離小于閾值的不加入結果集,距離大于閾值的加入結果集,時間復雜度為O(log2N),雙層回圈總時間復雜度為O(N * log2N),
新的演算法思路:坐標點的經緯度經過計算得到的結果作為HashMap的Key,坐標相近的點的Key相同,利用HashMap降低時間復雜度,不需要第二層回圈遍歷,把時間復雜度由O(N * log2N)降為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
效果圖:
縮小:

放大:

動態效果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/299094.html
標籤:其他
