qd-changjing/public/leaflet/libs/iclient8c/examples/js/graph/Ring.js

222 lines
11 KiB
JavaScript
Raw Normal View History

2022-07-05 16:56:29 +08:00
/**
* @requires SuperMap.Feature.Theme.js
* @requires SuperMap.Feature.Theme.Graph.js
*
*/
/**
* Class: SuperMap.Feature.Theme.Ring
* 环状图
*
* 图表 Ring 配置对象 chartsSetting<SuperMap.Layer.Graph::chartsSetting> 可设属性如下
*
* Symbolizer properties:
* width - {Number} 专题要素图表宽度必设参数
* height - {Number} 专题要素图表高度必设参数
* codomain - {Array{Number}} 图表允许展示的数据值域长度为 2 的一维数组第一个元素表示值域下限第二个元素表示值域上限必设参数
* XOffset - {Number} 专题要素图表 X 方向上的偏移值单位像素
* YOffset - {Number} 专题要素图表 Y 方向上的偏移值单位像素
* dataViewBoxParameter - {Array{Number}} 数据视图框 dataViewBox 参数
* 它是指图表框 chartBox 由图表位置图表宽度图表高度构成的图表范围框在左上四个方向上的内偏距值默认值为[0, 0, 0, 0]
* decimalNumber - {Number} 数据值数组 dataValues 元素值小数位数数据的小数位处理参数取值范围[0, 16]如果不设置此参数在取数据值时不对数据做小数位处理
*
* useBackground - {Boolean} 是否使用图表背景框默认不使用
* backgroundStyle - {Object} 背景样式此样式对象对象可设属性 <SuperMap.Feature.ShapeParameters.Rectangle::style>
* backgroundRadius - {Array} 背景框矩形圆角半径可以用数组分别指定四个角的圆角半径左上右上右下左下角的半径依次为 r1r2r3r4 ,
* backgroundRadius [r1r2r3r4 ]默认值[0, 0, 0, 0]
*
* innerRingRadius - {Number} 环状图内环半径默认值: 0取值范围大于 0小于外环半径外环半径数据视图框长和宽中较小值的二分之一
*
* sectorStyle - {Object} 环状图中扇形的基础 style此参数控制环状图扇形基础样式优先级低于 sectorStyleByFields sectorStyleByCodomain
* 此样式对象对象可设属性 <SuperMap.Feature.ShapeParameters.Sector::style>
* sectorStyleByFields - {Array{Object}} 按专题字段 themeFields<SuperMap.Layer.Graph::themeFields>为环状图扇形赋 style此参数按字段控制环状图扇形样式
* 优先级低于 sectorStyleByCodomain高于 sectorStyle此数组中的元素是样式对象其可设属性 <SuperMap.Feature.ShapeParameters.Sector::style>
* 此参数中的 style themeFields 中的字段一一对应 例如 themeFields<SuperMap.Layer.Graph::themeFields> ["POP_1992", "POP_1995", "POP_1999"],
* sectorStyleByFields [style1, style2, style3]则在图表中字段 POP_1992 对应的环状图扇形使用 style1字段 POP_1995 对应的环状图扇形使用 style2 字段 POP_1999 对应的环状图扇形使用 style3
* sectorStyleByCodomain - {Array{Object}} 按环状图扇形代表的数据值所在值域范围控制环状图扇形样式优先级高于 sectorStyle sectorStyleByFields
* (start code)
* // sectorStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性:
* // start: 值域值下限(包含);
* // end: 值域值上限(不包含);
* // style: 数据可视化图形的 style这个样式对象的可设属性 <SuperMap.Feature.ShapeParameters.Sector::style> 。
* // sectorStyleByCodomain 数组形如:
* [
* {
* start:0,
* end:250,
* style:{
* fillColor:"#00CD00"
* }
* },
* {
* start:250,
* end:500,
* style:{
* fillColor:"#00EE00"
* }
* },
* {
* start:500,
* end:750,
* style:{
* fillColor:"#00FF7F"
* }
* },
* {
* start:750,
* end:1500,
* style:{
* fillColor:"#00FF00"
* }
* }
* ]
* (end)
* sectorHoverStyle - {Object} 环状图扇形 hover 状态时的样式sectorHoverAble true 时有效
* sectorHoverAble - {Object} 是否允许环状图扇形使用 hover 状态默认允许同时设置 sectorHoverAble sectorClickAble false可以直接屏蔽环状图扇形对专题图层事件的响应
* sectorClickAble - {Object} 是否允许环状图扇形被点击默认允许同时设置 sectorHoverAble sectorClickAble false可以直接屏蔽环状图扇形对专题图层事件的响应
*
* Inherits:
* - <SuperMap.Feature.Theme.Graph>
*/
SuperMap.Feature.Theme.Ring = SuperMap.Class(SuperMap.Feature.Theme.Graph, {
/**
* Constructor: SuperMap.Feature.Theme.Ring
* 创建一个环状图
*
* Parameters:
* data - {<SuperMap.Feature.Vector>} 用户数据必设参数
* layer - {<SuperMap.Layer.Graph>} 此专题要素所在图层必设参数
* fields - {Array{String}} data 中的参与此图表生成的字段名称必设参数
* setting - {Object} 图表配置对象必设参数
* lonlat - {<SuperMap.LonLat>} 专题要素地理位置默认为 data 指代的地理要素 Bounds 中心
*
* Returns:
* {<SuperMap.Feature.Theme.Ring>} 返回一个环状图
*/
initialize: function(data, layer, fields, setting, lonlat) {
SuperMap.Feature.Theme.Graph.prototype.initialize.apply(this, arguments);
},
/**
* APIMethod: destroy
* 销毁此专题要素调用 destroy 后此对象所以属性置为 null
*/
destroy: function() {
SuperMap.Feature.Theme.Graph.prototype.destroy.apply(this, arguments);
},
//装配图形(扩展接口)
assembleShapes: function(){
// 重要步骤:初始化参数
if(!this.initBaseParameter()) return;
// 一个默认 style 组
var defaultStyleGroup = [
{ fillColor: "#ff9277" }, { fillColor: "#dddd00" }, { fillColor: "#ffc877" }, { fillColor: "#bbe3ff" }, { fillColor: "#d5ffbb" },
{ fillColor: "#bbbbff" }, { fillColor: "#ddb000" }, { fillColor: "#b0dd00" }, { fillColor: "#e2bbff" }, { fillColor: "#ffbbe3" },
{ fillColor: "#ff7777" }, { fillColor: "#ff9900" }, { fillColor: "#83dd00" }, { fillColor: "#77e3ff" }, { fillColor: "#778fff" },
{ fillColor: "#c877ff" }, { fillColor: "#ff77ab" }, { fillColor: "#ff6600" }, { fillColor: "#aa8800" }, { fillColor: "#77c7ff" },
{ fillColor: "#ad77ff" }, { fillColor: "#ff77ff" }, { fillColor: "#dd0083" }, { fillColor: "#777700" }, { fillColor: "#00aa00" },
{ fillColor: "#0088aa" }, { fillColor: "#8400dd" }, { fillColor: "#aa0088" }, { fillColor: "#dd0000" }, { fillColor: "#772e00" }
];
// 图表配置对象
var sets = this.setting;
// 背景框,默认不启用
if(sets.useBackground){
this.shapes.push(SuperMap.Feature.ShapeFactory.Background(this.shapeFactory, this.chartBox, sets));
}
// 数据值数组
var fv = this.dataValues;
if(fv.length < 1) return; // 没有数据
// 值域范围
var codomain = this.DVBCodomain;
// 值域范围检测
for(var i = 0; i < fv.length; i++){
if(fv[i] < codomain[0] || fv[i] > codomain[1]) { return; }
}
// 值的绝对值总和
var valueSum = 0;
for(var i = 0; i < fv.length; i++){
valueSum += Math.abs(fv[i]);
}
// 重要步骤:定义图表 Ring 数据视图框中单位值的含义,单位值:每度代表的数值
this.DVBUnitValue = 360/valueSum;
var uv = this.DVBUnitValue;
var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为扇心
var startAngle = 0; // 扇形起始边角度
var endAngle = 0; // 扇形终止边角度
var startAngleTmp = startAngle; // 扇形临时起始边角度
// 扇形外环(自适应)半径
var r = this.DVBHeight < this.DVBWidth? this.DVBHeight/2 : this.DVBWidth/2;
// 扇形内环(自适应)半径
var r0 = (typeof(sets.innerRingRadius) !== "undefined"
&& !isNaN(sets.innerRingRadius)
&& sets.innerRingRadius >= 0
&& sets.innerRingRadius < r)? sets.innerRingRadius: 0;
for(var i = 0; i < fv.length; i++){
var fvi = Math.abs(fv[i]);
// 计算结束角度
if(i === 0){
endAngle = startAngle + fvi*uv;
}
else if(i === fvi.length -1){
endAngle = startAngleTmp;
}
else{
endAngle = startAngle + fvi*uv;
}
// 扇形参数对象
var sectorSP = new SuperMap.Feature.ShapeParameters.Sector(dvbCenter[0], dvbCenter[1], r, startAngle, endAngle, r0);
// 扇形样式
if(typeof(sets.sectorStyleByFields) === "undefined"){
// 使用默认 style 组
var colorIndex = i % defaultStyleGroup.length;
sectorSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, defaultStyleGroup, null, colorIndex);
}
else{
sectorSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, sets.sectorStyleByFields, sets.sectorStyleByCodomain, i, fv[i]);
}
// 扇形 hover 样式
sectorSP.highlightStyle = SuperMap.Feature.ShapeFactory.ShapeStyleTool(null, sets.sectorHoverStyle);
// 扇形 hover 与 click 设置
if(typeof(sets.sectorHoverAble) !== "undefined"){
sectorSP.hoverable = sets.sectorHoverAble;
}
if(typeof(sets.sectorClickAble) !== "undefined"){
sectorSP.clickable = sets.sectorClickAble;
}
// 图形携带的数据信息
sectorSP.refDataID = this.data.id;
sectorSP.dataInfo = {
field: this.fields[i],
value: fv[i]
};;
// 创建扇形并把此扇形添加到图表图形数组
this.shapes.push(this.shapeFactory.createShape(sectorSP));
// 把上一次的结束角度作为下一次的起始角度
startAngle = endAngle;
}
// 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形
// 统计专题图模块从结构上要求使用相对坐标assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数)
this.shapesConvertToRelativeCoordinate();
},
CLASS_NAME: "SuperMap.Feature.Theme.Ring"
});