如何从地图中删除所有图层和要素?

Posted

技术标签:

【中文标题】如何从地图中删除所有图层和要素?【英文标题】:How to remove all layers and features from map? 【发布时间】:2015-04-23 03:43:45 【问题描述】:

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

部分代码为:

$.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());
                                );
                            );
                        );
                    
                );
            );

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

【问题讨论】:

【参考方案1】:

循环使用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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

var osmUrl = 'http://s.tile.osm.org/z/x/y.png'

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

【讨论】:

【参考方案4】:

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

draw.deleteAll().getAll();

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

【讨论】:

【参考方案5】:

我用这个解决了我的问题。我的图层类型是“填充”,图层名称是“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);
         
     );

【讨论】:

以上是关于如何从地图中删除所有图层和要素?的主要内容,如果未能解决你的问题,请参考以下文章

如何把arcgis要素数据集删除保留图层

Mapbox:如何连续包装要素层

arcpy实例教程-地图图层导出到要素类

要素图层未出现在打印结果中

在ArcMap中发布FeatureLayer(要素图层)

arcgismxd文件可以加载数据点吗