2016-04-12 21 views
2

Sunucum, her biri farklı bir spektral filtre (örneğin, yalnızca kırmızı bir kanal veya yalnızca mavi bir kanal) ile çekilen aynı nesnenin birkaç farklı PNG görüntüsünü statik olarak yayınlıyor. Bu nesnenin kaygan, sahte renkli bir haritasını göstermek istiyorum. Öyle gibi üç ayrı görüntüler kaynaklar oluşturarak bunu:Openlayers-3 Raster Layer Kaynaklar değiştiğinde değişmiyor

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

Sonraki, onları oluşturabilirsiniz hangi bir tarama kaynağına giriş olarak bu kaynakları kullanın:

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

Sonra kullanan bir katman oluşturun kaynak olarak bu raster:

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

Son olarak, bir harita oluşturmak ve haritaya benim raster katmanı ekleyebilirsiniz:

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

Şimdiye kadar çok iyi! Bu, görüntünün renklendirilmiş halini beklendiği gibi görüntüler. Sorun, kullanıcı çekilecek yeni bir kanal indeksi girerek bir renk kanalında bir değişikliği tetiklediğinde ortaya çıkar. Mavi bir kanal değişikliği böyle idare:

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 

Beklenen davranış haritası derhal renklerini değiştirmek olacağını, ya da ben ya da tavada yakınlaştırmak ancak Bunlardan hiçbiri gerçekleştiğinde en azından o değişirdi. Yeni renklerin görünmesini sağlayamıyorum. Yanlış şeyi mi güncelliyorum? Belki de raster.sources alanının, bulamadığım ilişkili bir işlev işlevi var mı?

cevap

1

Bir çözüm bulundu! Raster'in kaynağının doğrudan ayarlanmasına izin verilmemesi gibi görünüyor, ancak bir katmanın kaynağı ayarlanıyor. Yani ne yazık ki, yeni bir raster nesnesi (tamamen yeni kaynak) oluşturmak zorunda, ama en azından yeni bir katman gerek yoktur: Kendi cevabı kabul etmek

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

ancak anlamına geliyorsa başkasının çözümü kabul etmeye istekli Yeni bir kaynak oluşturmam gerekmiyor.