goog.provide('M.layer.Vector'); goog.require('M.Layer'); goog.require('M.utils'); goog.require('M.exception'); (function() { /** * @classdesc * Main constructor of the class. Creates a Vector layer * with parameters specified by the user * * @constructor * @extends {M.Layer} * @param {Mx.parameters.Layer} userParameters - parameters * @param {Mx.parameters.LayerOptions} options - custom options for this layer * @api stable */ M.layer.Vector = (function(parameters = {}, options = {}, impl = new M.impl.layer.Vector(options)) { // checks if the implementation can create Vector if (M.utils.isUndefined(M.impl.layer.Vector)) { M.exception('La implementación usada no puede crear capas Vector'); } /** * TODO */ this.style_ = null; /** * Filter * @private * @type {M.Filter} */ this.filter_ = null; // calls the super constructor goog.base(this, parameters, impl); this.style_ = options.style; this.setStyle(this.style_); impl.on(M.evt.LOAD, (features) => this.fire(M.evt.LOAD, [features])); }); goog.inherits(M.layer.Vector, M.Layer); /** * This function add features to layer * * @function * @public * @param {Array<M.feature>} features - Features to add * @api stable */ M.layer.Vector.prototype.addFeatures = function(features, update = false) { if (!M.utils.isNullOrEmpty(features)) { if (!M.utils.isArray(features)) { features = [features]; } this.getImpl().addFeatures(features, update); } }; /** * This function returns all features or discriminating by the filter * * @function * @public * @param {boolean} applyFilter - Indicates whether execute filter * @return {Array<M.Feature>} returns all features or discriminating by the filter * @api stable */ M.layer.Vector.prototype.getFeatures = function(skipFilter) { if (M.utils.isNullOrEmpty(this.getFilter())) skipFilter = true; return this.getImpl().getFeatures(skipFilter, this.filter_); }; /** * This function returns the feature with this id * @function * @public * @param {string|number} id - Id feature * @return {null|M.feature} feature - Returns the feature with that id if it is found, in case it is not found or does not indicate the id returns null * @api stable */ M.layer.Vector.prototype.getFeatureById = function(id) { let feature = null; if (!M.utils.isNullOrEmpty(id)) { feature = this.getImpl().getFeatureById(id); } else { M.dialog.error("No se ha indicado un ID para obtener el feature"); } return feature; }; /** * This function remove the features indicated * * @function * @public * @param {Array<M.feature>} features - Features to remove * @api stable */ M.layer.Vector.prototype.removeFeatures = function(features) { if (!M.utils.isArray(features)) { features = [features]; } this.getImpl().removeFeatures(features); }; /** * This function remove all features * * @function * @public * @api stable */ M.layer.Vector.prototype.clear = function() { this.removeFilter(); this.removeFeatures(this.getFeatures(true)); }; /** * This function refresh layer * * @function * @public * @api stable */ M.layer.Vector.prototype.refresh = function() { this.getImpl().refresh(true); }; /** * This function redraw layer * * @function * @public * @api stable */ M.layer.Vector.prototype.redraw = function() { this.getImpl().redraw(); if (!M.utils.isNullOrEmpty(this.getStyle())) { let style = this.getStyle(); if (!(style instanceof M.style.Cluster)) { style.refresh(); } else { if (style.getOldStyle() instanceof M.Style) { style.getOldStyle().refresh(); } } } }; /** * This function set a filter * * @function * @public * @param {M.Filter} filter - filter to set * @api stable */ M.layer.Vector.prototype.setFilter = function(filter) { if (M.utils.isNullOrEmpty(filter) || (filter instanceof M.Filter)) { this.filter_ = filter; let style = this.getStyle(); if (style instanceof M.style.Cluster) { style.getImpl().deactivateTemporarilyChangeEvent(this.redraw.bind(this)); style.refresh(); } else { this.redraw(); } } else { M.dialog.error("El filtro indicado no es correcto"); } }; /** * This function return filter * * @function * @public * @return {M.Filter} returns filter assigned * @api stable */ M.layer.Vector.prototype.getFilter = function() { return this.filter_; }; /** * This function return extent of all features or discriminating by the filter * * @function * @param {boolean} applyFilter - Indicates whether execute filter * @return {Array<number>} Extent of features * @api stable */ M.layer.Vector.prototype.getFeaturesExtent = function(skipFilter) { if (M.utils.isNullOrEmpty(this.getFilter())) skipFilter = true; return this.getImpl().getFeaturesExtent(skipFilter, this.filter_); }; /** * This function remove filter * * @function * @public * @api stable */ M.layer.Vector.prototype.removeFilter = function() { this.setFilter(null); }; /** * This function checks if an object is equals * to this layer * * @function * @public * @param {object} obj - Object to compare * @api stable */ M.layer.Vector.prototype.equals = function(obj) { var equals = false; if (obj instanceof M.layer.Vector) { equals = this.name === obj.name; } return equals; }; /** * TODO */ M.layer.Vector.prototype.setStyle = function(style, applyToFeature = false) { let isCluster = style instanceof M.style.Cluster; let isPoint = [M.geom.geojson.type.POINT, M.geom.geojson.type.MULTI_POINT].includes(M.utils.getGeometryType(this)); if (style instanceof M.Style && (!isCluster || isPoint)) { if (!M.utils.isNullOrEmpty(this.style_)) { this.style_.unapply(this); } style.apply(this, applyToFeature); this.style_ = style; } }; /** * This function return style vector * * TODO * @api stable */ M.layer.Vector.prototype.getStyle = function() { return this.style_; }; /** * This function checks if an object is equals * to this layer * * @function * @api stable */ M.layer.Vector.prototype.getLegendURL = function() { let legendUrl = this.getImpl().getLegendURL(); if (legendUrl.indexOf(M.Layer.LEGEND_DEFAULT) !== -1 && legendUrl.indexOf(M.Layer.LEGEND_ERROR) === -1 && !M.utils.isNullOrEmpty(this.style_)) { legendUrl = this.style_.toImage(); } return legendUrl; }; })();