2016-04-12 5 views
2

Mein Server bedient statisch mehrere verschiedene PNG-Bilder des gleichen Objekts, die jeweils mit einem anderen Spektralfilter aufgenommen wurden (z. B. nur ein roter Kanal oder nur ein blauer Kanal). Ich möchte eine rutschige, falsch gefärbte Karte dieses Objekts zeigen. I tun, indem drei getrennte Bilder Quellen Schaffung etwa so:Openlayers-3 Rasterlayer ändert sich nicht, wenn Quellen geändert werden

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

nächste verwende ich diese Quellen als Eingänge in eine Rasterquelle, die sie zusammensetzen kann:

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

I dann eine Schicht erzeugen, die verwendet dieses Raster als Quelle:

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

Schließlich kann ich eine Karte erstellen und meine Rasterebene auf der Karte hinzufügen:

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

So weit so gut! Dies zeigt eine eingefärbte Version des Bildes wie erwartet an. Das Problem tritt auf, wenn der Benutzer eine Änderung an einem Farbkanal auslöst, indem er einen neuen Kanalindex eingibt, um davon abzuziehen. Ich kümmere mich um einen blauen Kanalwechsel wie folgt aus:

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 

erwartete Verhalten ist, dass die Karte würde sofort die Farben ändern, oder zumindest würde es ändern, wenn ich in oder in der Pfanne heran aber keines dieser Dinge passiert. Ich kann die neuen Farben überhaupt nicht erscheinen lassen. Aktualisiere ich das falsche Ding? Vielleicht hat das Feld raster.sources eine Setter-Funktion, die ich nicht finden kann?

Antwort

1

Eine Lösung gefunden! Es sieht so aus, als wäre es nicht erlaubt, die Quelle eines Rasters direkt zu setzen, sondern die Quelle eines Layers zu setzen. Also leider muß ich (neue Quelle vollständig) ein neues Raster-Objekt erstellen, aber zumindest ich nicht brauche eine neue Ebene:

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

meine eigene Antwort zu akzeptieren, aber bereit, jemand andere Lösung zu akzeptieren, wenn es bedeutet, Ich muss keine neue Quelle erstellen.