众所周知,MarkerClusterer是"故障"在同一个位置处理标记时,我在项目中添加了OMS库
我的目标是建立一个集群" spiderfy"如果所有标记都在同一位置
我必须说,我的maxZoom等级是22,因为否则所有的标记都是重叠的,你实际上并不能说它有多个。
我设法到达了"如果他们都处于相同的位置",但我不能抓住群集。
截取事件的代码是this answer (all in the same position)之间的混合
和this one (override the clickcluster event)
建议的触发点击事件的方法对我来说似乎没什么用。这是我写的最重要的功能:
var mc = new MarkerClusterer(map,markers,options);
mc.onClickZoom = function(mc) {
var marker = mc.cluster_.markers_[0];
console.log("clicking marker");
google.maps.event.trigger(marker, 'click',{});
};
控制台确实记录了" 点击标记",然后地图和群集就在那里;没有任何反应。
编辑: 以下是我所做的代码修改。
在MarkerClusterer源代码中,我添加了一个原型函数来调整MarkerClusterer.prototype,如下所示:
MarkerClusterer.prototype.onClickZoom = function(mcc) {
return true;
};
然后我在原型中添加了另一个函数,用于检查标记是否在同一位置:
MarkerClusterer.prototype.allInTheSamePosition = function(markers){
var cont=0;
var latitudMaster=markers[0].getPosition().lat();
var longitudMaster=markers[0].getPosition().lng();
for(var i=0;i<markers.length;i++){
if(markers[i].getPosition().lat() === latitudMaster & markers[i].getPosition().lng() === longitudMaster ){
cont++;
}else{
return false;
}
}
return (cont==markers.length)
}
在函数ClusterIcon.prototype.triggerClusterClick
内,触发clusterclick后,我添加了这些行来使用上面的函数:
if (markerClusterer.allInTheSamePosition(this.cluster_.markers_)){
return markerClusterer.onClickZoom(this);
}
当我实例化MarkerClusterer时,我重写了onClickZoom函数,让我在原始问题中发布了代码,所以这个:
var mc = new MarkerClusterer(map,markers,options);
mc.onClickZoom = function(mc) {
var marker = mc.cluster_.markers_[mc.cluster_.markers_.length-1];
console.log("clicking marker");
google.maps.event.trigger(marker, 'click',{});
};
其中options是包含图标样式且maxZoom为22的对象,以确保连续显示群集图标。
代码一直有效,直到我到达群集应该&#34; 蜘蛛侠&#34;。一对GIF:
在这里,我点击第一个群集(5),它成功地将我带到较小的集合,但点击(4)什么也没做。点击疯狂地放大,但对群集无任何作用
这是markerClusterer.maxZoom设置为14的代码,因此4之前的代码不会被识别为群集。我只想让那里有4个标记可以理解。我试着让标记显示数字,然后点击打开蜘蛛,然后关闭再次拥有群集图标
在这一点上,我只是迫不及待地想要表明可以点击的蜘蛛群,只是表示&#34;在同一个位置还有更多的东西&#34;。
答案 0 :(得分:1)
所以,评论中显然有1/2问题(以及我之前咨询过的一些问题)并没有一个有效的例子,但出于某种原因,我必须有一个问题。我试图使用JFiddle,但它没有工作,所以我只是自己解决了。我真的希望这不会意味着另一次禁令,但我知道什么
以下是如何做到这一点:
所以问题是MarkerCluster会创建 单个群集 ,因此激活点击事件就不会对OverlappingMarkerSpiderfier产生任何影响。
按照我的问题中的步骤编辑MarkerClusterer源,然后
以下是MarkerClusterer声明中实现的代码:
var mc = new MarkerClusterer(map,markers,options);
//this code overrides the prototype method declared in the source
mc.onClickZoom = function(mc) {
var cluster = mc.cluster_;
var markers = cluster.getMarkers();
map.setCenter(markers[0].getPosition());
if(map.getZoom()<17){
map.setZoom(17);
}
for(i in markers){
markers[i].setMap(cluster.getMap());
marker = markers[i];
}
cluster.clusterIcon_.hide();
console.log(marker);
setTimeout(function(){
google.maps.event.trigger(marker, 'click');
},100);
//documentMap.applyOverlappingIcons();
};
如果你有更好的解决方案,请在这里学习:评论,我会编辑这个答案!