goog.provide('M.layer.GeoJSON'); goog.require('M.layer.Vector'); goog.require('M.utils'); goog.require('M.exception'); (function() { /** * @classdesc * Main constructor of the class. Creates a WMS layer * with parameters specified by the user * * @constructor * @extends {M.layer.Vector} * @param {string|Mx.parameters.GeoJSON} userParameters parameters * @param {Mx.parameters.LayerOptions} options provided by the user * @api stable */ M.layer.GeoJSON = (function(parameters, options = {}) { // checks if the implementation can create KML layers if (M.utils.isUndefined(M.impl.layer.GeoJSON)) { M.exception('La implementación usada no puede crear capas GeoJSON'); } // checks if the param is null or empty if (M.utils.isNullOrEmpty(parameters)) { M.exception('No ha especificado ningún parámetro'); } /** * Implementation of this layer * @public * @type {M.impl.layer.GeoJSON} */ var impl = new M.impl.layer.GeoJSON(parameters, options); // calls the super constructor goog.base(this, this, options, impl); if (M.utils.isString(parameters)) { this.url = parameters; } else if (M.utils.isArray(parameters)) { this.source = parameters; } else { // url this.url = parameters.url; // name this.name = parameters.name; // source this.source = parameters.source; // extract this.extract = parameters.extract; //crs if (!M.utils.isNullOrEmpty(parameters.crs)) { if (M.utils.isNullOrEmpty(this.source)) { this.source = { "type": "FeatureCollection", "features": [] }; } this.source['crs'] = { "type": "EPSG", "properties": { "code": parameters.crs } }; } } if (M.utils.isNullOrEmpty(this.extract)) { this.extract = true; // by default } // options this.options = options; }); goog.inherits(M.layer.GeoJSON, M.layer.Vector); /** * 'type' This property indicates if * the layer was selected */ Object.defineProperty(M.layer.GeoJSON.prototype, "type", { get: function() { return M.layer.type.GeoJSON; }, // defining new type is not allowed set: function(newType) { if (!M.utils.isUndefined(newType) && !M.utils.isNullOrEmpty(newType) && (newType !== M.layer.type.GeoJSON)) { M.exception('El tipo de capa debe ser \''.concat(M.layer.type.GeoJSON).concat('\' pero se ha especificado \'').concat(newType).concat('\'')); } } }); /** * 'extract' the features properties */ Object.defineProperty(M.layer.GeoJSON.prototype, "source", { get: function() { return this.getImpl().source; }, // defining new type is not allowed set: function(newSource) { this.getImpl().source = newSource; } }); /** * 'extract' the features properties */ Object.defineProperty(M.layer.GeoJSON.prototype, "extract", { get: function() { return this.getImpl().extract; }, // defining new type is not allowed set: function(newExtract) { if (!M.utils.isNullOrEmpty(newExtract)) { if (M.utils.isString(newExtract)) { this.getImpl().extract = (M.utils.normalize(newExtract) === 'true'); } else { this.getImpl().extract = newExtract; } } else { this.getImpl().extract = true; } } }); /** * This function checks if an object is equals * to this layer * * @function * @api stable */ M.layer.GeoJSON.prototype.equals = function(obj) { var equals = false; if (obj instanceof M.layer.GeoJSON) { equals = this.name === obj.name; equals = equals && (this.extract === obj.extract); } return equals; }; /** * This function checks if an object is equals * to this layer * * @function * @api stable */ M.layer.GeoJSON.prototype.setSource = function(source) { this.source = source; this.getImpl().setSource(source); }; M.layer.GeoJSON.prototype.setStyle = function(style, applyToFeature = false) { const applyStyleFn = function() { if (M.utils.isNullOrEmpty(style)) { style = M.utils.generateStyleLayer(M.layer.GeoJSON.DEFAULT_OPTIONS_STYLE, this); } 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; } }; if (this.getImpl().isLoaded()) { applyStyleFn.bind(this)(); } else { this.once(M.evt.LOAD, applyStyleFn, this); } }; /** * Template for this controls * @const * @type {string} * @public * @api stable */ M.layer.GeoJSON.POPUP_TEMPLATE = 'geojson_popup.html'; /** * Options style by default * @const * @type {object} * @public * @api stable */ M.layer.GeoJSON.DEFAULT_OPTIONS_STYLE = { fill: { color: 'rgba(255, 255, 255, 0.4)', opacity: 0.4 }, stroke: { color: "#3399CC", width: 1.5 }, radius: 5, }; })();