OpenLayers eraseFeatures не стирает объекты с экрана карты - PullRequest
3 голосов
/ 08 апреля 2010

Я использую 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 ]

7 голосов
/ 12 июня 2012

сначала нужно создать элемент управления:

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();
      }
  }
}

Я надеюсь, что это послужит вам извините за мой английский

2 голосов
/ 08 апреля 2010

Ладно, думаю, я понял это. Я понял, что мог бы очистить квадраты, если бы они рисовались регулярно, и это заставило меня понять, что проблема была в моем коде, добавленном ранее. Я избавился от очистки там квадратов и, конечно же, когда я вызвал клир вручную с кнопки, они ушли.

Итак, попытка очистить все функции, пока добавление функции было проблемой.

Я закончил тем, что использовал «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
1 голос
/ 23 февраля 2013

После удаления объектов из векторного слоя, вы должны применить его ко всей карте ...

    map.layers[1].removeAllFeatures();

1 является ссылкой моего векторного слоя!

0 голосов
/ 08 апреля 2010

Вот код, который мы используем в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...