Как добавить слой в SelectFeature без потери существующих выделений?

9

Я использую OpenLayers.Control.SelectFeature для выбора на нескольких слоях. Однако, когда я добавляю слой, используя setLayer (), мои выборы на других слоях теряются.

Кто-нибудь знает, как обойти это? Я хотел бы сохранить существующие выделения на других слоях при добавлении слоя в элемент управления SelectFeature.

Вот пример: МОЙ ПРИМЕР

Обновить:

Я знаю, что это часть API. Но я ищу работу вокруг.

/**
 * APIMethod: setLayer
 * Attach a new layer to the control, overriding any existing layers.
 *
 * Parameters:
 * layers - Array of {<OpenLayers.Layer.Vector>} or a single
 *     {<OpenLayers.Layer.Vector>}
 */
setLayer: function(layers) {
    var isActive = this.active;
    this.unselectAll();
    this.deactivate();
    if(this.layers) {
        this.layer.destroy();
        this.layers = null;
    }
    this.initLayer(layers);
    this.handlers.feature.layer = this.layer;
    if (isActive) {
        this.activate();
    }
},
CaptDragon
источник

Ответы:

6

Вы можете изменить метод setLayer элемента управления SelectFeature:

OpenLayers.Control.SelectFeature.prototype.setLayer = function(layers) {
    var isActive = this.active;
    //this.unselectAll(); <- what you need
    this.deactivate();
    if(this.layers) {
        this.layer.destroy();
        this.layers = null;
    }
    this.initLayer(layers);
    this.handlers.feature.layer = this.layer;
    if (isActive) {
        this.activate();
    }
}
drnextgis
источник
Конечно, я могу! Не знаю, почему я не подумал об этом. Спасибо! (+1)
CaptDragon
0

Я думаю, что это очень полезный метод, но его нужно добавить как addLayer (Layer) и с небольшими изменениями, чтобы он обрабатывал один слой:

addLayer = function(layer) {
  var isActive = this.active;
  var currLayers = this.layers; 
  this.deactivate();
  if(this.layers) {
      this.layer.destroy();
      this.layers = null;
  }
  if ( currLayers != null) {
      currLayers.push(layer);   
      this.initLayer(currLayers);
  } else {
      this.initLayer([layer]);
  }
  this.handlers.feature.layer = this.layer;
  if (isActive) {
      this.activate();
  }
},

который, я надеюсь, будет принят в этом запросе на получение доступа - https://github.com/openlayers/openlayers/pull/1287

Кроме того, пользователю не нужно вести список слоев, которые были добавлены.

Эндре Моен
источник