Leaflet.js:将地图缩放到可见标记

Leaflet.js: zoom map to visible markers

我有一张带有 collection 标记的 leaflet.js 地图,可以 shown/hidden 在图例中 div 使用插件 Leaflet.StyledLayerControl 完成(我认为这不是太相关,但以防万一)。

我可以在图层显示或隐藏时捕获事件,在那种情况下我想缩放以适合所有可见标记。

SO 中有一些标题非常相似的问题,但其中大多数假装适合缩放到已知的 collection 标记,这不是我的情况(其他一些主题非常相似的问题请参阅Google 地图,而不是传单)。

所以,问题是:

A) 我可以设置缩放以适合所有可见标记吗? B) 或者,我怎样才能得到所有可见标记的数组来应用看到的其他解决方案?

这是我在地图上创建标记的方式:

const icon_general = L.divIcon({html: '<i class="fas fa-map-marker fa-2x"></i>', iconSize: [20, 20], className: 'node_icon'});

var node_10031 = L.marker([40.7174605,-3.9199218],{ icon: icon_general}).addTo(layer1);
node_10031.bindPopup('<h2>Title</h2>');
var node_10032 = L.marker([40.7184576,-3.9202692],{ icon: icon_general}).addTo(layer1);
node_10032.bindPopup('<h2>Title</h2>');
var node_10032 = L.marker([40.7361371,-3.9453966],{ icon: icon_general}).addTo(layer2);
node_10032.bindPopup('<h2>Title</h2>');

层随后被隐藏或显示,我可以捕获该事件,这是我想要修改缩放或循环浏览可见标记的地方。

编辑(最终解决方案基于 Seth Lutske 回复):

这是我的最终解决方案,也许它的效率较低,因为每次点击它都会循环遍历地图中的所有可见标记,但经过一些尝试,这是成功的(我无法正确管理 indivadd/remove层的双重事件:

function setZoom2Visible()
{
    var visibleLayerGroup = new L.FeatureGroup();

    mymap.eachLayer(function(layer){
        if (layer instanceof L.Marker)
            visibleLayerGroup.addLayer(layer);
    });

    const bounds = visibleLayerGroup.getBounds();
    mymap.fitBounds(bounds);
}

$('.menu-item-checkbox input[type=checkbox]').click(function(){
    setZoom2Visible();
});

创建一个特征组并向其添加标记:

const myGroup = L.featureGroup([node_10031, node_10032, node_10033]);

无论您使用什么事件来捕获添加到地图的标记,您都可以获取 featureGroup 的边界并将地图的边界设置为:

function onMarkersAddedEventHandler(){
  const bounds = myGroup.getBounds();
  map.fitBounds(bounds);
}

现在,如果您说 每个标记 在 UI 中都有自己的切换开关,那就有点复杂了。您必须将事件附加到每个标记的 UI 复选框,并在更改该复选框时,从组中添加或删除标记,然后重置边界:

const node_10031_checkbox = document.querySelector('input[type="checkbox"]#10031');

function onMarkersAddedEventHandler(e){
  if (e.target.checked){
    myGroup.addLayer(node_10031)
  } else {
    myGroup.removeLayer(node_10031)
  }
  const bounds = myGroup.getBounds();
  map.fitBounds(bounds);
}