Wie füge ich SelectFeature eine Ebene hinzu, ohne vorhandene Auswahlen zu verlieren?

9

Ich verwende ein OpenLayers.Control.SelectFeature für die Auswahl auf mehreren Ebenen. Wenn ich jedoch mit setLayer () eine Ebene hinzufüge, gehen meine Auswahlen auf den anderen Ebenen verloren.

Weiß jemand, wie man das umgeht? Ich möchte meine vorhandene Auswahl auf anderen Ebenen behalten, wenn ich dem SelectFeature-Steuerelement eine Ebene hinzufüge.

Hier ist ein Beispiel: MEIN BEISPIEL

Aktualisieren:

Mir ist bewusst, dass dies Teil der API ist. Aber ich suche eine Lösung.

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

Antworten:

6

Sie können die setLayer-Methode des SelectFeature-Steuerelements ändern:

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
quelle
Natürlich kann ich! Ich weiß nicht, warum ich nicht daran gedacht habe. Vielen Dank! (+1)
CaptDragon
0

Ich denke, dies ist eine sehr nützliche Methode, aber sie sollte als addLayer (Ebene) und mit einigen kleinen Änderungen hinzugefügt werden, damit sie eine Ebene handhabt:

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

Ich hoffe, dass dies in dieser Pull-Anfrage berücksichtigt wird - https://github.com/openlayers/openlayers/pull/1287

Außerdem muss der Benutzer keine Liste der hinzugefügten Ebenen führen.

Endre Moen
quelle