使用多个标记簇组显示重叠的簇
Using several Marker Cluster Groups displays overlapping Clusters
我正在使用多个 L.markerClusterGroup({})
,以便我可以在图层控件中切换它们。
但是集群彼此隐藏。
我希望能够得到两个集群的总数。
我错过了什么?
问题是 each Leaflet Marker Cluster Group(即 L.markerClusterGroup
)将执行自己的集群并呈现集群,而不管其他集群组可能显示什么。因此,如果您有一些单独的标记(或任何点特征)位于不同的集群组中但彼此靠近,这些组将显示集群也彼此靠近,最终可能会重叠,尤其是在低缩放级别时,就像在你的屏幕截图中。
如果你想让你的标记聚在一起(混合"oranges with apples"),你应该使用单个标记集群组.
现在,如果我理解正确,您的 "difficulty" 是您希望能够动态添加和删除标记,即在您的情况下,用户可以使用 Layers Control 切换 on/off 地图上的一些特征。
在那种情况下,您可能会对 Leaflet.FeatureGroup.SubGroup plugin (see demo) 感兴趣。只需为每个 "switchable" 功能组创建 1 个子组并将其父组设置为您的 单个 标记集群组:
var map = L.map('map', {
maxZoom: 18,
}).setView([48.86, 2.35], 11);
var parentGroup = L.markerClusterGroup().addTo(map);
var overlays = {};
for (var i = 1; i <= 5; i += 1) {
overlays['Group ' + i] = L.featureGroup.subGroup(
parentGroup,
getArrayOfMarkers()
).addTo(map);
}
L.control.layers(null, overlays, {
collapsed: false,
}).addTo(map);
function getArrayOfMarkers() {
var result = [];
for (var i = 0; i < 10; i += 1) {
result.push(L.marker(getRandomLatLng()));
}
return result;
}
function getRandomLatLng() {
return [
48.8 + 0.1 * Math.random(),
2.25 + 0.2 * Math.random()
];
}
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
html,
body,
#map {
height: 100%;
margin: 0;
}
<!-- Leaflet assets -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.3/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.3/dist/leaflet.js" integrity="sha512-tAGcCfR4Sc5ZP5ZoVz0quoZDYX5aCtEm/eu1KhSLj2c9eFrylXZknQYmxUssFaVJKvvc0dJQixhGjG2yXWiV9Q==" 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>
<!-- Leaflet.FeatureGroup.SubGroup assets -->
<script src="https://unpkg.com/leaflet.featuregroup.subgroup@1.0.2/dist/leaflet.featuregroup.subgroup.js"></script>
<div id="map"></div>
另见 Cluster multiple Layers with markercluster
注意:对于更复杂的用例,还有另一个插件 Leaflet.MarkerCluster.LayerSupport。
另见
Disclosure: I am the author of these plugins.
我正在使用多个 L.markerClusterGroup({})
,以便我可以在图层控件中切换它们。
但是集群彼此隐藏。
我希望能够得到两个集群的总数。
我错过了什么?
问题是 each Leaflet Marker Cluster Group(即 L.markerClusterGroup
)将执行自己的集群并呈现集群,而不管其他集群组可能显示什么。因此,如果您有一些单独的标记(或任何点特征)位于不同的集群组中但彼此靠近,这些组将显示集群也彼此靠近,最终可能会重叠,尤其是在低缩放级别时,就像在你的屏幕截图中。
如果你想让你的标记聚在一起(混合"oranges with apples"),你应该使用单个标记集群组.
现在,如果我理解正确,您的 "difficulty" 是您希望能够动态添加和删除标记,即在您的情况下,用户可以使用 Layers Control 切换 on/off 地图上的一些特征。
在那种情况下,您可能会对 Leaflet.FeatureGroup.SubGroup plugin (see demo) 感兴趣。只需为每个 "switchable" 功能组创建 1 个子组并将其父组设置为您的 单个 标记集群组:
var map = L.map('map', {
maxZoom: 18,
}).setView([48.86, 2.35], 11);
var parentGroup = L.markerClusterGroup().addTo(map);
var overlays = {};
for (var i = 1; i <= 5; i += 1) {
overlays['Group ' + i] = L.featureGroup.subGroup(
parentGroup,
getArrayOfMarkers()
).addTo(map);
}
L.control.layers(null, overlays, {
collapsed: false,
}).addTo(map);
function getArrayOfMarkers() {
var result = [];
for (var i = 0; i < 10; i += 1) {
result.push(L.marker(getRandomLatLng()));
}
return result;
}
function getRandomLatLng() {
return [
48.8 + 0.1 * Math.random(),
2.25 + 0.2 * Math.random()
];
}
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
html,
body,
#map {
height: 100%;
margin: 0;
}
<!-- Leaflet assets -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.3/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.3/dist/leaflet.js" integrity="sha512-tAGcCfR4Sc5ZP5ZoVz0quoZDYX5aCtEm/eu1KhSLj2c9eFrylXZknQYmxUssFaVJKvvc0dJQixhGjG2yXWiV9Q==" 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>
<!-- Leaflet.FeatureGroup.SubGroup assets -->
<script src="https://unpkg.com/leaflet.featuregroup.subgroup@1.0.2/dist/leaflet.featuregroup.subgroup.js"></script>
<div id="map"></div>
另见 Cluster multiple Layers with markercluster
注意:对于更复杂的用例,还有另一个插件 Leaflet.MarkerCluster.LayerSupport。
另见
Disclosure: I am the author of these plugins.