Allow layers that are not managed by the map
When a layer is configured with a map, it will be added on top of other layers, and not be managed in the map's features collection. The layerState will have an 'unmanaged' flag for such layers. For vector layers, this flag is used to not skip any features.
This commit is contained in:
@@ -6,6 +6,7 @@ goog.require('goog.object');
|
||||
goog.require('ol.Object');
|
||||
goog.require('ol.layer.Base');
|
||||
goog.require('ol.layer.LayerProperty');
|
||||
goog.require('ol.render.EventType');
|
||||
goog.require('ol.source.State');
|
||||
|
||||
|
||||
@@ -32,12 +33,28 @@ ol.layer.Layer = function(options) {
|
||||
|
||||
goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions));
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {goog.events.Key}
|
||||
*/
|
||||
this.mapPrecomposeKey_ = null;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {goog.events.Key}
|
||||
*/
|
||||
this.mapRenderKey_ = null;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {goog.events.Key}
|
||||
*/
|
||||
this.sourceChangeKey_ = null;
|
||||
|
||||
if (goog.isDef(options.map)) {
|
||||
this.setMap(options.map);
|
||||
}
|
||||
|
||||
goog.events.listen(this,
|
||||
ol.Object.getChangeEventType(ol.layer.LayerProperty.SOURCE),
|
||||
this.handleSourcePropertyChange_, false, this);
|
||||
@@ -129,6 +146,32 @@ ol.layer.Layer.prototype.handleSourcePropertyChange_ = function() {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Sets the layer to be rendered on a map. The map will not manage this layer in
|
||||
* its layers collection, and the layer will be rendered on top. This is useful
|
||||
* for temporary layers. To add the layer to a map and have it managed by the
|
||||
* map, use {@link ol.Map#addLayer} instead.
|
||||
* @param {ol.Map} map Map.
|
||||
* @api
|
||||
*/
|
||||
ol.layer.Layer.prototype.setMap = function(map) {
|
||||
goog.events.unlistenByKey(this.mapPrecomposeKey_);
|
||||
this.changed();
|
||||
goog.events.unlistenByKey(this.mapRenderKey_);
|
||||
if (!goog.isNull(map)) {
|
||||
this.mapPrecomposeKey_ = goog.events.listen(
|
||||
map, ol.render.EventType.PRECOMPOSE, function(evt) {
|
||||
var layerState = this.getLayerState();
|
||||
layerState.unmanaged = true;
|
||||
evt.frameState.layerStatesArray.push(layerState);
|
||||
evt.frameState.layerStates[goog.getUid(this)] = layerState;
|
||||
}, false, this);
|
||||
this.mapRenderKey_ = goog.events.listen(
|
||||
this, goog.events.EventType.CHANGE, map.render, false, map);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Set the layer source.
|
||||
* @param {ol.source.Source} source The layer source.
|
||||
|
||||
@@ -79,7 +79,8 @@ ol.renderer.canvas.VectorLayer.prototype.composeFrame =
|
||||
var extent = frameState.extent;
|
||||
var focus = frameState.focus;
|
||||
var pixelRatio = frameState.pixelRatio;
|
||||
var skippedFeatureUids = frameState.skippedFeatureUids;
|
||||
var skippedFeatureUids = layerState.unmanaged ?
|
||||
{} : frameState.skippedFeatureUids;
|
||||
var viewState = frameState.viewState;
|
||||
var projection = viewState.projection;
|
||||
var rotation = viewState.rotation;
|
||||
|
||||
@@ -142,7 +142,7 @@ ol.renderer.dom.VectorLayer.prototype.composeFrame =
|
||||
|
||||
context.globalAlpha = layerState.opacity;
|
||||
replayGroup.replay(context, pixelRatio, transform, viewRotation,
|
||||
frameState.skippedFeatureUids);
|
||||
layerState.unmanaged ? {} : frameState.skippedFeatureUids);
|
||||
|
||||
this.dispatchEvent_(ol.render.EventType.RENDER, frameState, transform);
|
||||
}
|
||||
|
||||
@@ -83,7 +83,8 @@ ol.renderer.webgl.VectorLayer.prototype.composeFrame =
|
||||
viewState.center, viewState.resolution, viewState.rotation,
|
||||
frameState.size, frameState.pixelRatio, layerState.opacity,
|
||||
layerState.brightness, layerState.contrast, layerState.hue,
|
||||
layerState.saturation, frameState.skippedFeatureUids);
|
||||
layerState.saturation,
|
||||
layerState.unmanaged ? {} : frameState.skippedFeatureUids);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user