Pie.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /**
  2. * @requires SuperMap.Feature.Theme.js
  3. * @requires SuperMap.Feature.Theme.Graph.js
  4. *
  5. */
  6. /**
  7. * Class: SuperMap.Feature.Theme.Pie
  8. * 饼图 。
  9. *
  10. * 图表 Pie 配置对象 chartsSetting(<SuperMap.Layer.Graph::chartsSetting>) 可设属性如下:
  11. *
  12. * Symbolizer properties:
  13. * width - {Number} 专题要素(图表)宽度,必设参数。
  14. * height - {Number} 专题要素(图表)高度,必设参数。
  15. * codomain - {Array{Number}} 图表允许展示的数据值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限,必设参数。
  16. * XOffset - {Number} 专题要素(图表)在 X 方向上的偏移值,单位像素。
  17. * YOffset - {Number} 专题要素(图表)在 Y 方向上的偏移值,单位像素。
  18. * dataViewBoxParameter - {Array{Number}} 数据视图框 dataViewBox 参数,
  19. * 它是指图表框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。默认值为:[0, 0, 0, 0]。
  20. * decimalNumber - {Number} 数据值数组 dataValues 元素值小数位数,数据的小数位处理参数,取值范围:[0, 16]。如果不设置此参数,在取数据值时不对数据做小数位处理。
  21. *
  22. * useBackground - {Boolean} 是否使用图表背景框,默认不使用。
  23. * backgroundStyle - {Object} 背景样式,此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Rectangle::style>。
  24. * backgroundRadius - {Array} 背景框矩形圆角半径,可以用数组分别指定四个角的圆角半径,设:左上、右上、右下、左下角的半径依次为 r1、r2、r3、r4 ,
  25. * 则 backgroundRadius 为 [r1、r2、r3、r4 ],默认值[0, 0, 0, 0]。
  26. *
  27. * sectorStyle - {Object} 饼图中扇形的基础 style,此参数控制饼图扇形基础样式,优先级低于 sectorStyleByFields 和 sectorStyleByCodomain。
  28. * 此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Sector::style> 。
  29. * sectorStyleByFields - {Array{Object}} 按专题字段 themeFields(<SuperMap.Layer.Graph::themeFields>)为饼图扇形赋 style,此参数按字段控制饼图扇形样式,
  30. * 优先级低于 sectorStyleByCodomain,高于 sectorStyle。此数组中的元素是样式对象,其可设属性: <SuperMap.Feature.ShapeParameters.Sector::style> 。
  31. * 此参数中的 style 与 themeFields 中的字段一一对应 。例如: themeFields(<SuperMap.Layer.Graph::themeFields>) 为 ["POP_1992", "POP_1995", "POP_1999"],
  32. * sectorStyleByFields 为[style1, style2, style3],则在图表中,字段 POP_1992 对应的饼图扇形使用 style1,字段 POP_1995 对应的饼图扇形使用 style2 ,字段 POP_1999 对应的饼图扇形使用 style3。
  33. * sectorStyleByCodomain - {Array{Object}} 按饼图扇形代表的数据值所在值域范围控制饼图扇形样式,优先级高于 sectorStyle 和 sectorStyleByFields。
  34. * (start code)
  35. * // sectorStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性:
  36. * // start: 值域值下限(包含);
  37. * // end: 值域值上限(不包含);
  38. * // style: 数据可视化图形的 style,这个样式对象的可设属性: <SuperMap.Feature.ShapeParameters.Sector::style> 。
  39. * // sectorStyleByCodomain 数组形如:
  40. * [
  41. * {
  42. * start:0,
  43. * end:250,
  44. * style:{
  45. * fillColor:"#00CD00"
  46. * }
  47. * },
  48. * {
  49. * start:250,
  50. * end:500,
  51. * style:{
  52. * fillColor:"#00EE00"
  53. * }
  54. * },
  55. * {
  56. * start:500,
  57. * end:750,
  58. * style:{
  59. * fillColor:"#00FF7F"
  60. * }
  61. * },
  62. * {
  63. * start:750,
  64. * end:1500,
  65. * style:{
  66. * fillColor:"#00FF00"
  67. * }
  68. * }
  69. * ]
  70. * (end)
  71. * sectorHoverStyle - {Object} 饼图扇形 hover 状态时的样式,sectorHoverAble 为 true 时有效。
  72. * sectorHoverAble - {Object} 是否允许饼图扇形使用 hover 状态,默认允许。同时设置 sectorHoverAble 和 sectorClickAble 为 false,可以直接屏蔽饼图扇形对专题图层事件的响应。
  73. * sectorClickAble - {Object} 是否允许饼图扇形被点击,默认允许。同时设置 sectorHoverAble 和 sectorClickAble 为 false,可以直接屏蔽饼图扇形对专题图层事件的响应。
  74. *
  75. * Inherits:
  76. * - <SuperMap.Feature.Theme.Graph>
  77. */
  78. SuperMap.Feature.Theme.Pie = SuperMap.Class(SuperMap.Feature.Theme.Graph, {
  79. /**
  80. * Constructor: SuperMap.Feature.Theme.Pie
  81. * 创建一个饼图。
  82. *
  83. * Parameters:
  84. * data - {<SuperMap.Feature.Vector>} 用户数据,必设参数。
  85. * layer - {<SuperMap.Layer.Graph>} 此专题要素所在图层,必设参数。
  86. * fields - {Array{String}} data 中的参与此图表生成的字段名称,必设参数。
  87. * setting - {Object} 图表配置对象,必设参数。
  88. * lonlat - {<SuperMap.LonLat>} 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。
  89. *
  90. * Returns:
  91. * {<SuperMap.Feature.Theme.Pie>} 返回一个饼图。
  92. */
  93. initialize: function(data, layer, fields, setting, lonlat) {
  94. SuperMap.Feature.Theme.Graph.prototype.initialize.apply(this, arguments);
  95. },
  96. /**
  97. * APIMethod: destroy
  98. * 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。
  99. */
  100. destroy: function() {
  101. SuperMap.Feature.Theme.Graph.prototype.destroy.apply(this, arguments);
  102. },
  103. //装配图形(扩展接口)
  104. assembleShapes: function(){
  105. // 图表配置对象
  106. var sets = this.setting;
  107. // 一个默认 style 组
  108. var defaultStyleGroup = [
  109. { fillColor: "#ff9277" }, { fillColor: "#dddd00" }, { fillColor: "#ffc877" }, { fillColor: "#bbe3ff" }, { fillColor: "#d5ffbb" },
  110. { fillColor: "#bbbbff" }, { fillColor: "#ddb000" }, { fillColor: "#b0dd00" }, { fillColor: "#e2bbff" }, { fillColor: "#ffbbe3" },
  111. { fillColor: "#ff7777" }, { fillColor: "#ff9900" }, { fillColor: "#83dd00" }, { fillColor: "#77e3ff" }, { fillColor: "#778fff" },
  112. { fillColor: "#c877ff" }, { fillColor: "#ff77ab" }, { fillColor: "#ff6600" }, { fillColor: "#aa8800" }, { fillColor: "#77c7ff" },
  113. { fillColor: "#ad77ff" }, { fillColor: "#ff77ff" }, { fillColor: "#dd0083" }, { fillColor: "#777700" }, { fillColor: "#00aa00" },
  114. { fillColor: "#0088aa" }, { fillColor: "#8400dd" }, { fillColor: "#aa0088" }, { fillColor: "#dd0000" }, { fillColor: "#772e00" }
  115. ];
  116. // 重要步骤:初始化参数
  117. if(!this.initBaseParameter()) return;
  118. // 背景框,默认不启用
  119. if(sets.useBackground){
  120. this.shapes.push(SuperMap.Feature.ShapeFactory.Background(this.shapeFactory, this.chartBox, sets));
  121. }
  122. // 数据值数组
  123. var fv = this.dataValues;
  124. if(fv.length < 1) return; // 没有数据
  125. // 值域范围
  126. var codomain = this.DVBCodomain;
  127. // 值域范围检测
  128. for(var i = 0; i < fv.length; i++){
  129. if(fv[i] < codomain[0] || fv[i] > codomain[1]) { return; }
  130. }
  131. // 值的绝对值总和
  132. var valueSum = 0;
  133. for(var i = 0; i < fv.length; i++){
  134. valueSum += Math.abs(fv[i]);
  135. }
  136. // 重要步骤:定义图表 Pie 数据视图框中单位值的含义,单位值:每度代表的数值
  137. this.DVBUnitValue = 360/valueSum;
  138. var uv = this.DVBUnitValue;
  139. var dvbCenter = this.DVBCenterPoint; // 数据视图框中心作为扇心
  140. var startAngle = 0; // 扇形起始边角度
  141. var endAngle = 0; // 扇形终止边角度
  142. var startAngleTmp = startAngle; // 扇形临时起始边角度
  143. // 扇形(自适应)半径
  144. var r = this.DVBHeight < this.DVBWidth? this.DVBHeight/2 : this.DVBWidth/2;
  145. for(var i = 0; i < fv.length; i++){
  146. var fvi = Math.abs(fv[i]);
  147. //计算终止角
  148. if(i === 0){
  149. endAngle = startAngle + fvi*uv;
  150. }
  151. else if(i === fvi.length -1){
  152. endAngle = startAngleTmp;
  153. }
  154. else{
  155. endAngle = startAngle + fvi*uv;
  156. }
  157. //矫正误差计算
  158. if((endAngle-startAngle)>=360) endAngle =359.9999999;
  159. // 扇形参数对象
  160. var sectorSP = new SuperMap.Feature.ShapeParameters.Sector(dvbCenter[0], dvbCenter[1], r, startAngle, endAngle);
  161. // 扇形样式
  162. if(typeof(sets.sectorStyleByFields) === "undefined"){
  163. // 使用默认 style 组
  164. var colorIndex = i % defaultStyleGroup.length;
  165. sectorSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, defaultStyleGroup, null, colorIndex);
  166. }
  167. else{
  168. sectorSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool(null, sets.sectorStyle, sets.sectorStyleByFields, sets.sectorStyleByCodomain, i, fv[i]);
  169. }
  170. // 扇形 hover 样式
  171. sectorSP.highlightStyle = SuperMap.Feature.ShapeFactory.ShapeStyleTool(null, sets.sectorHoverStyle);
  172. // 扇形 hover 与 click 设置
  173. if(typeof(sets.sectorHoverAble) !== "undefined"){
  174. sectorSP.hoverable = sets.sectorHoverAble;
  175. }
  176. if(typeof(sets.sectorClickAble) !== "undefined"){
  177. sectorSP.clickable = sets.sectorClickAble;
  178. }
  179. // 图形携带的数据信息
  180. sectorSP.refDataID = this.data.id;
  181. sectorSP.dataInfo = {
  182. field: this.fields[i],
  183. value: fv[i]
  184. };
  185. // 创建扇形并把此扇形添加到图表图形数组
  186. this.shapes.push(this.shapeFactory.createShape(sectorSP));
  187. // 把上一次的结束角度作为下一次的起始角度
  188. startAngle = endAngle;
  189. }
  190. // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形
  191. // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数)
  192. this.shapesConvertToRelativeCoordinate();
  193. },
  194. CLASS_NAME: "SuperMap.Feature.Theme.Pie"
  195. });