Принудительно отображать слой ImageCanvas в OL3?

У меня есть слой изображения, в котором используется источник ImageCanvas. Мне нужно динамически изменять вещи на этой поверхности холста и изменять их на слое, но если я не изменю резко экстент, скажем, путем масштабирования, слой игнорирует любые изменения, которые я сделал на холсте.

Есть ли способ заставить данный слой рендериться? Я попробовал map.render(), который работает в одних контекстах, но не работает в других.

MapScholar.prototype.CreateCanvasLayer = function()                     
{        
    this.canvasLayer = new ol.layer.Image( {                                    
        source: new ol.source.ImageCanvas( {                                
            canvasFunction: function(extent, res, pixelRatio, size, proj) { 
                if (!this.canvas)                                       
                    this.canvas=document.createElement('canvas');       
                this.canvas.setAttribute('width', size[0]);             
                this.canvas.setAttribute('height', size[1]);            
                return this.canvas;                                     
                } 
            })
        });
    map.addLayer(this.canvasLayer);                                         
}

person Bill    schedule 30.11.2014    source источник


Ответы (1)


Вы можете указать, что что-то изменилось в источнике, вызвав changed для этого источника. В твоем случае:

this.canvasLayer.getSource().changed();

Вызов changed в основном делает недействительным текущий холст в источнике ImageCanvas и вызывает событие change, которое приведет к повторному рендерингу карты.

Обратите внимание, что функция changed не помечена как «стабильная», поэтому в будущем она может измениться. Вы должны снять флажок «Только стабильная» в документе API, чтобы увидеть эту функцию. Вот прямая ссылка: http://openlayers.org/en/master/apidoc/ol.Observable.html?unstable=true.

РЕДАКТИРОВАТЬ: функция changed имеет имя dispatchChangeEvent в версии v3.0.0. Это changed в главной ветке.

person erilem    schedule 30.11.2014
comment
Я добавил this.canvasLayer.getSource().dispatchChangeEvent(), используя версию выпуска ol-debug.js, и он скрывает слой при вызове. - person Bill; 30.11.2014
comment
Извините, что это не так. Он скрывает слой, а не показывает его. Любые другие идеи? - person Bill; 30.11.2014
comment
Я должен был увидеть это в примере. - person erilem; 30.11.2014
comment
но, возможно, ему нужна самая последняя сборка. Ненавижу задавать глупый вопрос, но есть ли ссылка на это где-нибудь? - person Bill; 30.11.2014
comment
ХОРОШО. Я работаю над подмножеством кода и опубликую его как новую проблему, - person Bill; 01.12.2014