Jak dodać warstwę do SelectFeature bez utraty istniejących zaznaczeń?

9

Korzystam z OpenLayers.Control.SelectFeature do selekcji na wielu warstwach. Jednak gdy dodam warstwę za pomocą setLayer (), mój wybór na pozostałych warstwach zostanie utracony.

Czy ktoś wie jak to obejść? Chciałbym zachować istniejące zaznaczenia na innych warstwach, gdy dodam warstwę do kontrolki SelectFeature.

Oto przykład: MÓJ PRZYKŁAD

Aktualizacja:

Wiem, że jest to część interfejsu API. Ale szukam obejścia.

/**
 * 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
źródło

Odpowiedzi:

6

Możesz zmodyfikować metodę setLayer kontrolki 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
źródło
Oczywiście, że mogę! Nie wiem, dlaczego o tym nie pomyślałem. Dzięki! (+1)
CaptDragon
0

Myślę, że jest to bardzo przydatna metoda, ale należy ją dodać jako addLayer (Layer) i z niewielkimi zmianami, aby obsługiwała jedną warstwę:

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

co mam nadzieję zostanie uwzględnione w tym żądaniu ściągnięcia - https://github.com/openlayers/openlayers/pull/1287

Również wtedy użytkownik nie musi utrzymywać listy warstw, które zostały dodane.

Endre Moen
źródło