既存の選択を失わずにレイヤーを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();
    }
},

回答:


6

SelectFeatureコントロールのsetLayerメソッドを変更できます。

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

もちろん出来る!なぜそれを考えなかったのかわからない。ありがとう!(+1)
CaptDragon

0

これは非常に便利な方法だと思いますが、addLayer(Layer)として追加し、1つのレイヤーを処理するようにいくつかの小さな変更を加える必要があります。

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

また、ユーザーは追加されたレイヤーのリストを維持する必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.