我有一张地图,上面有几个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/