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;