【问题标题】:Leaflet MarkerCluster: Is it possible to open multiple cluster-groups?Leaflet MarkerCluster:是否可以打开多个集群组?
【发布时间】:2019-06-13 15:16:51
【问题描述】:

我最近开始使用传单。我找到了很棒的插件传单markercluster。我目前正在尝试同时打开几个集群组。不幸的是,我在谷歌上找不到任何东西。

我有几个集群组并绘制从一个标记到另一个标记的连接。用户应该能够打开绘制线所在的两个集群组:

因此我的问题是:是否有一个我必须打开或同时打开几个组的功能根本没有提供?

【问题讨论】:

  • 当我点击第二组时,我想对其进行蜘蛛化。所以我检查了leaflet.markercluster-src.js中的spiderfy函数。它说最后一组的 unspiderfy() 总是在调用新的 spiderfied 之前调用。所以我认为我必须更改 .js 文件并且必须记住打开的组以便稍后再次关闭它们

标签: javascript leaflet leaflet.markercluster


【解决方案1】:

好的,我现在已经对此进行了一些实验;)

在 Leaflet.markercluster-src.js 中,我创建了一个名为 _spiderMan[] 的数组,其中填充了函数 spiderfy 中单击的对象。

spiderfy: function() {
  if (this._group._spiderfied === this || this._group._inZoomAnimation) {
    return;
  }

  var childMarkers = this.getAllChildMarkers(null, true),
    group = this._group,
    map = group._map,
    center = map.latLngToLayerPoint(this._latlng),
    positions;

  // this._group._unspiderfy();  //deactivated
  var markers = markers + childMarkers;
  _spiderMan.push(this);  //new          

  if (childMarkers.length >= this._circleSpiralSwitchover) {
    positions = this._generatePointsSpiral(childMarkers.length, center);
  } else {
    center.y += 10; 
    positions = this._generatePointsCircle(childMarkers.length, center);
  }

  this._animationSpiderfy(childMarkers, positions);
},

然后我创建了一个 for 循环,它遍历数组并每次调用 _spiderMan[i].unspiderfy(zoomDetails)。我将此循环构建到函数_unspiderfyZoomAnim 中进行测试。意味着每次放大或缩小时,都会汇总所有打开的组。

_unspiderfyZoomAnim: function(zoomDetails) {
  if (L.DomUtil.hasClass(this._map._mapPane, 'leaflet-touching')) {
    return;
  }
  this._map.off('zoomanim', this._unspiderfyZoomAnim, this);
  var i;
  for (i = 0; i < _spiderMan.length; i++) {
    _spiderMan[i].unspiderfy(zoomDetails);
  }
  _spiderMan = [];
},

此外,必须在unspiderfy 函数中禁用以下行:

unspiderfy: function(zoomDetails) {
  /// <param Name="zoomDetails">Argument from zoomanim if being called in a zoom animation or null otherwise</param>
  // if (this._group._inZoomAnimation) {
  //    return;             
  // }
  this._animationUnspiderfy(zoomDetails);

  // this._group._spiderfied = null;        
},

所以现在可以打开和关闭多个集群组,但这只是一种解决方法,我认为由于注释掉或删除代码行,它会在某处产生一些不良影响。

我认为在 JS 和这个插件方面有更多经验的人应该找到更好、更舒适的解决方案;)。

【讨论】:

  • 如果这对你有用,你应该接受你自己的答案,因为这将有助于其他人在未来阅读这个问题 (+1)。
【解决方案2】:

欢迎来到 SO!

不幸的是,Leaflet.markercluster 插件中的蜘蛛化管理目前假设一次可以蜘蛛化一个集群。

另见danzel's comment in Leaflet.markercluster issue #744(在特定视图中蜘蛛化所有集群):

Leaflet.MarkerCluster 目前只支持蜘蛛化一个集群,所以这需要一些工作来支持。

【讨论】:

    【解决方案3】:

    如果你给出一个用例,你可能会得到更好的答案......

    但是,可以肯定地说,没有一个功能可以让您一键打开多个组。

    从可用性的角度来看,它没有多大意义,因为 MarkerCluster 的基本行为是单击一个图标以放大并展开您感兴趣的组。

    【讨论】:

      【解决方案4】:

      引用https://github.com/Leaflet/Leaflet.markercluster#other-clusters-methods:

      • spiderfy:蜘蛛化这个集群的子标记
      • unspiderfy:对集群进行 unspiderfy(与 spiderfy 相对)

      因此,一旦您引用了要同时“打开”(蜘蛛化)的集群,只需调用它们的 .spiderify() 方法即可。

      例如如果所需的集群在变量 cluster1 和 cluster2 中:

      cluster1.spiderify();
      cluster2.spiderify();
      

      另请参阅https://github.com/Leaflet/Leaflet.markercluster#getting-the-visible-parent-of-a-marker 和https://github.com/Leaflet/Leaflet.markercluster#clusters-methods,了解如何获取对集群的引用。

      【讨论】:

      • 当我点击第二组时,我想抓取它。所以我检查了leaflet.markercluster-src.js中的spiderfy函数。它说最后一组的 unspiderfy() 总是在调用新的 spiderfied 之前调用。所以我认为我必须更改 .js 文件并且必须记住打开的组以便稍后再次关闭它们
      • 这是您应该添加到原始问题中的信息。
      【解决方案5】:

      据我所知,您可以保持打开多个集群,但每个组只有一个。我的猜测是你的标记都属于一个组。在这种情况下,您不能保持打开多个集群。

      您可以选择悬停方法,如果您将鼠标悬停在它上面会打开一个集群。

      const mymap = L.map('mapid').setView([48.550, 8.207], 6);
      
      L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycXBndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', {
        maxZoom: 18,
        id: 'mapbox.streets'
      }).addTo(mymap);
      
      const markers = L.markerClusterGroup({zoomToBoundsOnClick: false});
      [[47.5617, 7.5504], [47.5255, 7.6163], [47.5691, 7.6355],
       [49.4922, 8.3922], [49.5306, 8.5172], [49.4547, 8.5062]]
        .map(latLng => L.marker(latLng))
        .forEach(marker => markers.addLayer(marker));
      mymap.addLayer(markers);
      
      markers.on("clustermouseover", a => a.layer.spiderfy());
      markers.on("clustermouseout", a => a.layer.unspiderfy());
      html, body, #mapid { margin: auto; height: 100%; }
      <link rel="stylesheet" href="https://unpkg.com/leaflet@1.5.1/dist/leaflet.css" />
      <script src="https://unpkg.com/leaflet@1.5.1/dist/leaflet.js"></script>
      
      <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.Default.css" />
      <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.css" />
      <script src="https://unpkg.com/leaflet.markercluster@1.4.1/dist/leaflet.markercluster.js"></script>
      
      <div id="mapid"></div>

      【讨论】:

      • 感谢您的代码。不幸的是,当我单击它时,我必须显示有关标记的信息。这个鼠标悬停事件使捕捉和击中标记变得更加困难;D
      • @ajl31701 您可以将事件更改为“clusterclick”。但不幸的是,如果不修改 JavaScript 代码,您无法为单个组打开多个集群。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多