import BaseRenderer from './BaseRenderer'
import { defaultValue } from '../../util'
import { Zondy } from '../../base'
import { RendererType } from '../../base/enum'
import { SimpleMarkerSymbol, SimpleFillSymbol, Symbol } from '../../base/symbol'
import ClusterInfo from './support/ClusterInfo'
/**
* 聚类渲染器,多个点聚集在一起,会形成一个点符号
* @class ClusterRenderer
* @extends BaseRenderer
* @moduleEX RendererModule
* @param {Object} options 构造参数
* @param {Number} [options.radius = 80] 聚合半径,单位像素
* @param {SimpleFillSymbol} [options.clusterBoundSymbol] 聚合边界,显示聚合区域的范围,仅支持部分样式
* @param {Array<ClusterInfo>} [options.clusterInfos] 聚合信息,描述聚合点数量区间内显示的符号信息。
* @param {Symbol} [options.defaultSymbol] 默认的聚合点符号,目前仅支持SimpleMarkerSymbol|PcitureMarkerSymbol部分样式,不支持线图层
* @param {Number} [options.maxScale = 20] 最大聚类比例尺,单位为m,超过这个比例尺范围不进行聚类
* @param {Boolean} [options.isExpandOnClick = true] 点击聚类点是否展开
* @param {Boolean} [options.isHoverShowBound = false] 鼠标悬停显示聚类边界
*
* @summary <h5>支持如下方法:</h5>
* <a href='#fromJSON'>[1、通过json构造ClusterRenderer对象]</a><br/>
* <a href='#toJSON'>[2、导出json对象]</a><br/>
* <a href='#clone'>[3、克隆ClusterRenderer对象]</a>
*
* @example <caption><h7 id='new-PictureMarkerSymbol'>创建随机渲染器对象</h7></caption>
* // ES5引入方式
* const { ClusterRenderer } = Zondy.Renderer
* const { TextSymbol, SimpleMarkerSymbol } = Zondy.Symbol
* // ES6引入方式
* import { ClusterRenderer, TextSymbol, SimpleMarkerSymbol } from "@mapgis/webclient-common"
* // 初始化聚类渲染器对象
* const clusterRenderer = new ClusterRenderer({
* // 聚类参数
* clusterInfos:[
* // 聚类分段1
* {
* // 最小聚类数量
* minValue: 0,
* // 最大聚类数量
* maxValue: 2,
* // 聚类文字样式
* labelSymbol: new TextSymbol({
* // 文字颜色
* color:'#ffffff',
* // 文字大小
* font:{
* size:20
* },
* }),
* // 聚类符号样式
* symbol: new SimpleMarkerSymbol({
* // 符号颜色
* color: 'rgba(112, 0, 255, 0.6)',
* // 符号大小
* size: 20,
* // 符号外边线样式
* outline: {
* // 外边线颜色
* color: 'rgba(122, 211, 22, 0.6)',
* // 外边线宽度
* width: 4
* }
* })
* },
* // 聚类分段2
* {
* // 最小聚类数量
* minValue: 2,
* // 最大聚类数量
* maxValue: 6,
* // 聚类文字样式
* labelSymbol:new TextSymbol({
* // 文字颜色
* color: '#000000',
* // 文字大小
* font: {
* size: 12
* },
* }),
* // 聚类符号样式
* symbol: new SimpleMarkerSymbol({
* // 符号颜色
* color: 'rgba(240, 194, 12, 0.6)',
* // 符号大小
* size: 30,
* // 符号外边线样式
* outline: {
* // 外边线颜色
* color: 'rgba(241, 211, 87, 0.6)',
* // 外边线宽度
* width: 5
* }
* })
* },
* // 聚类分段3
* {
* // 最小聚类数量
* minValue: 6,
* // 最大聚类数量
* maxValue: 10,
* // 聚类文字样式
* labelSymbol: new TextSymbol({
* // 文字颜色
* color: '#000000',
* // 文字大小
* font: {
* size: 12
* },
* }),
* // 聚类符号样式
* symbol: new SimpleMarkerSymbol({
* // 符号颜色
* color: 'rgba(255, 0, 0, 0.6)',
* // 符号大小
* size: 30,
* // 符号外边线样式
* outline: {
* // 外边线颜色
* color: 'rgba(111, 111, 111, 0.6)',
* // 外边线宽度
* width: 5
* }
* })
* }
* ]
* })
*/
class ClusterRenderer extends BaseRenderer {
constructor(options) {
super(options)
options = defaultValue(options, {})
/**
* 类型,默认为'cluster'
* @readonly
* @member {String} ClusterRenderer.prototype.type
*/
this.type = RendererType.cluster
/**
* 聚合半径,目前仅支持像素。
* @member {Number} ClusterRenderer.prototype.radius
*/
this.radius = defaultValue(options.radius, 80)
/**
* 聚合边界,显示聚合区域的范围
* @member {SimpleFillSymbol} ClusterRenderer.prototype.clusterBoundSymbol
*/
this.clusterBoundSymbol = this._decorate(
'clusterBoundSymbol',
options.clusterBoundSymbol,
SimpleFillSymbol,
SimpleFillSymbol.fromJSON
)
/**
* 聚合信息,描述聚合点数量区间内显示的符号信息。
* @member {Array<ClusterInfo>} ClusterRenderer.prototype.clusterInfos
*/
this.clusterInfos = this._decorate(
'clusterInfos',
defaultValue(options.clusterInfos, []),
null,
(value) => {
return value.map((val) => {
return ClusterInfo.fromJSON(val)
})
}
)
/**
* 默认的聚合点符号,目前仅支持SimpleMarkerSymbol|PcitureMarkerSymbol部分样式
* @member {Symbol} ClusterRenderer.prototype.defaultSymbol
*/
this.defaultSymbol = this._decorate(
'defaultSymbol',
defaultValue(
options.defaultSymbol,
new SimpleMarkerSymbol({
color: 'rgba(240, 194, 12, 0.6)',
size: 30,
outline: {
color: 'rgba(241, 211, 87, 0.6)',
width: 5
}
})
),
Symbol,
Symbol.fromJSON
)
/**
* 最大聚类比例尺,单位为m,超过这个比例尺范围不进行聚类
* @member {Number} ClusterRenderer.prototype.maxScale
*/
this.maxScale = defaultValue(options.maxScale, 20)
/**
* 点击聚类点是否展开
* @member {Boolean} ClusterRenderer.prototype.isExpandOnClick
*/
this.isExpandOnClick = defaultValue(options.isExpandOnClick, true)
/**
* 鼠标悬停显示聚类边界
* @member {Boolean} ClusterRenderer.prototype.isHoverShowBound
*/
this.isHoverShowBound = defaultValue(options.isHoverShowBound, false)
}
/**
* <a id='fromJSON'/>
* 通过json构造ClusterRenderer对象
* @param {Object} json json对象
* @return {ClusterRenderer} ClusterRenderer实例
*/
static fromJSON(json) {
json = defaultValue(json, {})
return new ClusterRenderer(json)
}
/**
* <a id='toJSON'/>
* 导出json对象
* @return {Object} json对象
*/
toJSON() {
const json = super.toJSON()
json.type = this.type
json.radius = this.radius
json.clusterBoundSymbol = this.clusterBoundSymbol.toJSON()
json.clusterInfos = this.clusterInfos.map((v) => v.toJSON())
json.defaultSymbol = this.defaultSymbol.toJSON()
json.maxScale = this.maxScale
json.isExpandOnClick = this.isExpandOnClick
json.isHoverShowBound = this.isHoverShowBound
return json
}
/**
* <a id='clone'/>
* 克隆ClusterRenderer对象
* @return {ClusterRenderer} 克隆后的ClusterRenderer实例
*/
clone() {
return new ClusterRenderer(this.toJSON())
}
}
Zondy.Renderer.ClusterRenderer = ClusterRenderer
export default ClusterRenderer