leafelt markercluster:放大

时间:2018-01-30 14:43:37

标签: javascript popup leaflet markerclusterer leaflet.markercluster

我有一张传单地图并使用Leaflet.markercluster。 标记的数据来自外部服务,如json。

加载地图后,所有可见标记的弹出窗口都会打开。 但是当我缩小地图时,标记将被聚集,弹出窗口消失。 此时一切正常,但是当我放大时,我想再次打开每个子标记的弹出窗口而不单击标记本身。

目前代码如下:

vehicleClusterMarkers = L.markerClusterGroup({
    maxClusterRadius: 45,
    spiderfyOnMaxZoom: false
});
vehicleClusterMarkers.addLayer(TTJsonLayer);

//vehicleClusterMarkers.addTo(map);
map.addLayer(vehicleClusterMarkers);

vehicleClusterMarkers.eachLayer(function(layer) {
    layer.openPopup();
});         

我做了一些研究,但目前我不知道如何解决这个问题。

如果有人有一些提示,那就太好了。 THX!

2 个答案:

答案 0 :(得分:3)

您有几种可能的解决方案可以自动打开非聚集标记的弹出窗口。你必须使用事件监听器,你可以监听"zoomend",或者可能更好地监听"layeradd"事件(因为Leaflet.markercluster也会删除视图中的标记,所以在不改变缩放级别的情况下进行平移会使一些新的标记出现了。)

Leaflet.markercluster插件会在群集聚集时自动从地图中删除它们,并在它们取消群集时将其添加回来。

"layeradd"上,检查添加的图层是否是单个标记(即类L.Marker的实例),而不是群集。如果它是单个标记,则打开其弹出窗口:



var map = L.map("map", {
  closePopupOnClick: false,
  maxZoom: 18
}).setView([48.85, 2.35], 11);

map.on('layeradd', function(event) {
  var layer = event.layer;

  if (layer instanceof L.Marker && !(layer instanceof L.MarkerCluster)) {
    layer.openPopup();
  }
});

var mcg = L.markerClusterGroup();

for (var i = 0; i < 10; i += 1) {
  L.marker(getRandomLatLng()).addTo(mcg).bindPopup('Marker ' + i, {
    autoClose: false,
    autoPan: false
  });
}

mcg.addTo(map);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);

function getRandomLatLng() {
  return [
    48.8 + 0.1 * Math.random(),
    2.25 + 0.2 * Math.random()
  ];
}
&#13;
<!-- Leaflet assets -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet-src.js" integrity="sha512-IkGU/uDhB9u9F8k+2OsA6XXoowIhOuQL1NTgNZHY1nkURnqEGlDZq3GsfmdJdKFe1k1zOc6YU2K7qY+hF9AodA==" crossorigin=""></script>

<!-- Leaflet.markercluster assets -->
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.3.0/dist/MarkerCluster.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.3.0/dist/MarkerCluster.Default.css">
<script src="https://unpkg.com/leaflet.markercluster@1.3.0/dist/leaflet.markercluster-src.js"></script>

<div id="map" style="height: 200px"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这是我研究解决这个问题的文档后的解决方案。它也起作用,但总是打开所有弹出窗口,即使它们已经打开,我也不知道这是否会对地图的性能产生负面影响。

map.on('zoomend', function() {
    vehicleClusterMarkers.eachLayer(function(layer) {
        layer.openPopup();
    });
});