2016-04-12 35 views
2

私のサーバは、同じオブジェクトのいくつかの異なるPNG画像を静的に提供しています。それぞれ異なるスペクトルフィルタ(例えば赤いチャンネルまたは青いチャンネルのみ)で撮影されます。そのオブジェクトの滑らかで偽の色のついた地図を表示したいと思います。 Iそうのような3つの別々の画像ソースを作成することによってこれを行う:私は、使用するレイヤを作成ソースが変更されたときにOpenlayers-3ラスタレイヤーが変更されない

rgbSources = [rsource, gsource, bsource]; 
raster = new ol.source.Raster({ 
    sources: rgbSources, 
    operation: function(bands, data) { 
     var rband = bands[0]; 
     var gband = bands[1]; 
     var bband = bands[2]; 

     var composed = [ 
      rband[0], 
      gband[0], 
      bband[0], 
      255 
     ]; 
     return composed; 
    } 
}); 

extent = [0, 0, ncols, nrows]; 
pixelProjection = new ol.proj.Projection({ 
    code: 'some-image', 
    units: 'pixels', 
    extent: extent 
}); 

rsource = new ol.source.ImageStatic({ 
    url: "static/imgs/band_1.png", 
    projection: pixelProjection, 
    imageExtent: extent 
}); 
gsource = new ol.source.ImageStatic({ 
    url: "static/imgs/band_2.png", 
    projection: pixelProjection, 
    imageExtent: extent 
}); 
bsource = new ol.source.ImageStatic({ 
    url: "static/imgs/band_3.png", 
    projection: pixelProjection, 
    imageExtent: extent 
}); 

次に、私はそれを構成することができ、ラスタ源への入力としてこれらのソースを使用しますそのソースとして、このラスタ:

colorLayer = new ol.layer.Image({ 
    source: raster 
}); 

最後には、私はマップを作成し、マップに自分のラスタレイヤを追加することができます。

var map = new ol.Map({ 
    target: 'map', 
    view: new ol.View({ 
     center:ol.extent.getCenter(extent), 
     projection: pixelProjection, 
     zoom: 1.5 
    }) 
}); 
map.addLayer(colorLayer); 

これまでのところとても良い!これは、期待どおりにイメージの色付きバージョンを表示します。この問題は、ユーザが引っ張る新しいチャネルインデックスを入力することによって、ユーザがカラーチャネルへの変更をトリガするときに発生する。私は青チャンネル変更のように扱う:

var index = 4; // actually gets passed in from user 
bsource = new ol.source.ImageStatic({ 
    url: "static/imgs/band_" + index + ".png", 
    projection: pixelProjection, 
    imageExtent: extent 
}); 
rgbSources[2] = bsource; // this was in global scope from before 
raster.sources = rgbSources; // as was this 

期待される動作は、マップがすぐに色が変わってしまうということである、または私はやパンにズームが、それらのもののどちらが発生したときに、少なくともそれは変化するであろう。私は新しい色をまったく表示できません。私は間違ったことを更新していますか?おそらく、raster.sourcesフィールドには、見つけられない関連するセッター関数がありますか?

答えて

1

解決策を見つけました!ラスタのソースを直接設定することはできませんが、レイヤのソースを設定することは可能です。だから、残念ながら、私は新しいラスタオブジェクト(完全に新しいソース)を作成する必要がありますが、少なくとも私は、新しいレイヤー必要はありません。私自身の答えを受け入れる

raster = new ol.source.Raster({ 
    sources: rgbSources, 
    operation: composeBands 
}); 
colorLayer.setSource(raster); 

をそれが意味した場合に他の誰かのソリューションを受け入れることを望んで新しいソースを作成する必要はありません。

関連する問題