如何实现OverlappingMarkerSpiderfier'点击' MarkerClusterer

时间:2016-11-09 12:01:52

标签: javascript google-maps google-maps-api-3 markerclusterer

众所周知,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: cluster (4) should spider up

在这里,我点击第一个群集(5),它成功地将我带到较小的集合,但点击(4)什么也没做。点击疯狂地放大,但对群集无任何作用

like this, but with the number

这是markerClusterer.maxZoom设置为14的代码,因此4之前的代码不会被识别为群集。我只想让那里有4个标记可以理解。我试着让标记显示数字,然后点击打开蜘蛛,然后关闭再次拥有群集图标

在这一点上,我只是迫不及待地想要表明可以点击的蜘蛛群,只是表示&#34;在同一个位置还有更多的东西&#34;。

1 个答案:

答案 0 :(得分:1)

所以,评论中显然有1/2问题(以及我之前咨询过的一些问题)并没有一个有效的例子,但出于某种原因,我必须有一个问题。我试图使用JFiddle,但它没有工作,所以我只是自己解决了。我真的希望这不会意味着另一次禁令,但我知道什么 以下是如何做到这一点:
所以问题是MarkerCluster会创建 单个群集 ,因此激活点击事件就不会对OverlappingMarkerSpiderfier产生任何影响。

按照我的问题中的步骤编辑MarkerClusterer源,然后

  1. (可选:需要两次点击)中心和缩放群集
  2. (如果您在第二次点击后做了1次)将标记放回地图上(可能有更好的方法可以做到,但我的时间紧张)
  3. 隐藏群集图标
  4. 等待上述步骤完成(TODO:而不是setTimeout,找到一个标志)
  5. 触发点击事件。
  6. 以下是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();
                };
    

    如果你有更好的解决方案,请在这里学习:评论,我会编辑这个答案!