【问题标题】:How do I flush out previous layers created by leaflet draw tool without refreshing page?如何在不刷新页面的情况下清除由传单绘制工具创建的先前图层?
【发布时间】:2016-06-26 14:30:53
【问题描述】:

我想通过切换样式菜单链接访问传单绘制工具栏,以便用户一次可以绘制一个矩形(实际上这些将被插入到数据库中)。到目前为止,我管理的是用户可以在工具栏上切换,绘制一个矩形,完成后关闭工具栏,这很好,但是当用户第二次这样做时(即再次打开工具栏)绘制的矩形数量增加。我不知道为什么。有人可以解释并提供解决方案。要求是每次启用工具栏时生成一个矩形。

var map = L.map('map').setView([51.505, -0.09], 13);
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    maxZoom: 18,
}).addTo(map);


var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);

var drawControl = new L.Control.Draw({
    position: 'topright',
    draw: {
            polyline: false,
            circle: false,
            marker: false,
            polygon: false,
            rect: {
                    shapeOptions: {
                            color: 'green'
                    },
            }
    }
});

var step1Enabled = 0;
$('#step1').click(function(){
      if (step1Enabled){
          map.removeControl(drawControl);
          drawnItems.clearLayers();
          step1Enabled = 0;
      }else{
          step1Enabled = 1;
          map.addControl(drawControl);
          map.on('draw:created', function (e) {
                  var type = e.layerType,
                          layer = e.layer;
                  layer.addTo(map);
                  if (type === 'rectangle') {
                      console.log(type, ' drawn');
                  }
          });
      }
});

【问题讨论】:

    标签: javascript jquery leaflet leaflet.draw


    【解决方案1】:

    你需要clear绘制的图层。

             // event handler
             function drawCreated(e) {
                var type = e.layerType,
                layer = e.layer;
                layer.addTo(drawnItems);
                console.log(type, ' drawn', layer);
              }
    
              var step1Enabled = 0;
              $('#step1').click(function(){
                    if (step1Enabled){
                        // remove event handler
                        map.off('draw:created', drawCreated);
                        map.removeControl(drawControl);
                        drawnItems.clearLayers();
                        step1Enabled = 0;
                    }else{
                        step1Enabled = 1;
                        map.addControl(drawControl);
                        // add event handler
                        map.on('draw:created', drawCreated);
                    }
              });
    

    【讨论】:

    • 不幸的是,这并没有产生任何影响。如果我在绘制矩形时切换菜单项 3 次,我会绘制 3 次!我把头发拉出来。
    • 你能给出一个显示问题的链接吗?
    • 我编辑了答案。注意 layer.addTo(drawnItems) 而不是 layer.addTo(map)。是你想做的吗?
    • 不,它没有任何区别。如果我没有很好地解释这一点,我很抱歉。我做了一个小提琴,所以我希望它更容易看到我的问题。如果您运行小提琴并立即转到工具并通过步骤 1 启用绘图工具栏。再次执行此操作以关闭,然后再执行几次。当您尝试绘制任何形状时,draw:created 事件会触发多次。我只希望它触发一次,因此如果用户之前打开或关闭了工具栏,它应该是无关紧要的。这有意义吗?使用调试器控制台查看打印的日志消息。小提琴:jsfiddle.net/ghtynor6/5
    • 我想我明白你的意思了。您必须删除事件处理程序。我更新了答案。这是更正后的 jsfiddle jsfiddle.net/FranceImage/a4ojwqgr/1
    猜你喜欢
    • 2019-08-04
    • 2023-03-23
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多