Source: layers/layer.js

let VectorLayer = require('./vector');
let HeatLayer = require('./heat');
let GroupLayer = require('./group');
let TiledLayer = require('./tiled');
let VectorTiledLayer = require('./vectorTiled');
let GraphicLayer = require('./graphic');

/**
 * @class LayerFabric
 * @param {object} params - Объект, содержащий опции для создания слоя
 * @param {string} params.layerType - Тип слоя, возможные значения vector, tiled, group, vectorTiled, graphic
 * @param {string} params.id - Идентификатор слоя
 * @param {string} params.url - URL источника слоя
 * @param {array} params.subDomains - массив поддоментов (например, ["a", "b", "c"], используемый для уменьшения блокировки запросов в браузере (см. лимит на число одновременно устанавливаемых соединений)
 * @param {string} params.alias - Псевдоним (человекочитаемое) имя слоя
 * @param {string} params.dataSourceType - Тип источника данных (vector, esri), значение по умолчанию - vector
 * @param {string} params.className - Имя класса данных, которое применяется для источников с типом wfs (geoserver, etc...)
 * @param {string} params.options - Прочие свойства для создания слоя типа ol.Layer
 * @param {number} params.maxResolution - Максимальный масштаб видимости объектов слоя
 * @param {number} params.opacity - Базовая прозначность слоя
 * @param {number} params.index - Порядок в группе слоев
 * @param {string} params.author - Создатель (автор) слоя
 * @param {date} params.editingDate - Дата изменения слоя
 * @return {object} LayerInstance - Экземпляр слоя конкретного класса
 */
function LayerFabric(params) {
    const layerConstructorDictionary = {
        "vector": VectorLayer,
        "tiled": TiledLayer,
        "group": GroupLayer,
        "graphic": GraphicLayer,
        "vectorTiled": VectorTiledLayer,
        "heat": HeatLayer
    };
    let layerType = params.typeLayer;
    let commonLayerConfig = Object.assign({}, params);
    commonLayerConfig.id = params.GUID || params.id;
    commonLayerConfig.alias = params.title || params.alias;
    commonLayerConfig.typeLayer = params.typeLayer;
    commonLayerConfig.dataSourceType = params.dataSourceType;
    commonLayerConfig.className = params.className;
    commonLayerConfig.options = params.options;
    commonLayerConfig.minResolution = params.minResolution || 0;
    commonLayerConfig.maxResolution = params.maxResolution || 500;
    commonLayerConfig.opacity = params.opacity || 1;
    commonLayerConfig.visible = params.visible || true;
    commonLayerConfig.parent = params.parent;
    commonLayerConfig.index = params.index;
    commonLayerConfig.author = params.author;
    commonLayerConfig.editingDate = params.editingDate;
    commonLayerConfig.url = params.url;
    commonLayerConfig.subDomains = params.subDomains;
    commonLayerConfig.updateWhileAnimating = params.updateWhileAnimating || false;
    commonLayerConfig.updateWhileInteracting = params.updateWhileInteracting || false;
    commonLayerConfig.geometryType = params.geometryType || "anyGeometryType";
    commonLayerConfig.displayField = params.displayField || "aliasName";
    let layerConstructor = layerConstructorDictionary[layerType];
    return new layerConstructor(commonLayerConfig);
}

/**
 * @description Метод LayerFabric - обобщенная фабрика классов, обеспечивающая создание экземпляра слоя нужного класса через использование родных параметров класса (идентичных), отличающихся только типом слоя
 * @type {LayerFabric}
 * @return {LayerFabric}
 */
module.exports = LayerFabric;