如何从地图中删除所有图层和功能?

How to remove all layers and features from map?

我正在处理地图,我想从地图上删除某个事件的所有要素。这些特征位于动态绘制的多层中。

部分代码为:

$.getJSON('distributor-companies', function (data) {
                var layers = [];
                $.each(data, function (i, item) {
                    if (item.geojson != '') {
                        layers[i] = L.mapbox.featureLayer().addTo(map);
                        $.getJSON('/geojson/' + item.geojson, function (data) {
                            layers[i].setGeoJSON(data);
                            // Loop over the added layer
                            layers[i].eachLayer(function (layer) {
                                // Add click event
                                layer.on('click', function (e) {
                                    // Do stuff
                                    map.fitBounds(layers[i].getBounds());
                                });
                            });
                        });
                    }
                });
            });

有没有办法在某个时间点获取地图上的所有图层并将其删除。

使用L.MapeachLayer方法遍历添加到地图的所有图层,然后在每个图层上调用L.MapremoveLayer方法:

map.eachLayer(function (layer) {
    map.removeLayer(layer);
});

参考文献:

eachLayer: http://leafletjs.com/reference.html#map-eachlayer

removeLayer: http://leafletjs.com/reference.html#map-removelayer

请注意,这将从您的地图中删除所有图层。这也意味着任何 tilelayers 等。我认为在你的情况下最好不要将所有 featureLayers 添加到地图实例,而是为它们创建一个组:

// Create group for your layers and add it to the map
var layerGroup = L.layerGroup().addTo(map);

$.getJSON('distributor-companies', function (data) {

    $.each(data, function (i, item) {
        if (item.geojson != '') {
            // Add the new featureLayer to the layerGroup
            var featureLayer = L.mapbox.featureLayer().addTo(layerGroup);
            $.getJSON('/geojson/' + item.geojson, function (data) {
                featureLayer.setGeoJSON(data);
                featureLayer.eachLayer(function (layer) {
                    layer.on('click', function (e) {
                        map.fitBounds(featureLayer.getBounds());
                    });
                });
            });
        }
    });
});

现在可以调用L.LayerGroupclearLayers方法清除组中的当前图层:

layerGroup.clearLayers();

参考:

L.LayerGroup: http://leafletjs.com/reference.html#layergroup

clearLayers: http://leafletjs.com/reference.html#layergroup-clearlayers

在mapbox-gl绘图库中,有一个函数可以做到这一点。

draw.deleteAll().getAll();

这将删除地图上的所有要素和图层。

您可以使用以下真实性检查来查看它是否是有效的 geoJSON 对象:

map.eachLayer(function(layer) {
  if (!!layer.toGeoJSON) {
    map.removeLayer(layer);
  }
});

基于 的回答,但如果您想 删除除平铺层之外的所有层 ,则更简洁。只需通过检查 _url:

来检查图层是否为图块图层
var osmUrl = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png'

map.eachLayer(function (layer) {
    if (osmUrl != layer._url){map.removeLayer(layer)};
});

我用这个解决了我的问题。我的图层类型是“填充”,图层名称是“source_tiles_1”、“source_tiles_2”、“source_tiles_3”

map.getStyle().layers.forEach((layer) => {
       if(layer.id.match(/source_tiles/g)){
          map.removeLayer(layer.id);
          map.removeSource(layer.id);
         }
     });