c8y-openlayer
Version:
This module is designed to help integrate Openlayer with Cumulocity IoT
237 lines (198 loc) • 6.41 kB
JavaScript
import _ol_ from '../index.js';
import _ol_Collection_ from '../collection.js';
import _ol_CollectionEventType_ from '../collectioneventtype.js';
import _ol_Object_ from '../object.js';
import _ol_ObjectEventType_ from '../objecteventtype.js';
import _ol_asserts_ from '../asserts.js';
import _ol_events_ from '../events.js';
import _ol_events_EventType_ from '../events/eventtype.js';
import _ol_extent_ from '../extent.js';
import _ol_layer_Base_ from '../layer/base.js';
import _ol_obj_ from '../obj.js';
import _ol_source_State_ from '../source/state.js';
/**
* @classdesc
* A {@link ol.Collection} of layers that are handled together.
*
* A generic `change` event is triggered when the group/Collection changes.
*
* @constructor
* @extends {ol.layer.Base}
* @param {olx.layer.GroupOptions=} opt_options Layer options.
* @api
*/
var _ol_layer_Group_ = function(opt_options) {
var options = opt_options || {};
var baseOptions = /** @type {olx.layer.GroupOptions} */
(_ol_obj_.assign({}, options));
delete baseOptions.layers;
var layers = options.layers;
_ol_layer_Base_.call(this, baseOptions);
/**
* @private
* @type {Array.<ol.EventsKey>}
*/
this.layersListenerKeys_ = [];
/**
* @private
* @type {Object.<string, Array.<ol.EventsKey>>}
*/
this.listenerKeys_ = {};
_ol_events_.listen(this,
_ol_Object_.getChangeEventType(_ol_layer_Group_.Property_.LAYERS),
this.handleLayersChanged_, this);
if (layers) {
if (Array.isArray(layers)) {
layers = new _ol_Collection_(layers.slice(), {unique: true});
} else {
_ol_asserts_.assert(layers instanceof _ol_Collection_,
43); // Expected `layers` to be an array or an `ol.Collection`
layers = layers;
}
} else {
layers = new _ol_Collection_(undefined, {unique: true});
}
this.setLayers(layers);
};
_ol_.inherits(_ol_layer_Group_, _ol_layer_Base_);
/**
* @private
*/
_ol_layer_Group_.prototype.handleLayerChange_ = function() {
this.changed();
};
/**
* @param {ol.events.Event} event Event.
* @private
*/
_ol_layer_Group_.prototype.handleLayersChanged_ = function(event) {
this.layersListenerKeys_.forEach(_ol_events_.unlistenByKey);
this.layersListenerKeys_.length = 0;
var layers = this.getLayers();
this.layersListenerKeys_.push(
_ol_events_.listen(layers, _ol_CollectionEventType_.ADD,
this.handleLayersAdd_, this),
_ol_events_.listen(layers, _ol_CollectionEventType_.REMOVE,
this.handleLayersRemove_, this));
for (var id in this.listenerKeys_) {
this.listenerKeys_[id].forEach(_ol_events_.unlistenByKey);
}
_ol_obj_.clear(this.listenerKeys_);
var layersArray = layers.getArray();
var i, ii, layer;
for (i = 0, ii = layersArray.length; i < ii; i++) {
layer = layersArray[i];
this.listenerKeys_[_ol_.getUid(layer).toString()] = [
_ol_events_.listen(layer, _ol_ObjectEventType_.PROPERTYCHANGE,
this.handleLayerChange_, this),
_ol_events_.listen(layer, _ol_events_EventType_.CHANGE,
this.handleLayerChange_, this)
];
}
this.changed();
};
/**
* @param {ol.Collection.Event} collectionEvent Collection event.
* @private
*/
_ol_layer_Group_.prototype.handleLayersAdd_ = function(collectionEvent) {
var layer = /** @type {ol.layer.Base} */ (collectionEvent.element);
var key = _ol_.getUid(layer).toString();
this.listenerKeys_[key] = [
_ol_events_.listen(layer, _ol_ObjectEventType_.PROPERTYCHANGE,
this.handleLayerChange_, this),
_ol_events_.listen(layer, _ol_events_EventType_.CHANGE,
this.handleLayerChange_, this)
];
this.changed();
};
/**
* @param {ol.Collection.Event} collectionEvent Collection event.
* @private
*/
_ol_layer_Group_.prototype.handleLayersRemove_ = function(collectionEvent) {
var layer = /** @type {ol.layer.Base} */ (collectionEvent.element);
var key = _ol_.getUid(layer).toString();
this.listenerKeys_[key].forEach(_ol_events_.unlistenByKey);
delete this.listenerKeys_[key];
this.changed();
};
/**
* Returns the {@link ol.Collection collection} of {@link ol.layer.Layer layers}
* in this group.
* @return {!ol.Collection.<ol.layer.Base>} Collection of
* {@link ol.layer.Base layers} that are part of this group.
* @observable
* @api
*/
_ol_layer_Group_.prototype.getLayers = function() {
return (
/** @type {!ol.Collection.<ol.layer.Base>} */ this.get(
_ol_layer_Group_.Property_.LAYERS)
);
};
/**
* Set the {@link ol.Collection collection} of {@link ol.layer.Layer layers}
* in this group.
* @param {!ol.Collection.<ol.layer.Base>} layers Collection of
* {@link ol.layer.Base layers} that are part of this group.
* @observable
* @api
*/
_ol_layer_Group_.prototype.setLayers = function(layers) {
this.set(_ol_layer_Group_.Property_.LAYERS, layers);
};
/**
* @inheritDoc
*/
_ol_layer_Group_.prototype.getLayersArray = function(opt_array) {
var array = opt_array !== undefined ? opt_array : [];
this.getLayers().forEach(function(layer) {
layer.getLayersArray(array);
});
return array;
};
/**
* @inheritDoc
*/
_ol_layer_Group_.prototype.getLayerStatesArray = function(opt_states) {
var states = opt_states !== undefined ? opt_states : [];
var pos = states.length;
this.getLayers().forEach(function(layer) {
layer.getLayerStatesArray(states);
});
var ownLayerState = this.getLayerState();
var i, ii, layerState;
for (i = pos, ii = states.length; i < ii; i++) {
layerState = states[i];
layerState.opacity *= ownLayerState.opacity;
layerState.visible = layerState.visible && ownLayerState.visible;
layerState.maxResolution = Math.min(
layerState.maxResolution, ownLayerState.maxResolution);
layerState.minResolution = Math.max(
layerState.minResolution, ownLayerState.minResolution);
if (ownLayerState.extent !== undefined) {
if (layerState.extent !== undefined) {
layerState.extent = _ol_extent_.getIntersection(
layerState.extent, ownLayerState.extent);
} else {
layerState.extent = ownLayerState.extent;
}
}
}
return states;
};
/**
* @inheritDoc
*/
_ol_layer_Group_.prototype.getSourceState = function() {
return _ol_source_State_.READY;
};
/**
* @enum {string}
* @private
*/
_ol_layer_Group_.Property_ = {
LAYERS: 'layers'
};
export default _ol_layer_Group_;