Comment ajouter un calque à SelectFeature sans perdre les sélections existantes?

9

J'utilise un OpenLayers.Control.SelectFeature pour les sélections sur plusieurs couches. Cependant, lorsque j'ajoute un calque à l'aide de setLayer (), mes sélections sur les autres calques sont perdues.

Quelqu'un sait comment contourner cela? Je souhaite conserver mes sélections existantes sur d'autres calques lorsque j'ajoute un calque au contrôle SelectFeature.

Voici un exemple: MON EXEMPLE

Mise à jour:

Je suis conscient que cela fait partie de l'API. Mais je cherche un travail.

/**
 * 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
la source

Réponses:

6

Vous pouvez modifier la méthode setLayer du contrôle 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
la source
Bien sûr, je peux! Je ne sais pas pourquoi je n'y ai pas pensé. Merci! (+1)
CaptDragon
0

Je pense que c'est une méthode très utile mais elle devrait être ajoutée en tant qu'addLayer (Layer) et avec quelques petits changements pour qu'elle gère une couche:

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

qui, je l'espère, sera pris en compte dans cette demande de tirage - https://github.com/openlayers/openlayers/pull/1287

De plus, l'utilisateur n'a pas à maintenir une liste des couches ajoutées.

Endre Moen
la source