简体   繁体   English

防止多个markerClusterGroup图标在Leaflet中重叠

[英]Prevent multiple markerClusterGroup icons from overlapping in Leaflet

I have two seperate markerClusterGroups that occasionally overlap. 我有两个单独的markerClusterGroups,它们有时会重叠。 Is there anyway to prevent this? 反正是有防止这种情况发生的吗? In my actual code, I am using a custom Icon for one of the cluster groups so that I can tell the difference between the two cluster types. 在我的实际代码中,我为一个集群组使用了一个自定义图标,以便我可以分辨出两种集群类型之间的区别。 However, it wasn't neccessary for this example so I left that part out for the sake of simplicity. 但是,此示例不是必需的,因此为了简单起见,我将该部分省略。

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);
}

Here is an example of what I mean: 这是我的意思的示例:

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

截图

The requirement states that the markers in category 1 must cluster separately from markers in category 2. However both types must be displayed on the map at the same time. 该要求指出,类别1中的标记必须与类别2中的标记分开聚类。但是,这两种类型必须同时显示在地图上。

Is there anyway to prevent this? 反正是有防止这种情况发生的吗?

Not with several Leaflet.markercluster groups as you did. 不能像您那样使用几个Leaflet.markercluster组。

Think about it: where should the cluster icons positions be computed, when a given group has no data about another group? 想一想:当给定组没有有关另一组的数据时,应在哪里计算群集图标的位置?

You may have several possible workarounds and/or other libraries that may better fit your need, without having to re-write a clustering algorithm yourself. 您可能有几种可能的解决方法和/或其他库,它们可能更适合您的需要,而不必自己重新编写集群算法。

For example, a popular alternative to show different categories while clustering is the PruneCluster plugin: 例如, PruneCluster插件是在聚类时显示不同类别的一种流行替代方法:

PruneCluster is a fast and realtime marker clustering library. PruneCluster是一个快速且实时的标记聚类库。

It's working with Leaflet as an alternative to Leaflet.markercluster. 它与Leaflet一起使用,以替代Leaflet.markercluster。

具有PruneCluster图标类别的地图的屏幕截图 Excerpt from PruneCluster home page 摘自PruneCluster主页

Another possible workaround would be to merge all categories into the same Marker Cluster Group, but have the latter's cluster icon customized so that they render similarly as the above PruneCluster screenshot, or even render fake icons for each category: 另一个可能的解决方法是将所有类别合并到同一个标记群集组中,但自定义标记群集组,以使其与上述PruneCluster屏幕截图类似地呈现,甚至为每个类别呈现伪造的图标:

Leaflet.markercluster的屏幕快照,其中每个类别都有自定义的群集图标

 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> 

Then if you wish you can further customize the spiderfication so that it shows Markers only from the clicked category cluster icon, and similar for the hovering polygon. 然后,如果您希望的话,可以进一步自定义蜘蛛网化,使其仅显示单击的类别簇图标中的标记,而对于悬停的多边形则类似。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM