MarkerClustererPlus:设置图标的颜色/ URL独立大小(MarkerCluster

2019-08-31 07:14发布

我通过MarkerClustererPlus绘制几十万点,我想设置的基于一些exteral财产集群图标(颜色)组( 不是基于表示标记的数量)。

我能想到做到这一点的唯一方法是通过创建多个MarkerClusterer对象,并在不同的传球options的对象,但我觉得我会采取一个大的性能命中这样做。 有没有更好的办法?

鉴于上面的图像,我想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' });

PS如果有人有兴趣,我调整的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选项被amoung的MC的实例共享

解决了我不得不修改近线665 MarkerClustererPlus库克隆opt_options (的lib是使用参考,由此引起的一切以前opt_options与最新的/最后一个通过被覆盖)。

Answer 1:

因此,原来的麻烦是从未来MarkerClustererPlus LIB本身:

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

665行创建的,而不是一个新的副本,以现有的对象的引用 。 我不能使用MarkerClusterer.prototype.extend从线1539,因为它不会使一个深拷贝(并仅适用对象的原型)。

所以,我写我自己的深度拷贝功能( 的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 ) || {};

我测试具有(5000个标记,25000总每个)MarkerClustererPlus的5个实例,并且没有decernable性能影响相比具有单个MC +实例。



文章来源: MarkerClustererPlus: set icon color/url independent of size