3

我正在使用 OpenLayers,我的地图有一个图层,还有一个矢量图层。在这个矢量图层中,我使用 DrawFeature 控件来绘制一个正方形。我有一个监听器等待添加一个功能,然后删除任何现有功能(我一次只想要一个正方形),如下所示:

  polygonLayer.events.register("beforefeatureadded", feature, function(evt){
         console.log("Clearing existing polygons");
         console.log(polygonLayer.features.length);
         polygonLayer.destroyFeatures();
         polygonLayer.redraw();
        });//end attempt at events registration

当我检查我的 layer.features.size 时,我可以看到它总是 1,就像我预期的那样,但屏幕上的方块仍然显示。即使我在图层上调用 .redraw() ,方块仍然存在。

我缺少一些额外的步骤吗?

编辑:你可以在这里找到我的代码:http: //pastie.org/909644

编辑:刚刚意识到:如果我从以前存在的坐标中画一个正方形,我可以很好地清除它。似乎只是从控制器绘制的方块是一个问题?

4

4 回答 4

7

您首先需要创建一个控件:

ClearMap.clearMapControl = function () {
    var control = new OpenLayers.Control.Button();
    Map.map.addControl(control);
    return control;
};

那么你需要一个按钮来激活 ClearMapControl

ClearMap.newClearMapButton = function () {
    var button = new OpenLayers.Control.Button({
        id : 'clearMapButton',
        type : 1,
        title : 'Clear Map',
        displayClass : 'clearMapButton',
        trigger : clearControlActivate,
    });
    return button;
}

那么您需要激活按钮的操作以清除信息或功能层

var clearControlActivate = function(){
    for(var i=0; map.popups.length; i++) {
        map.removePopup(map.popups[i]);         
    }

  for(var j=0; j < map.layers.length; j++){
      if(map.layers[j].__proto__.CLASS_NAME == "OpenLayers.Layer.Vector"){
          map.layers[j].removeAllFeatures();
      }
  }
}

我希望它对你有用,对不起我的英语

于 2012-06-12T16:34:11.550 回答
2

好吧,我想我已经弄清楚了。我意识到如果定期绘制方块,我可以清除它们,这让我意识到问题出在我之前添加的代码中。我摆脱了那里的方块的清除,果然,当我从一个按钮手动调用清除时,它们就消失了。

因此,在添加功能的同时尝试清除所有功能是一个问题。

我最终做的是使用“featureadded”,然后从要删除的功能列表中删除该功能。奇迹般有效。

     polygonLayer.events.register("featureadded", feature, function(evt){
        //only one circle at a time
               points = evt.feature.geometry.getVertices();
        console.log("Erasing old features: ");
        console.log(evt.feature);
        if(polygonLayer.features.length > 1){
        polygonLayer.destroyFeatures(polygonLayer.features.shift());
        };
        });//end after feature
于 2010-04-08T18:29:16.810 回答
1

从矢量图层中删除特征后,您应该将其应用于所有地图...

    map.layers[1].removeAllFeatures();

1 是我的矢量图层的参考!

于 2013-02-23T11:45:14.113 回答
0

这是我们在 Legato 中使用的代码:

Legato.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control.DrawFeature, {
  mode :1,
  callback :null,
  handlerConstructor :OpenLayers.Handler.Point,
  initialize : function(layer, options) {
    OpenLayers.Control.DrawFeature.prototype.initialize.apply(this, [ layer,
        this.handlerConstructor, options ]);

  },
  destroy : function() {
    OpenLayers.Control.DrawFeature.prototype.destroy.apply(this, arguments);
  },
  setMap : function(map) {
    OpenLayers.Control.DrawFeature.prototype.setMap.apply(this, arguments);
  },
  drawFeature : function(geometry) {
    var feature = new OpenLayers.Feature.Vector(geometry);
    var proceed = this.layer.events.triggerEvent("sketchcomplete", {
      feature :feature
    });
    if (proceed !== false) {
      feature.state = OpenLayers.State.INSERT;
      if (this.mode == 1) {
        this.layer.addFeatures( [ feature ]);
        this.featureAdded(feature);
        this.events.triggerEvent("featureadded", {
          feature :feature
        });
      }
      if (this.mode == 2) {
        this.layer.destroyFeatures();
        this.layer.addFeatures( [ feature ]);
        this.featureAdded(feature);
        this.events.triggerEvent("featureadded", {
          feature :feature
        });
      }
    }
    if (Legato.Lang.ObjectUtils.isFunction(this.callback)) {
      this.callback(geometry);
    }
  },

  CLASS_NAME :'Legato.Control.DrawFeature'
});
Legato.Control.DrawFeature.MODE_ADD_FEATURE = 1;
Legato.Control.DrawFeature.MODE_REPLACE_FEATURE = 2;
于 2010-04-08T18:16:38.187 回答