Предотвращение перекрытия нескольких значков markerClusterGroup в Leaflet - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть две отдельные маркерные кластерные группы, которые иногда перекрываются.Есть ли способ предотвратить это?В моем собственном коде я использую пользовательский значок для одной из групп кластеров, чтобы я мог определить разницу между двумя типами кластеров.Тем не менее, это не было необходимым для этого примера, поэтому я упустил эту часть для простоты.

var map = L.map("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);

map.setView([48.85, 2.35], 12);
var mcg = L.markerClusterGroup().addTo(map);
var mcg2 = L.markerClusterGroup().addTo(map);

L.marker([48.85, 2.35]).addTo(mcg);
L.marker([48.85, 2.34]).addTo(mcg);

for(var i=0;i<40;i++){
    L.marker([48.85, 2.34091]).addTo(mcg2);
}

Вот пример того, что я имею в виду:

http://plnkr.co/edit/yqIhI7RMsp9A7I3AwGnY?p=preview

Screenshot

Требованиеутверждает, что маркеры в категории 1 должны группироваться отдельно от маркеров в категории 2. Однако оба типа должны отображаться на карте одновременно.

1 Ответ

0 голосов
/ 21 сентября 2018

Есть ли способ предотвратить это?

Не с несколькими группами Leaflet.markercluster, как вы это сделали.

Подумайте об этом: где должны быть позиции значков кластера?вычисляется, когда у данной группы нет данных о другой группе?

У вас может быть несколько возможных обходных путей и / или других библиотек, которые могут лучше соответствовать вашим потребностям, без необходимости переписывать алгоритм кластеризации самостоятельно.

Например, популярной альтернативой для отображения разных категорий при кластеризации является плагин PruneCluster :

PruneCluster - это библиотека для быстрой кластеризации маркеров в реальном времени.

Он работает с Leaflet как альтернатива Leaflet.markercluster.

Screenshot of map with PruneCluster icon categories Выдержка из домашней страницы PruneCluster

Другой возможный обходной путь - объединить все категории в одну и ту же группу кластеров маркеров, но иметь значок кластера последней , настроенный , чтобы ониотображать аналогично приведенному выше снимку экрана PruneCluster или даже отображать поддельные значки для каждой категории:

Screenshot of Leaflet.markercluster with customized cluster icons for each category

function customClusterIcon(cluster) {
  // Count number of markers from each category.
  var markers = cluster.getAllChildMarkers();
  var cat1count = 0;
  var cat2count = 0;
  for (var marker of markers) {
    var category = marker.options.category;
    if (category && category === 'cat2') {
      cat2count += 1;
    } else {
      cat1count += 1;
    }
  }
  // Generate the cluster icon depending on presence of Markers from different categories.
  if (cat2count === 0) {
    return L.divIcon({
      html: cat1count,
      className: 'cat1cluster cluster',
      iconSize: [20, 20]
    });
  } else if (cat1count === 0) {
    return L.divIcon({
      html: cat2count,
      className: 'cat2cluster cluster',
      iconSize: [20, 20]
    });
  } else {
    return L.divIcon({
      html: `
        <div class="cat1cluster cluster">${cat1count}</div>
        <div class="cat2cluster cluster">${cat2count}</div>
      `,
      className: '',
      iconSize: [45, 20]
    });
  }
}

var paris = [48.86, 2.35];
var parisLeft = [48.86, 2.25];
var parisRight = [48.86, 2.45];
var map = L.map('map', {
  maxZoom: 18
}).setView(paris, 11);

var mcg = L.markerClusterGroup({
  iconCreateFunction: customClusterIcon
}).addTo(map);
var category1 = L.layerGroup();
var category2 = L.layerGroup();

var cat2style = {
  color: 'red',
  category: 'cat2'
};

var markerA = L.circleMarker(paris).addTo(category1);
var markerB = L.circleMarker(paris).addTo(category1);
var markerC = L.circleMarker(paris, cat2style).addTo(category2);
var markerD = L.circleMarker(paris, cat2style).addTo(category2);

var markerE = L.circleMarker(parisLeft).addTo(category1);
var markerF = L.circleMarker(parisLeft).addTo(category1);

var markerG = L.circleMarker(parisRight, cat2style).addTo(category2);
var markerH = L.circleMarker(parisRight, cat2style).addTo(category2);

mcg.addLayers([category1, category2]);


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

.cat1cluster {
  background-color: #3388ff;
}

.cat2cluster {
  background-color: red;
}

.cluster {
  width: 20px;
  height: 20px;
  display: inline-block;
  text-align: center;
}
<!-- Leaflet assets -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.4/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.4/dist/leaflet-src.js" integrity="sha512-+ZaXMZ7sjFMiCigvm8WjllFy6g3aou3+GZngAtugLzrmPFKFK7yjSri0XnElvCTu/PrifAYQuxZTybAEkA8VOA==" crossorigin=""></script>

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


<div id="map"></div>

Затем, если хотите, вы можете дополнительно настроить паутину так, чтобы она отображала маркеры только на значке кластера категории, на который нажали, и аналогично для зависшего многоугольника.

...