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 UniqueValueInfo from './support/UniqueValueInfo'
/**
* 单值专题图渲染样式,支持的图层如下:<br/>
* [IGS地图图片图层]{@link IGSMapImageLayer}、[几何图形图层]{@link GraphicsLayer}、[IGS要素图层]{@link IGSFeatureLayer}、
* [geojson图层]{@link GeoJSONLayer}、[OGC-WFS图层]{@link WFSLayer}
* @class UniqueValueRenderer
* @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<UniqueValueInfo>} [options.uniqueValueInfos = []] 单值专题图字段样式,支持的样式如下:<br/>
* [1、点样式]{@link SimpleMarkerSymbol}<br/>
* [2、线样式]{@link SimpleLineSymbol}<br/>
* [3、区样式]{@link SimpleFillSymbol}<br/>
* 示例如下:<br>
* <a href='#UniqueValue-point'>[1、单值专题图-点]</a><br/>
* <a href='#UniqueValue-line'>[2、单值专题图-线]</a><br/>
* <a href='#UniqueValue-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='defaultSymbol-point'>默认样式-点</h7></caption>
* // ES5引入方式
* const { SimpleMarkerSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* const { UniqueValueRenderer } = Zondy.Renderer
* // ES6引入方式
* import { SimpleMarkerSymbol, SimpleLineSymbol, Color, UniqueValueRenderer } 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 UniqueValueRenderer({
* //字段名
* field: '你的字段名',
* //单值专题图字段样式
* uniqueValueInfos: [],
* // 默认样式
* defaultSymbol: defaultSymbol
* })
*
* @example <caption><h7 id='defaultSymbol-line'>默认样式-线</h7></caption>
* // ES5引入方式
* const { SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* const { UniqueValueRenderer } = Zondy.Renderer
* // ES6引入方式
* import { SimpleLineSymbol, Color, UniqueValueRenderer } from "@mapgis/webclient-common"
* // 初始化默认样式,更多样式详见:[《SimpleLineSymbol》]{@link SimpleLineSymbol}
* const defaultSymbol = new SimpleLineSymbol({
* // 填充颜色
* color: new Color(255, 0, 0, 1),
* // 线宽
* width: 2
* })
* // 初始化渲染对象
* const renderer = new UniqueValueRenderer({
* //字段名
* field: '你的字段名',
* //单值专题图字段样式
* uniqueValueInfos: [],
* // 默认样式
* defaultSymbol: defaultSymbol
* })
*
* @example <caption><h7 id='defaultSymbol-fill'>默认样式-区</h7></caption>
* // ES5引入方式
* const { SimpleFillSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* const { UniqueValueRenderer } = Zondy.Renderer
* // ES6引入方式
* import { SimpleFillSymbol, SimpleLineSymbol, Color, UniqueValueRenderer } from "@mapgis/webclient-common"
* // 初始化默认样式,更多样式详见:[《SimpleFillSymbol》]{@link SimpleFillSymbol}
* const defaultSymbol = new Symbol.SimpleFillSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 外边线样式
* outline: new Symbol.SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* // 初始化渲染对象
* const renderer = new Renderer.UniqueValueRenderer({
* //字段名
* field: '你的字段名',
* //单值专题图字段样式
* uniqueValueInfos: [],
* // 默认样式
* defaultSymbol: defaultSymbol
* })
*
* @example <caption><h7 id='UniqueValue-point'>单值专题图-点</h7></caption>
* // ES5引入方式
* const { UniqueValueRenderer } = Zondy.Renderer
* const { SimpleMarkerSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { UniqueValueRenderer, SimpleMarkerSymbol, SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* //创建单值专题图渲染样式对象,更多样式详见:[《SimpleMarkerSymbol》]{@link SimpleMarkerSymbol}
* let uniqueRender = new UniqueValueRenderer({
* //字段名
* field: '你的字段名',
* // 默认样式
* defaultSymbol: undefined,
* //单值专题图字段样式
* uniqueValueInfos: [{
* //指定字段值1
* value: "字段值1",
* //匹配到该值后的样式
* symbol: new SimpleMarkerSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 点半径
* size: 13,
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* },{
* //指定字段值2
* value: "字段值2",
* //匹配到该值后的样式
* 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='UniqueValue-line'>单值专题图-线</h7></caption>
* // ES5引入方式
* const { UniqueValueRenderer } = Zondy.Renderer
* const { SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { UniqueValueRenderer, SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* //创建单值专题图渲染样式对象,更多样式详见:[《SimpleLineSymbol》]{@link SimpleLineSymbol}
* let uniqueRender = new UniqueValueRenderer({
* //字段名
* field: '你的字段名',
* // 默认样式
* defaultSymbol: undefined,
* //单值专题图字段样式
* uniqueValueInfos: [{
* //指定字段值1
* value: "字段值1",
* //匹配到该值后的样式
* symbol: new SimpleLineSymbol({
* //线符号颜色
* color: new Color(255, 0, 0, 1),
* //线宽
* width: 1
* })
* },{
* //指定字段值2
* value: "字段值2",
* //匹配到该值后的样式
* symbol: new SimpleLineSymbol({
* //线符号颜色
* color: new Color(1, 255, 0, 1),
* //线宽
* width: 2
* })
* }]
* });
*
* @example <caption><h7 id='UniqueValue-fill'>单值专题图-区</h7></caption>
* // ES5引入方式
* const { UniqueValueRenderer } = Zondy.Renderer
* const { SimpleFillSymbol, SimpleLineSymbol } = Zondy.Symbol
* const { Color } = Zondy
* // ES6引入方式
* import { UniqueValueRenderer, SimpleLineSymbol, Color } from "@mapgis/webclient-common"
* //创建单值专题图渲染样式对象,更多样式详见:[《SimpleFillSymbol》]{@link SimpleFillSymbol}
* let uniqueRender = new UniqueValueRenderer({
* //字段名
* field: '你的字段名',
* // 默认样式
* defaultSymbol: undefined,
* //单值专题图字段样式
* uniqueValueInfos: [{
* //指定字段值1
* value: "字段值1",
* //匹配到该值后的样式
* symbol: new SimpleFillSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* },{
* //指定字段值2
* value: "字段值2",
* //匹配到该值后的样式
* symbol: new SimpleFillSymbol({
* // 填充颜色
* color: 'rgba(1,1,252,0)',
* // 外边线样式
* outline: new SimpleLineSymbol({
* //线颜色
* color: new Color(255, 1, 0, 1),
* //线宽
* width: 1
* })
* })
* }]
* });
* @see [<h7>字段表达式说明</h7>]{@tutorial 表达式}
* @example <caption><h7 id='valueExpression'>字段表达式</h7></caption>
* // 设置字段表达式,表达式更方便用户自定义可视化效果
* // 目前能支持简单运算(加、减、乘、除等),支持要素链接符$feature
* const renderer = new UniqueValueRenderer({
valueExpression:"$feature.FID>10?'样式1':'样式2'",
//单值专题图字段样式
uniqueValueInfos: [
{
//指定字段值1
value:'样式1',
//匹配到该值后的样式
symbol: new SimpleMarkerSymbol({
// 填充颜色
color: "rgba(255,0,255,1)",
// 点半径
size: 40,
// 外边线样式
outline: new SimpleLineSymbol({
//线颜色
color: new Color(255, 1, 0, 1),
//线宽
width: 1,
}),
style:'arrow'
}),
},
{
//指定字段值2
value: "样式2",
//匹配到该值后的样式
symbol: new SimpleFillSymbol({
// 填充颜色
color: "rgba(0,0,255,0.2)",
// 外边线样式
outline: new SimpleLineSymbol({
//线颜色
color: new Color(255, 1, 0, 1),
//线宽
width: 1,
style:'dot'
}),
style:'cross'
}),
},
],
// 默认样式
defaultSymbol: defaultSymbol,
});
*/
class UniqueValueRenderer extends BaseRenderer {
constructor(options) {
super(options)
options = defaultValue(options, {})
/**
* type 'unique-value',单值专题图
* @member {String} UniqueValueRenderer.prototype.type
*/
this.type = RendererType.uniqueValue
/**
* field 'unique-value',字段名
* @member {String} UniqueValueRenderer.prototype.field
*/
this.field = defaultValue(options.field, '')
/**
* uniqueValueInfos 单值专题图字段样式
* @member {Array<UniqueValueInfo>} UniqueValueRenderer.prototype.uniqueValueInfos
*/
this.uniqueValueInfos = this._decorate(
'uniqueValueInfos',
defaultValue(options.uniqueValueInfos, []),
null,
(value) => {
return value.map((val) => {
return UniqueValueInfo.fromJSON(val)
})
}
)
/**
* defaultSymbol 默认样式,当分段值未覆盖时,使用默认样式
* @member {Symbol} UniqueValueRenderer.prototype.defaultSymbol
*/
this.defaultSymbol = this._decorate(
'symbol',
options.defaultSymbol,
Symbol,
Symbol.fromJSON
)
/**
* 是否可视化默认符号
* @member {Boolean} UniqueValueRenderer.prototype.defaultVisible
*/
this.defaultVisible = defaultValue(options.defaultVisible, true)
/**
* 视觉变量
* @member {Array<VisualVariable>} UniqueValueRenderer.prototype.visualVariables
*/
this.visualVariables = this._decorate(
'visualVariables',
defaultValue(options.visualVariables, []),
null,
(v) => v.map((s) => VisualVariable.fromJSON(s))
)
/**
* 字段表达式描述
* @member {String} UniqueValueRenderer.prototype.valueExpressionTitle
*/
this.valueExpressionTitle = defaultValue(options.valueExpressionTitle, '')
/**
* 字段表达式
* @member {String} UniqueValueRenderer.prototype.valueExpression
*/
this.valueExpression = defaultValue(options.valueExpression, '')
/**
* 默认的渲染器标签
* @member {String} UniqueValueRenderer.prototype.defaultLabel
*/
this.defaultLabel = defaultValue(options.defaultLabel, null)
/**
* 默认的渲染器的描述信息
* @member {String} UniqueValueRenderer.prototype.defaultDescription
*/
this.defaultDescription = defaultValue(options.defaultDescription, null)
}
/**
* 导出为json对象
* @return {Object} json对象
* */
toJSON() {
const json = super.toJSON()
json.field = this.field
json.defaultSymbol = this.defaultSymbol.toJSON()
json.uniqueValueInfos = this.uniqueValueInfos.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 {UniqueValueRenderer} 克隆后的renderer对象
*/
clone() {
return new UniqueValueRenderer(this.toJSON())
}
}
/**
* 通过json创造UniqueValueRenderer对象
* @param {Object} json
* @return {UniqueValueRenderer} 新创建的UniqueValueRenderer对象
* @example <caption><h7>通过json创造UniqueValueRenderer对象</h7></caption>
* let uniqueValueRenderer = UniqueValueRenderer.fromJSON({
* // 初始化参数
* })
* */
UniqueValueRenderer.fromJSON = function (json) {
json = defaultValue(json, {})
return new UniqueValueRenderer(json)
}
Zondy.Renderer.UniqueValueRenderer = UniqueValueRenderer
export default UniqueValueRenderer