Como adicionar uma camada ao SelectFeature sem perder as seleções existentes?

9

Estou usando um OpenLayers.Control.SelectFeature para seleções em várias camadas. No entanto, quando adiciono uma camada usando setLayer (), minhas seleções nas outras camadas são perdidas.

Alguém sabe como resolver isso? Gostaria de manter minhas seleções existentes em outras camadas quando adiciono uma camada ao controle SelectFeature.

Aqui está um exemplo: MEU EXEMPLO

Atualizar:

Estou ciente de que isso faz parte da API. Mas estou procurando uma solução.

/**
 * 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
fonte

Respostas:

6

Você pode modificar o método setLayer do controle 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
fonte
Claro que eu posso! Não sei por que não pensei nisso. Obrigado! (+1)
CaptDragon
0

Eu acho que este é um método muito útil, mas deve ser adicionado como addLayer (Layer) e com algumas pequenas alterações para lidar com uma camada:

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

que espero que seja apresentado nesta solicitação de recebimento - https://github.com/openlayers/openlayers/pull/1287

Além disso, o usuário não precisa manter uma lista de camadas que foram adicionadas.

Endre Moen
fonte