import BaseRenderer from './BaseRenderer'
import { Zondy } from '../../base'
import { defaultValue } from '../../util'
import { RendererType } from '../../base/enum'
import { Symbol } from '../../base/symbol'
import { VisualVariable } from './visualVariable'
import ClassBreakInfo from './support/ClassBreakInfo'
/**
* 分段专题图渲染样式,支持的图层如下:<br/>
* [IGS地图图片图层]{@link IGSMapImageLayer}、[几何图形图层]{@link GraphicsLayer}、[IGS要素图层]{@link IGSFeatureLayer}、
* [geojson图层]{@link GeoJSONLayer}、[OGC-WFS图层]{@link WFSLayer}
* @class ClassBreakRenderer
* @extends BaseRenderer
* @moduleEX RendererModule
* @param {Object} options 构造参数
* @param {String} [options.field = ''] 过滤字段名
* @param {String} [options.valueExpressionTitle] 字段表达式描述
* @param {String} [options.valueExpression] 字段表达式
* @param {Boolean} [options.defaultVisible = true] 默认符号是否显示
* @param {Array<ClassBreakInfo>} [options.classBreakInfos = []] 分段专题图字段样式,支持的样式如下:<br/>
* [1、点样式]{@link SimpleMarkerSymbol}<br/>
* [2、线样式]{@link SimpleLineSymbol}<br/>
* [3、区样式]{@link SimpleFillSymbol}<br/>
* 示例如下:<br>
* <a href='#ClassBreak-point'>[1、分段专题图-点]</a><br/>
* <a href='#ClassBreak-line'>[2、分段专题图-线]</a><br/>
* <a href='#ClassBreak-fill'>[3、分段专题图-区]</a>
* @param {Object} [options.defaultSymbol] 默认样式,当分段值未覆盖时,使用默认样式,支持的样式如下:<br/>
* [1、点样式]{@link SimpleMarkerSymbol}<br/>
* [2、线样式]{@link SimpleLineSymbol}<br/>
* [3、区样式]{@link SimpleFillSymbol}<br/>
* 示例如下:<br>
* <a href='#defaultSymbol-point'>[1、默认样式-点]</a><br/>
* <a href='#defaultSymbol-line'>[2、默认样式-线]</a><br/>
* <a href='#defaultSymbol-fill'>[3、默认样式-区]</a>
*
* @example <caption><h7 id='ClassBreak-point'>分段专题图-点</h7></caption>
* // ES5引入方式
* const { ClassBreakRenderer } = Zondy.Renderer
* const { SimpleMarkerSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { ClassBreakRenderer, SimpleMarkerSymbol, SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* // 创建分段专题图渲染样式对象
* const classBreakRenderer = new ClassBreakRenderer({
* //字段名
* field: '你的字段名',
* // 默认样式
* defaultSymbol: undefined,
* //分段专题图字段样式
* classBreakInfos: [{
* // 分段最大值
* maxValue: 20,
* // 分段最小值
* minValue: 1,
* //匹配到该值后的样式,更多样式详见:[《SimpleMarkerSymbol》]{@link SimpleMarkerSymbol}
* symbol: new SimpleMarkerSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 点半径
* size: 13,
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* },{
* // 分段最大值
* maxValue: 40,
* // 分段最大值
* minValue: 20,
* //匹配到该值后的样式,更多样式详见:[《SimpleMarkerSymbol》]{@link SimpleMarkerSymbol}
* symbol: new SimpleMarkerSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 点半径
* size: 13,
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* }]
* });
*
* @example <caption><h7 id='ClassBreak-line'>分段专题图-线</h7></caption>
* // ES5引入方式
* const { ClassBreakRenderer } = Zondy.Renderer
* const { SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { ClassBreakRenderer, SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* // 创建分段专题图渲染样式对象
* const classBreakRenderer = new ClassBreakRenderer({
* //字段名
* field: '你的字段名',
* // 默认样式
* defaultSymbol: undefined,
* //分段专题图字段样式
* classBreakInfos: [{
* // 分段最大值
* maxValue: 20,
* // 分段最小值
* minValue: 1,
* //匹配到该值后的样式,更多样式详见:[《SimpleLineSymbol》]{@link SimpleLineSymbol}
* symbol: new SimpleLineSymbol({
* //线符号颜色
* color: new Color(1, 255, 0, 1),
* //线宽
* width: 2
* })
* },{
* // 分段最大值
* maxValue: 40,
* // 分段最大值
* minValue: 20,
* //匹配到该值后的样式,更多样式详见:[《SimpleLineSymbol》]{@link SimpleLineSymbol}
* symbol: new SimpleLineSymbol({
* //线符号颜色
* color: new Color(1, 255, 0, 1),
* //线宽
* width: 2
* })
* }]
* });
*
* @example <caption><h7 id='ClassBreak-fill'>分段专题图-区</h7></caption>
* // ES5引入方式
* const { ClassBreakRenderer } = Zondy.Renderer
* const { SimpleFillSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { ClassBreakRenderer, SimpleFillSymbol, SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* // 创建分段专题图渲染样式对象
* const classBreakRenderer = new ClassBreakRenderer({
* //字段名
* field: '你的字段名',
* // 默认样式
* defaultSymbol: undefined,
* //分段专题图字段样式
* classBreakInfos: [{
* // 分段最大值
* maxValue: 20,
* // 分段最小值
* minValue: 1,
* //匹配到该值后的样式,更多样式详见:[《SimpleFillSymbol》]{@link SimpleFillSymbol}
* symbol: new SimpleFillSymbol({
* // 填充符号颜色
* color: new Color(111, 222, 0, 0.3),
* // 外边线样式
* outline: new SimpleLineSymbol({
* // 线符号颜色
* color: new Color(255, 255, 0, 1),
* // 线宽
* width: 1
* })
* })
* },{
* // 分段最大值
* maxValue: 40,
* // 分段最大值
* minValue: 20,
* //匹配到该值后的样式,更多样式详见:[《SimpleFillSymbol》]{@link SimpleFillSymbol}
* symbol: new SimpleFillSymbol({
* // 填充符号颜色
* color: new Color(21, 110, 22, 0.3),
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线符号颜色
* color: new Color(255, 255, 0, 1),
* //线宽
* width: 1
* })
* })
* }]
* });
*
* @example <caption><h7 id='defaultSymbol-point'>默认样式-点</h7></caption>
* // ES5引入方式
* const { SimpleMarkerSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* const { ClassBreakRenderer } = Zondy.Renderer
* // ES6引入方式
* import { SimpleMarkerSymbol, SimpleLineSymbol, Color, ClassBreakRenderer } from "@mapgis/webclient-common"
* // 初始化默认样式,更多样式详见:[《SimpleMarkerSymbol》]{@link SimpleMarkerSymbol}
* const defaultSymbol = new SimpleMarkerSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 点半径
* size: 13,
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* // 初始化渲染对象
* const renderer = new ClassBreakRenderer({
* //字段名
* field: '你的字段名',
* //分段专题图字段样式
* classBreakInfos: [],
* // 默认样式
* defaultSymbol: defaultSymbol
* })
*
* @example <caption><h7 id='defaultSymbol-line'>默认样式-线</h7></caption>
* // ES5引入方式
* const { SimpleLineSymbol, SimpleMarkerSymbol } = Zondy.Symbol
* const { Color } = Zondy
* const { ClassBreakRenderer } = Zondy.Renderer
* // ES6引入方式
* import { SimpleLineSymbol, SimpleMarkerSymbol, Color, ClassBreakRenderer } from "@mapgis/webclient-common"
* // 初始化默认样式,更多样式详见:[《SimpleLineSymbol》]{@link SimpleLineSymbol}
* const defaultSymbol = new SimpleLineSymbol({
* // 填充颜色
* color: new Color(255, 0, 0, 1),
* // 线宽
* width: 2
* })
* // 初始化渲染对象
* const renderer = new ClassBreakRenderer({
* //字段名
* field: '你的字段名',
* //分段专题图字段样式
* classBreakInfos: [],
* // 默认样式
* defaultSymbol: defaultSymbol
* })
*
* @example <caption><h7 id='defaultSymbol-fill'>默认样式-区</h7></caption>
* // ES5引入方式
* const { SimpleFillSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* const { ClassBreakRenderer } = Zondy.Renderer
* // ES6引入方式
* import { SimpleFillSymbol, SimpleLineSymbol, Color, ClassBreakRenderer } from "@mapgis/webclient-common"
* // 初始化默认样式,更多样式详见:[《SimpleFillSymbol》]{@link SimpleFillSymbol}
* const defaultSymbol = new SimpleFillSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* // 初始化渲染对象
* const renderer = new ClassBreakRenderer({
* //字段名
* field: '你的字段名',
* //分段专题图字段样式
* classBreakInfos: [],
* // 默认样式
* defaultSymbol: defaultSymbol
* })
* @see [<h7>字段表达式说明</h7>]{@tutorial 表达式}
* @example <caption><h7 id='valueExpression'>字段表达式</h7></caption>
const renderer = new ClassBreakRenderer({
valueExpression: "$feature.FID * 5",
// 默认样式
defaultSymbol: undefined,
//分段专题图字段样式
classBreakInfos: [
{
// 分段最大值
maxValue: 20,
// 分段最小值
minValue: 1,
//匹配到该值后的样式,更多样式详见:《SimpleFillSymbol》
symbol: new SimpleFillSymbol({
// 填充符号颜色
color: new Color(111, 222, 0, 0.3),
// 外边线样式
outline: new SimpleLineSymbol({
// 线符号颜色
color: new Color(255, 255, 0, 1),
// 线宽
width: 1,
}),
}),
},
{
// 分段最大值
maxValue: 40,
// 分段最大值
minValue: 20,
//匹配到该值后的样式,更多样式详见:《SimpleFillSymbol》
symbol: new SimpleFillSymbol({
// 填充符号颜色
color: new Color(21, 110, 22, 0.3),
// 外边线样式
outline: new SimpleLineSymbol({
//线符号颜色
color: new Color(255, 255, 0, 1),
//线宽
width: 1,
}),
}),
},
],
});
*/
class ClassBreakRenderer extends BaseRenderer {
constructor(options) {
super(options)
options = defaultValue(options, {})
/**
* type 'class-breaks',分段专题图
* @member {String} ClassBreakRenderer.prototype.type
*/
this.type = RendererType.classBreak
/**
* field 过滤字段名
* @member {String} ClassBreakRenderer.prototype.field
*/
this.field = defaultValue(options.field, '')
/**
* classBreakInfos 分段参数
* @member {Array<ClassBreakInfo>} ClassBreakRenderer.prototype.classBreakInfos
*/
this.classBreakInfos = this._decorate(
'classBreakInfos',
defaultValue(options.classBreakInfos, []),
null,
(value) => {
return value.map((val) => {
return ClassBreakInfo.fromJSON(val)
})
}
)
/**
* defaultSymbol 默认样式,当分段值未覆盖时,使用默认样式
* @member {Symbol} ClassBreakRenderer.prototype.defaultSymbol
*/
this.defaultSymbol = this._decorate(
'symbol',
options.defaultSymbol,
Symbol,
Symbol.fromJSON
)
/**
* 是否可视化默认符号
* @member {Boolean} ClassBreakRenderer.prototype.defaultVisible
*/
this.defaultVisible = defaultValue(options.defaultVisible, true)
/**
* 视觉变量
* @member {Array<VisualVariable> } ClassBreakRenderer.prototype.visualVariables
*/
this.visualVariables = this._decorate(
'visualVariables',
defaultValue(options.visualVariables, []),
null,
(v) => v.map((s) => VisualVariable.fromJSON(s))
)
/**
* 字段表达式描述
* @member {String} ClassBreakRenderer.prototype.valueExpressionTitle
*/
this.valueExpressionTitle = defaultValue(options.valueExpressionTitle, '')
/**
* 字段表达式
* @member {String} ClassBreakRenderer.prototype.valueExpression
*/
this.valueExpression = defaultValue(options.valueExpression, '')
/**
* 默认的标签
* @member {String} ClassBreakRenderer.prototype.defaultLabel
*/
this.defaultLabel = defaultValue(options.defaultLabel, null)
/**
* 默认的描述
* @member {String} ClassBreakRenderer.prototype.defaultDescription
*/
this.defaultDescription = defaultValue(options.defaultDescription, null)
}
/**
* 导出为json对象
* @return {Object} json对象
* */
toJSON() {
const json = super.toJSON()
json.field = this.field
json.classBreakInfos = this.classBreakInfos
json.defaultSymbol = this.defaultSymbol.toJSON()
json.classBreakInfos = this.classBreakInfos.map((v) => v.toJSON())
json.visualVariables = this.visualVariables.map((v) => v.toJSON())
json.valueExpression = this.valueExpression
json.valueExpressionTitle = this.valueExpressionTitle
json.defaultLabel = this.defaultLabel
json.defaultDescription = this.defaultDescription
json.defaultVisible = this.defaultVisible
return json
}
/**
* 克隆renderer对象
* @return {ClassBreakRenderer} 克隆后的renderer对象
*/
clone() {
return new ClassBreakRenderer(this.toJSON())
}
}
/**
* 通过json创造ClassBreakRenderer对象
* @param {Object} json
* @return {ClassBreakRenderer} 新创建的ClassBreakRenderer对象
* @example <caption><h7>通过json创造ClassBreakRenderer对象</h7></caption>
* let classBreakRenderer = ClassBreakRenderer.fromJSON({
* // 初始化参数
* })
* */
ClassBreakRenderer.fromJSON = function (json) {
json = defaultValue(json, {})
return new ClassBreakRenderer(json)
}
Zondy.Renderer.ClassBreakRenderer = ClassBreakRenderer
export default ClassBreakRenderer