【问题标题】:How to change cluster zoom level on click with Leaflet map?如何使用 Leaflet 地图更改集群缩放级别?
【发布时间】:2015-09-09 13:09:42
【问题描述】:

我有一个具有 2-7 级缩放级别并使用 MarkerCluster 插件的传单地图,默认情况下,我有 L.MarkerClusterGroup 禁用集群缩放级别 2(这意味着没有集群),我试图让用户单击一个按钮,然后将聚类缩放级别更改为 5。这可能吗?

我知道我可以通过创建两个markercluster 组来做到这一点,一个没有聚类,一个有聚类并根据点击删除/添加它,但这看起来非常混乱。确实,有几种方法可以做到这一点,但它们非常笨拙。

代码:

默认(2 是最低的缩放级别):

var markers = new L.MarkerClusterGroup (
    {
        disableClusteringAtZoom: 2,
        maxClusterRadius: 100,
        animateAddingMarkers: true
    });

我想做的可以做到:

 $('#mcluster').click(function() {
    //do some code that sets the disableClusterAtZoom to 5
});

【问题讨论】:

    标签: javascript leaflet markerclusterer


    【解决方案1】:

    我找不到禁用集群的方法或在缩放时为 disableClustering 设置新值,但我找到了一种不太笨重的方法来实现这一点。

    var markers = new L.LayerGroup(); //non cluster layer is added to map
    markers.addTo(map);
    var clusters = new L.MarkerClusterGroup (
        {
            disableClusteringAtZoom: 5,
            maxClusterRadius: 100,
            animateAddingMarkers: true
        }); //cluster layer is set and waiting to be used
    
    var clusterStatus = 'no'; //since non cluster group is on by default, the status for cluster is set to no
     $('#mcluster').click(function( event ) {
        if(clusterStatus === 'no'){
            clusterStatus = 'yes';
            var current1 = markers.getLayers(); //get current layers in markers
            map.removeLayer(markers); // remove markers from map
            clusters.clearLayers(); // clear any layers in clusters just in case
            current1.forEach(function(item) {  //loop through the current layers and add them to clusters
                clusters.addLayer(item);
            });
            map.addLayer(clusters);
        } else {
            clusterStatus = 'no';  //we're turning off clustering here
            var current2 = clusters.getLayers(); //same code as before just reversed
            map.removeLayer(clusters);
            markers.clearLayers();
            current2.forEach(function(item) {
                markers.addLayer(item);
            });
            map.addLayer(markers);
        }
    });
    

    我确信有一个更优雅的解决方案,但随着我不断增长的知识,这就是我想出的。

    【讨论】:

      【解决方案2】:

      我知道几个月前你需要一个解决方案,但只是为了让你知道我最近发布了一个 Leaflet.markercluster 的子插件,它可以完全执行你正在寻找的东西(带有一些额外的代码):Leaflet.MarkerCluster.Freezable(演示here)。

      var mcg = L.markerClusterGroup().addTo(map),
          disableClusteringAtZoom = 2;
      
      function changeClustering() {
          if (map.getZoom() >= disableClusteringAtZoom) {
              mcg.disableClustering(); // New method from sub-plugin.
          } else {
              mcg.enableClustering(); // New method from sub-plugin.
          }
      }
      
      map.on("zoomend", changeClustering);
      
      $('#mcluster').click(function () {
          disableClusteringAtZoom = (disableClusteringAtZoom === 2) ? 5 : 2;
          changeClustering();
      });
      
      mcg.addLayers(arrayOfMarkers);
      
      // Initially disabled, as if disableClusteringAtZoom option were at 2.
      changeClustering();
      

      演示:http://jsfiddle.net/fqnbwg3q/3/

      注意:在上面的演示中,我使用了一种改进来确保重新启用聚类时标记与动画合并。只需在使用 enableClustering() 之前使用超时:

      // Use a timeout to trigger clustering after the zoom has ended,
      // and make sure markers animate.
      setTimeout(function () {
          mcg.enableClustering();
      }, 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多