service/base/renderer/UniqueValueRenderer.js Source
import { mapgis } from '../common/base';
import { cloneDeep } from 'lodash';
import { Renderer } from './Renderer';

import { PointSymbol3D, PolygonSymbol3D, LineSymbol3D } from "../symbols/index";

/**
 * 三维专题图-单值专题图
 * @class mapgis.renderer.UniqueValueRenderer
 * @classdesc 三维专题图-单值专题图
 * @param {String} [type] 专题图类型,只能是'unique-value'
 * @param {String} [field] 专题图字段名称,用来确定分段要素
 * @param {String} [field2] 专题图字段名称,用来确定分段要素
 * @param {String} [field3] 专题图字段名称,用来确定分段要素
 * @param {Symbol} [defaultSymbol] 专题图默认符号样式,用来绘制具有与给定单值不匹配的要素
 * @param {String} [defaultLabel] 专题图图例标签,用来描述分配了默认符号的元素
 * @param {Array<UniqueValueInfo>} [uniqueValueInfos] 专题图单值信息
 * @param {Array<VisualVariable>} [visualVariables] 专题图视觉变量,可选 "color"|"opacity"|"size"|"rotation"
 * @param {PolygonSymbol3D} [backgroundFillSymbol] 专题图边界变量,使用分级符号对面要素进行符号化时,在此属性上设置以可视化每个要素的边界
 * @param {String} [fieldDelimiter] 专题图字段分隔符,如果指定了多个属性字段,则在值之间插入字符串
 * @param {Object} [legendOptions] 专题图图例选项,用来在图例中展示符号信息
 * @param {String} [valueExpression] 专题图计算表达式,用来对要素中的单/多个属性进行数学计算
 * @param {String} [valueExpressionTitle] 专题图计算表达式标题,在legendOptions属性中没有提供的情况下,将显示为图例中的标题
 */
export default class UniqueValueRenderer extends Renderer {
  constructor(option) {
    super(option);
    var options = option ? option : {};
    const { type = "unique-value" } = options;
    this.type = type;
    const { field, field2, field3, defaultSymbol, defaultLabel, uniqueValueInfos, visualVariables, backgroundFillSymbol, fieldDelimiter, legendOptions, valueExpression, valueExpressionTitle } = options;
    this.field = field;
    this.field2 = field2;
    this.field3 = field3;
    this.defaultSymbol = defaultSymbol;
    this.defaultLabel = defaultLabel;
    this.uniqueValueInfos = uniqueValueInfos;
    this.visualVariables = visualVariables;
    this.backgroundFillSymbol = backgroundFillSymbol;
    this.fieldDelimiter = fieldDelimiter;
    this.legendOptions = legendOptions;
    this.valueExpression = valueExpression;
    this.valueExpressionTitle = valueExpressionTitle;
  }

  /**
  * @description 克隆函数
  */
   clone() {
    return cloneDeep(this);
  }

  /**
  * @description 将JSON格式的渲染规则转换为JS对象
  * @param {Object} json 渲染规则的实例化JSON
  */
   fromJSON(json) {
    json = json || {};
    const { type = "unique-value" } = json;
    this.type = type;
    const { field, field2, field3, defaultSymbol, defaultLabel, uniqueValueInfos, visualVariables, backgroundFillSymbol, fieldDelimiter, legendOptions, valueExpression, valueExpressionTitle } = json;
    this.field = field;
    this.field2 = field2;
    this.field3 = field3;
    this.defaultSymbol = defaultSymbol;
    this.defaultLabel = defaultLabel;
    this.uniqueValueInfos = uniqueValueInfos;
    this.visualVariables = visualVariables;
    this.backgroundFillSymbol = backgroundFillSymbol;
    this.fieldDelimiter = fieldDelimiter;
    this.legendOptions = legendOptions;
    this.valueExpression = valueExpression;
    this.valueExpressionTitle = valueExpressionTitle;
  }

  /**
  * 将JS对象转换为JSON格式
  * @returns {Object} 渲染规则的实例化JSON
  */
  toJSON() {
    return {
      type: this.type,
      field: this.field,
      field2: this.field2,
      field3: this.field3,
      defaultSymbol: this.defaultSymbol,
      defaultLabel: this.defaultLabel,
      uniqueValueInfos: this.uniqueValueInfos,
      visualVariables: this.visualVariables,
      backgroundFillSymbol: this.backgroundFillSymbol,
      fieldDelimiter: this.fieldDelimiter,
      legendOptions: this.legendOptions,
      valueExpression: this.valueExpression,
      valueExpressionTitle: this.valueExpressionTitle,
    };
  }

  /**
  * @description 添加单值信息
  * @param {Object} info 单值信息的实例化对象
  */
  addUniqueValueInfo(info) {
    info = info || {};
    this.uniqueValueInfos.push(info);
  }

  /**
  * @description 获取单值信息
  * @param {Object} info 单值信息的实例化对象
  * @returns {Object} 根据info查询到的单值信息
  */
  getUniqueValueInfo(info) {
    info = info || {};
    const { value, symbol, label } = info;
    for(let i = 0; i < this.uniqueValueInfos.length; i++) {
      let item = this.uniqueValueInfos[i];
      if (item.value == value) {
        return item;
      }
    }
  }

  /**
  * @description 移除单值信息
  * @param {Object} json 渲染规则的实例化JSON
  */
  removeUniqueValueInfo(info) {
    info = info || {};
    const { value, symbol, label } = info;
    for(let i = 0; i < this.uniqueValueInfos.length; i++) {
      let item = this.uniqueValueInfos[i];
      if (item.value == value) {
        this.uniqueValueInfos.splice(i, 1);
      }
    }
  }
}

export { UniqueValueRenderer };
mapgis.renderer.UniqueValueRenderer = UniqueValueRenderer;