传单markercluster:放大后在childmarker上打开弹出窗口
leafelt markercluster: open popup on childmarker after zoom in
我有传单地图并正在使用 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();
});
我做了一些研究,但目前我不知道如何解决这个问题。
如果有人有一些提示,那就太好了。
谢谢!
您有几种可能的解决方案来自动打开未聚类标记的弹出窗口。您必须使用事件侦听器,并且可以侦听 "zoomend"
, or probably better, to "layeradd"
事件(因为 Leaflet.markercluster 也会从视图中删除标记,因此在不更改缩放级别的情况下进行平移会使一些新标记出现)。
Leaflet.markercluster 插件会在您的标记聚类时自动从地图中删除它们,并在它们取消聚类时将它们添加回来。
在 "layeradd"
上,检查添加的图层是否是单个标记(即 class L.Marker
的实例),而不是群集。如果是单个Marker,则打开它的popup:
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: '© <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()
];
}
<!-- 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>
这是我研究了解决这个问题的文档后的解决方案。它也有效,但总是打开所有弹出窗口,即使它们已经打开,我不知道这是否会对地图的性能产生负面影响。
map.on('zoomend', function() {
vehicleClusterMarkers.eachLayer(function(layer) {
layer.openPopup();
});
});
我有传单地图并正在使用 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();
});
我做了一些研究,但目前我不知道如何解决这个问题。
如果有人有一些提示,那就太好了。 谢谢!
您有几种可能的解决方案来自动打开未聚类标记的弹出窗口。您必须使用事件侦听器,并且可以侦听 "zoomend"
, or probably better, to "layeradd"
事件(因为 Leaflet.markercluster 也会从视图中删除标记,因此在不更改缩放级别的情况下进行平移会使一些新标记出现)。
Leaflet.markercluster 插件会在您的标记聚类时自动从地图中删除它们,并在它们取消聚类时将它们添加回来。
在 "layeradd"
上,检查添加的图层是否是单个标记(即 class L.Marker
的实例),而不是群集。如果是单个Marker,则打开它的popup:
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: '© <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()
];
}
<!-- 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>
这是我研究了解决这个问题的文档后的解决方案。它也有效,但总是打开所有弹出窗口,即使它们已经打开,我不知道这是否会对地图的性能产生负面影响。
map.on('zoomend', function() {
vehicleClusterMarkers.eachLayer(function(layer) {
layer.openPopup();
});
});