2014-06-15 5 views
0

기능의 특성 값을 사용자 지정 전략으로 변경하지만 기능을 그릴 때 기능에 새 특성 값이 적용되지 않습니다. http://jsfiddle.net/ccrafael/aXyqW/1/openlayer 전략으로 특성 특성 변경

감사 & 관련, 라파엘 :

OpenLayers.Strategy.LabelChange = OpenLayers.Class(OpenLayers.Strategy, { 

    activate: function() { 
     var activated = OpenLayers.Strategy.prototype.activate.call(this); 
     if(activated) { 
      this.layer.events.on({ 
       "moveend": this.filter, 
       scope: this 
      }); 
     } 
     return activated; 
    }, 

    deactivate: function() { 
     var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this); 
     if(deactivated) { 
      this.layer.events.un({ 
       "moveend": this.filter, 
       scope: this 
      }); 
     } 
     return deactivated; 
    }, 

    filter: function() { 
     console.log('labels updated'); 
     for (var i = 0; i < this.layer.features.length; i++) { 
      var f = this.layer.features[i]; 
      f.attributes.labelName = 'label updated'; 
     } 
    } 
}); 

var features = new Array(15); 

// create random reatures 
for (var i=0; i<features.length; i++) { 
    var x = (360 * Math.random()) - 180; 
    var y = (180 * Math.random()) - 90; 

    features[i] = new OpenLayers.Feature.Vector(
     new OpenLayers.Geometry.Point(x , y), 
     { 
      labelName: 'label '+ i 
     } 
    ); 
} 

var style = new OpenLayers.Style({ 
    strokeWidth:0, 
    pointRadius: 2, 
    fillOpacity:0, 
    label: "${labelName}", 
    fontColor: "#333333", 
    fontFamily: "sans-serif", 
    fontWeight: "bold", 
}); 

// Create a vector layer and give it your style map. 
var labels = new OpenLayers.Layer.Vector("labels", { 
    styleMap: new OpenLayers.StyleMap(style), 
    strategies:[new OpenLayers.Strategy.LabelChange()] 

}); 

labels.addFeatures(features); 

var map = new OpenLayers.Map({ 
    div: "map", 
    layers: [ 
     new OpenLayers.Layer.WMS(
      "OpenLayers WMS", 
      "http://vmap0.tiles.osgeo.org/wms/vmap0", 
      {layers: "basic"} 
     ), 
     labels 
    ], 
    center: new OpenLayers.LonLat(0, 0), 
    zoom: 1 
}); 

가 jsfiddle을 들으

는 내가 뭘 테스트입니다.

답변

0

기본적으로 레이블은 업데이트되지 않지만 레이어를 다시 그리는 (축소/축소와 같은) 작업을 수행하면 레이블이 새로운 값으로 업데이트됩니다. 그래서 마지막에 레이어를 다시 그리기 위해 다음 줄을 추가하여 레이어를 다시 그려서 최신 속성 값을 가져옵니다.

// Added this line so features updates labelName with newly set attribute value. 
labels.redraw(); 

는 JSFiddle 업데이트 : http://jsfiddle.net/dWZw6/1/

희망이 당신을 도와줍니다.

+0

당신에게 Pratik 감사하지만이 전략 필터 메서드 내 다시 그릴 필요했던 다음은 바이올린

filter: function() { console.log('labels updated'); var features = this.layer.features; this.layer.removeAllFeatures(); for (var i = 0; i < features.length; i++) { var f = features[i]; f.attributes.labelName = 'label updated'; } this.layer.addFeatures(features); } 

. 하지만 그렇게하면 무한대 재귀가 발생합니다. – Rafael

+0

그게 내가 전에 시도한거야, 심지어 무한 재귀있어. redraw를 호출하면 (자), 필터 메소드가 불려가 재귀가 작성됩니다. 그래서 처음으로 레이블을 업데이트하려면 마지막에 다시 그리기 메서드를 호출해야합니다. –