Source: symbols/symbolFabric.js

let ol = require('openlayers');
let customSymbols = require('./custom/index');

/**
 * Возвращает символ заливки
 * @param {object} params - конфигурация символа
 * @param params.color {string} - RGBA или HEX представление цвета
 * @return {*}
 */
function createFillStyle(params) {
  return params ? new ol.style.Fill(params) : undefined;
}

/**
 * Возвращает символ линии
 * @param {object} params - конфигурация символа
 * @param params.width {number} - толщина
 * @param params.color {string} - цвет
 * @param params.lineCap {string} - тип излома
 * @param params.lineJoin {string} - тип соединения
 * @param params.lineDash {array} - шриховка
 * @param params.lineDashOffset {number} - отступ штриховки
 * @return {*}
 */
function createStrokeStyle(params) {
  return params ? new ol.style.Stroke(params) : undefined;
}

/**
 * Возвращает символ фигуры
 * @param params
 * @return {*}
 */
function createImageStyle(params) {
  return params ? new ol.style.Circle({
      fill: createFillStyle(params.fill),
      stroke: createStrokeStyle(params.stroke),
      radius: params.radius || 5
    })
    :
    undefined;
}

/**
 * Возвращает символ иконки
 * @param params
 * @return {*}
 */
function createIconStyle(params) {
  return params ? new ol.style.Icon(params) : undefined;
}

/**
 * Возвращает символ текста
 * @param params
 * @param feature
 * @return {undefined}
 */
function createTextStyle(params, feature) {
  let flag = params && params.label && feature;
  let style = undefined;
  if (flag) {
    try {
      style = new ol.style.Text({
        text: feature.get(params.label.field) || params.label.text || "",
        offsetX: params.label.offsetX || 0,
        font: params.label.font || "10px sans-serif",
        offsetY: params.label.offsetY || 0,
        scale: params.label.scale || 1,
        rotateWithView: params.label.rotateWithView || true,
        rotation: feature.get(params.label.rotationField) || 0,
        textAlign: params.label.textAlign || 'right',
        textBaseline: params.label.textBaseline || 'alphabetic',
        fill: createFillStyle(params.label.fill),
        stroke: createStrokeStyle(params.label.style)
      });
    }
    catch (e) {

    }
  }
  return style;
}

function createDiagramStyle(params, feature) {
  let flag = params && feature;
  let style = undefined;
  if (flag) {
    try {
      style = new ol.style.Style({
        image: new customSymbols.diagram(params, feature)
      });
    }
    catch (e) {

    }
  }
  return style;
}

/**
 * Фабрика символов, позволяющая получить объект части стиля в зависимости от выбранного типа и входных параметров
 * @return {{fill: createFillStyle, stroke: createStrokeStyle, image: createImageStyle, text: createTextStyle}}
 */
function SymbolFabric() {
  const fabricDict = {
    "fill": createFillStyle,
    "stroke": createStrokeStyle,
    "image": createImageStyle,
    "text": createTextStyle,
    "icon": createIconStyle,
    "diagram": createDiagramStyle
  };
  return fabricDict;
}

module.exports = SymbolFabric;