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?