我有一张地图,上面有几个MarkerWithLabel对象(http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerwithlabel/1.1.9/)。在这种情况下,标签是整数。

我也有一个MarkerClustererPlus(http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclustererplus/2.1.2/),它也可以正常工作。

但是,我想更改“群集”上的文本,以显示群集内每个MarkerWithLabel的标签上这些整数的总和。

我通过将此功能绑定到群集结束来做到这一点:

function calculateClusterLabels() {
    $.each(markerCluster.clusters_, function(i, cluster){
        var sum = 0;
        var cluster_markers = cluster.getMarkers();
        $.each(cluster_markers, function(j, marker) {
            sum += marker.labelContent;
        });
        cluster.clusterIcon_.sums_['text'] = sum;
        cluster.updateIcon(); // also tried cluster.repaint();
    });
}


而且有效-至少对于“群集”文本而言。但是现在我们要解决一个真正的问题:它将冻结整个Map。 Raven.js捕获了这一点:Uncaught TypeError:undefined不是一个函数。但是没有比这更清楚的了。

有任何想法吗?

编辑:

一些更多的代码。使用ajax获取数据,然后在循环中设置标记:

$.each(us_data, function(k, v) {
    var markerPosition = new google.maps.LatLng(us_data[k]['lat'], us_data[k]['lon']);
    var marker = new MarkerWithLabel({
        position: markerPosition,
        draggable: false,
        map: map,
        labelContent: us_data[k]['count'],
        labelAnchor: anchor,
        labelClass: "marker-with-label"
    });

markers.push(marker);
});


然后创建群集并绑定事件:

markerCluster = new MarkerClusterer(map, markers, {imagePath: 'https://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclustererplus/images/m'});
google.maps.event.addListener(markerCluster, 'clusteringend', function() {
    calculateClusterLabels();
});


这一切都发生在ajax的.done()内部,但是markerCluster和markers在外部可见。

最佳答案

要回答自己:毕竟,这很简单:

function calculateClusterLabels() {
    $.each(markerCluster.clusters_, function(i, cluster){
        var sum = 0;
        var cluster_markers = cluster.getMarkers();
        $.each(cluster_markers, function(j, marker) {
            sum += marker.labelContent;
        });
        if (cluster.clusterIcon_.sums_ != null) {
            cluster.clusterIcon_.sums_['text'] = sum;
        }
    });
}


我做了什么-我添加了一个简单的if语句来检查.sums_对象是否不为null(因为仅在内部具有标记的可见群集上它不为null),并且我省略了.updateIcon调用,并且一切正常,否错误。

就我而言,一个更好的解决方案是只更改markerclusterer.js源文件:

MarkerClusterer.CALCULATOR = function (markers, numStyles) {
  var index = 0;
  var title = "";
  var count = 0;
  if (typeof markers[0].labelContent != 'undefined') {
      var sum = 0;
      var i;
      for (i = 0; i < markers.length; ++i) {
          if (!isNaN(markers[i].labelContent) {
              sum += markers[i].labelContent;
          } else {
              // whatever we need, perhaps we want to calculate it differently
          }
      }
      count = sum.toString();
  } else {
      count = markers.length.toString();
  }

  var dv = count;
  while (dv !== 0) {
    dv = parseInt(dv / 10, 10);
    index++;
  }

  index = Math.min(index, numStyles);
  return {
    text: count,
    index: index,
    title: title
  };
};


这甚至更好,因为它还更新了Cluster样式,并且可以与常规Marker和MarkerWithLabel对象一起使用。

关于javascript - 重绘MarkerClustererPlus后Google map 卡住,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28998430/

10-11 05:45