import BaseRenderer from './BaseRenderer'
import { defaultValue } from '../../util'
import { Zondy } from '../../base'
import { RendererType } from '../../base/enum'
import { Symbol } from '../../base/symbol'
/**
* 等级符号专题图,符号尺寸随指定字段的值的变化而变化
* @class RankRenderer
* @extends BaseRenderer
* @moduleEX RendererModule
* @param {Object} options 构造参数
* @param {String} [options.field] 要素字段名
* @param {Number} [options.minSize = 12] 等级符号最小尺寸,单位像素
* @param {Number} [options.maxSize = 50] 等级符号最大尺寸,单位像素
* @param {Number} [options.minDataValue] 最小数据范围,如果小于此数据范围按minSize进行符号渲染
* @param {Number} [options.maxDataValue] 最大数据范围,如果超出此数据范围按maxSize进行符号渲染
* @param {Symbol} [options.symbol] 等级符号样式,目前仅支持SimpleMarkerSymbol|PictureMarkerSymbol|TextSymbol,不支持线图层
* @param {String} [options.valueExpression] 数据字段表达式,设置了会覆盖field的值
* @param {String} [options.valueExpressionTitle] 数据字段表达式标题
*
* @summary <h5>支持如下方法:</h5>
* <a href='#fromJSON'>[1、通过json构造RankRenderer对象]</a><br/>
* <a href='#toJSON'>[2、导出json对象]</a><br/>
* <a href='#clone'>[3、克隆RankRenderer对象]</a>
*
* @example <caption><h7 id='new-PictureMarkerSymbol'>创建随机渲染器对象</h7></caption>
* // ES5引入方式
* const { RankRenderer } = Zondy.Renderer
* const { SimpleMarkerSymbol, SimpleLineSymbol } = Zondy.Symbol
* // ES6引入方式
* import { RankRenderer, SimpleMarkerSymbol, SimpleLineSymbol } from "@mapgis/webclient-common"
* // 初始化等级符号渲染器对象
* const rankRenderer = new RankRenderer({
* // 等级符号最小尺寸,单位像素
* minSize: 12,
* // 等级符号最大尺寸,单位像素
* maxSize: 50,
* // 字段名
* field: '字段名',
* // 符号样式
* symbol:new SimpleMarkerSymbol({
* // 填充颜色
* color:'#00ff00',
* // 符号形状样式
* style:'diamond',
* // 符号外边线样式
* outline:new SimpleLineSymbol({
* // 符号外边线颜色
* color: '#ff0000',
* // 符号外边线宽度
* width: 2
* })
* })
* })
*/
class RankRenderer extends BaseRenderer {
constructor(options) {
super(options)
options = defaultValue(options, {})
/**
* 符号类型,默认为‘rank’
* @readonly
* @member {String} RankRenderer.prototype.type
*/
this.type = RendererType.rank
/**
* 等级符号最大尺寸,单位像素
* @member {Number} RankRenderer.prototype.maxSize
*/
this.maxSize = defaultValue(options.maxSize, 50)
/**
* 等级符号最小尺寸,单位像素
* @member {Number} RankRenderer.prototype.minSize
*/
this.minSize = defaultValue(options.minSize, 12)
/**
* 最大数据范围,如果超出此数据范围按maxSize进行符号渲染
* @member {Number} RankRenderer.prototype.maxDataValue
*/
this.maxDataValue = options.maxDataValue
/**
* 最小数据范围,如果小于此数据范围按minSize进行符号渲染
* @member {Number} RankRenderer.prototype.minDataValue
*/
this.minDataValue = options.minDataValue
/**
* 等级符号样式,目前仅支持SimpleMarkerSymbol|PictureMarkerSymbol|TextSymbol
* @member {Symbol} RankRenderer.prototype.symbol
*/
this.symbol = this._decorate(
'symbol',
options.symbol,
Symbol,
Symbol.fromJSON
)
/**
* 要素字段名
* @member {String} RankRenderer.prototype.field
*/
this.field = options.field
/**
* 数据字段表达式
* @member {String} RankRenderer.prototype.valueExpression
*/
this.valueExpression = options.valueExpression
/**
* 数据字段表达式标题
* @member {String} RankRenderer.prototype.valueExpressionTitle
*/
this.valueExpressionTitle = options.valueExpressionTitle
}
/**
* <a id='fromJSON'/>
* 通过json构造RankRenderer对象
* @param {Object} json json对象
* @return {RankRenderer} RankRenderer实例
*/
static fromJSON(json) {
json = defaultValue(json, {})
return new RankRenderer(json)
}
/**
* <a id='toJSON'/>
* 导出json对象
* @return {Object} json对象
*/
toJSON() {
const json = super.toJSON()
json.type = this.type
json.maxSize = this.maxSize
json.minSize = this.minSize
json.maxDataValue = this.maxDataValue
json.minDataValue = this.minDataValue
json.symbol = this.symbol.toJSON()
json.field = this.field
json.valueExpression = this.valueExpression
json.valueExpressionTitle = this.valueExpressionTitle
return json
}
/**
* <a id='clone'/>
* 克隆RankRenderer对象
* @return {RankRenderer} 克隆后的RankRenderer实例
*/
clone() {
return new RankRenderer(this.toJSON())
}
}
Zondy.Renderer.RankRenderer = RankRenderer
export default RankRenderer