2013-04-15 35 views
5

我正在通過MarkerClustererPlus繪製幾十萬個點,並且我想根據某些外部屬性設置羣組圖標(顏色)(而不是,基於數量標記代表)。MarkerClustererPlus:設置圖標顏色/網址的大小無關

我能想到做到這一點的唯一方法是創建多個MarkerClusterer對象並傳入不同的options對象,但我覺得我會在這種情況下大受打擊。有沒有更好的辦法?

Marker Clusterer Plus with differently sized icons scaled to fit.

鑑於上面的圖像,我想139,24和5是黃色和213,25,30,和2爲紅色;如果可能的話,可以通過setOptions更新自己的風格/選項:
mc.group[0].setOptions({"url": imgPath +lookupThreshold(severity)+ '.svg' });
mc.group[1].setOptions({"url": imgPath +lookupThreshold(severity)+ '.svg' });

附:如果有人有興趣,我調整的lib因此集羣圖標通過提供SVG圖像和增加寬度&高度在選項擴展到其大小對象:

var mcOptions = { 
    "styles": [{ 
    "height": 19, 
    "url": img/map/clusters/", 
    "width": 19 
    },{ 
    "height": 24, 
    "url": img/map/clusters/", 
    "width": 24 
    }, {…}] 
}; 
for (var s = mcOptions.styles.length-1; s >= 0; s--) 
{ mcOptions.styles[s].url += lookupThreshold(severity) + '.svg'; } 
// lookupThreshold switches severity and returns a string: red, orange, … 

然後加入下列到markerclusterer.js

line 275: this.backgroundSize_ = style.backgroundSize || "contain"; 
line 300: style.push('background-size:' + this.backgroundSize_ + ';'); 

工程在FFX 19.0.2,鉻26.x,鉻金絲雀28.x,Safari瀏覽器6.0.2,IE 9.0.8(但不是Opera 12.15)。

編輯看起來創建MarkerClusterer的多個實例沒有太大的性能影響;然而,似乎傳遞給MC的屬性/選項對象是在MC的實例上共享

解決我不得不修改近線665 MarkerClustererPlus庫克隆opt_options(的lib是使用參考,由此引起的一切以前opt_options與最新的/最後一個通過被覆蓋)。

+0

您是否檢查了此鏈接? http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/examples/advanced_example.html – Fabi

+0

@Fabi,是的。集羣是不同集羣的原因是因爲它們的大小不同。我希望特定羣組的所有大小具有相同的顏色(但大小不同);不同的團體應該有不同的顏色。 – jacob

+0

現在我不能看到除了你有什麼不同的解決方案 - 多個實例,因爲他們是不同的組。 – Fabi

回答

2

因此,原來的麻煩是從MarkerClustererPlus lib本身來:

656: function MarkerClusterer(map, opt_markers, opt_options) { 
… 
665: opt_options = opt_options || {}; 

線創建參考到現有的對象,而不是一個新的副本。我無法使用中的MarkerClusterer.prototype.extend,因爲它不會進行深層複製(並且只擴展對象的原型)。

所以,我寫我自己的深度拷貝功能(jsfiddle),這是我做全局可用(而不是將其添加到這兩個陣列的原型對象):

function deepCopy(obj) { 
    this.cloneArr = function (arr) { 
    var newArr = []; 
    for (var i = arr.length-1; i >= 0; i--) newArr[i] = this.evalObj(arr[i]); 
    return newArr; 
    }; 
    this.cloneObj = function(obj) { 
    var newObj = {}; 
    for (var prop in obj) newObj[prop] = this.evalObj(obj[prop]); 
    return newObj; 
    }; 
    this.evalObj = function(obj) { 
    switch (typeof obj) { 
     case 'object': 
     if (Array.isArray(obj)) return this.cloneArr(obj); 
     if (obj instanceof Date === false) return this.cloneObj(obj); 
     // pass thru dates, strings, numbers, booleans, and functions 
     default: return obj; // primitive 
    } 
    }; 
    return this.evalObj(obj); 
} 

我然後更改MarkerClustererPlus。JS以下內容:

656: function MarkerClusterer(map, opt_markers, opt_optionsG) { 
… 
665: var opt_options = deepCopy(opt_optionsG) || {}; 

我測試具有MarkerClustererPlus的5個實例(每個具有5000個標記,25000全部),並且沒有decernable性能影響相比具有單個MC +實例。

Screenshot of multiple instances of MarkerClustererPlus

+0

非常有用!在哪裏添加函數deepCopy?以及如何在html中更改顏色的詳細代碼?謝謝 – Orz

+0

根據我的回答,我把它放在「全局」(連接到'window')。標記的顏色由'url'屬性中提供的SVG控制。 – jacob

相關問題