기존 선택을 잃지 않고 SelectFeature에 레이어를 추가하는 방법은 무엇입니까?


9

여러 레이어에서 선택할 때 OpenLayers.Control.SelectFeature 를 사용하고 있습니다. 그러나 setLayer ()를 사용하여 레이어를 추가하면 다른 레이어의 선택 항목이 손실됩니다.

이 문제를 해결하는 방법을 아는 사람이 있습니까? SelectFeature 컨트롤에 레이어를 추가 할 때 기존 레이어를 다른 레이어에 유지하고 싶습니다.

예를 들면 다음과 같습니다. MY EXAMPLE

최신 정보:

이것이 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)로 추가하고 하나의 레이어를 처리하도록 약간의 변경을해야합니다.

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.