Bar3D.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. /**
  2. * @requires SuperMap.Feature.Theme.js
  3. * @requires SuperMap.Feature.Theme.Graph.js
  4. */
  5. /**
  6. * Class: SuperMap.Feature.Theme.Bar3D
  7. * 三维柱状图 。
  8. *
  9. * 图表 Bar3D 配置对象 chartsSetting(<SuperMap.Layer.Graph::chartsSetting>) 可设属性如下:
  10. *
  11. * Symbolizer properties:
  12. * width - {Number} 专题要素(图表)宽度,必设参数。
  13. * height - {Number} 专题要素(图表)高度,必设参数。
  14. * codomain - {Array{Number}} 图表允许展示的数据值域,长度为 2 的一维数组,第一个元素表示值域下限,第二个元素表示值域上限,必设参数。
  15. * XOffset - {Number} 专题要素(图表)在 X 方向上的偏移值,单位像素。
  16. * YOffset - {Number} 专题要素(图表)在 Y 方向上的偏移值,单位像素。
  17. * dataViewBoxParameter - {Array{Number}} 数据视图框 dataViewBox 参数,
  18. * 它是指图表框 chartBox (由图表位置、图表宽度、图表高度构成的图表范围框)在左、下,右,上四个方向上的内偏距值。
  19. * 当使用坐标轴时 dataViewBoxParameter 的默认值为:[45, 25, 20, 20];不使用坐标轴时 dataViewBoxParameter 的默认值为:[5, 5, 5, 5]。
  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. * xShapeBlank - {Array{Number}} 水平方向上的图形空白间隔参数。
  28. * 长度为 3 的数组,第一元素表示第一个图形左端与数据视图框左端的空白间距,第二个元素表示图形间空白间距,
  29. * 第三个元素表示最后一个图形右端与数据视图框右端端的空白间距 。
  30. *
  31. * bar3DParameter - {Number} 3D 柱状参数,3d柱形正面相对于背面向 x 轴和 y 轴负方向偏移的绝对值,默认值:10。
  32. *
  33. * useAxis - {Boolean} 是否使用坐标轴,默认使用坐标轴。
  34. * axisStyle - {Object} 坐标轴样式,此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Line::style> 。
  35. * axisUseArrow - {Boolean} 坐标轴是否使用箭头,默认值:true,使用箭头。
  36. * axisYTick - {Number} y 轴刻度数量,默认值:0 ,不使用刻度。
  37. * axisYLabels - {Array{String}} y 轴上的标签组内容,标签顺序沿着数据视图框左面条边自上而下,等距排布。例如:["1000", "750", "500", "250", "0"]。
  38. * axisYLabelsStyle - {Object} y 轴上的标签组样式,此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Label::style> 。
  39. * axisYLabelsOffset - {Array{Number}} y 轴上的标签组偏移量。长度为 2 的数组,数组第一项表示 y 轴标签组横向上的偏移量,向左为正,默认值:0;
  40. * 数组第二项表示 y 轴标签组纵向上的偏移量,向下为正,默认值:0。
  41. * axisXLabels - {Array{String}} x 轴上的标签组内容,标签顺序沿着数据视图框下面条边自左向右排布,例如:["92年", "95年", "99年"]。
  42. * 标签排布规则:当标签数量与 xShapeInfo 中的属性 xShapeCenter 数量相同(即标签个数与数据个数相等时), 按照 xShapeCenter 提供的位置排布标签,
  43. * 否则沿数据视图框下面条边等距排布标签。
  44. * axisXLabelsStyle - {Object} x 轴上的标签组样式,此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Label::style> 。
  45. * axisXLabelsOffset - {Array{Number}} x 轴上的标签组偏移量。长度为 2 的数组,数组第一项表示 x 轴标签组横向上的偏移量,向左为正,默认值:-10;
  46. * 数组第二项表示 x 轴标签组纵向上的偏移量,向下为正,默认值:10。
  47. * useXReferenceLine - {Boolean) 是否使用水平参考线,如果为 true,在 axisYTick 大于 0 时有效,水平参考线是 y 轴刻度在数据视图框里的延伸。
  48. * xReferenceLineStyle - {Object) 水平参考线样式,此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Line::style> 。
  49. * axis3DParameter - {Number} 3D 坐标轴参数,此属性值在大于等于 15 时有效,默认值:20。
  50. *
  51. * barFaceStyle - {Object} 3d 柱状图柱条正面基础 style,此参数控制柱条正面基础样式,优先级低于 barFaceStyleByFields 和 barFaceStyleByCodomain。
  52. * 此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style>。
  53. * barFaceStyleByFields - {Array{Object}} 按专题字段 themeFields(<SuperMap.Layer.Graph::themeFields>)为柱条正面赋 style,此参数按字段控制柱条正面样式,
  54. * 优先级低于 barFaceStyleByCodomain,高于 barFaceStyle。此数组中的元素是样式对象,其可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> 。
  55. * 此参数中的 style 与 themeFields 中的字段一一对应 。例如: themeFields(<SuperMap.Layer.Graph::themeFields>) 为 ["POP_1992", "POP_1995", "POP_1999"],
  56. * barFaceStyleByFields 为[style1, style2, style3],则在图表中,字段 POP_1992 对应的柱条正面使用 style1,字段 POP_1995 对应的柱条正面使用 style2 ,
  57. * 字段 POP_1999 对应的柱条正面使用 style3。
  58. * barFaceStyleByCodomain - {Array{Object}} 按柱条正面代表的数据值所在值域范围控制柱条正面样式,优先级高于 barFaceStyle 和 barFaceStyleByFields。
  59. * (start code)
  60. * // barFaceStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性:
  61. * // start: 值域值下限(包含);
  62. * // end: 值域值上限(不包含);
  63. * // style: 数据可视化图形的 style,这个样式对象的可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> 。
  64. * // barFaceStyleByCodomain 数组形如:
  65. * [
  66. * {
  67. * start:0,
  68. * end:250,
  69. * style:{
  70. * fillColor:"#00CD00"
  71. * }
  72. * },
  73. * {
  74. * start:250,
  75. * end:500,
  76. * style:{
  77. * fillColor:"#00EE00"
  78. * }
  79. * },
  80. * {
  81. * start:500,
  82. * end:750,
  83. * style:{
  84. * fillColor:"#00FF7F"
  85. * }
  86. * },
  87. * {
  88. * start:750,
  89. * end:1500,
  90. * style:{
  91. * fillColor:"#00FF00"
  92. * }
  93. * }
  94. * ]
  95. * (end)
  96. *
  97. * barSideStyle - {Object} 3d 柱状图柱条侧面基础 style,此参数控制柱条侧面基础样式,优先级低于 barSideStyleByFields 和 barSideStyleByCodomain。
  98. * 此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> ,默认值:barFaceStyle。
  99. * barSideStyleByFields - {Array{Object}} 按专题字段 themeFields(<SuperMap.Layer.Graph::themeFields>)为柱条侧面赋 style,此参数按字段控制柱条侧面样式,
  100. * 优先级低于 barSideStyleByCodomain,高于 barSideStyle。此数组中的元素是样式对象,其可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> 。
  101. * 此参数中的 style 与 themeFields 中的字段一一对应 。例如: themeFields(<SuperMap.Layer.Graph::themeFields>) 为 ["POP_1992", "POP_1995", "POP_1999"],
  102. * barSideStyleByFields 为[style1, style2, style3],则在图表中,字段 POP_1992 对应的柱条侧面使用 style1,字段 POP_1995 对应的柱条侧面使用 style2 ,
  103. * 字段 POP_1999 对应的柱条侧面使用 style3。默认值:barFaceStyleByFields。
  104. * barSideStyleByCodomain - {Array{Object}} 按柱条侧面代表的数据值所在值域范围控制柱条侧面样式,优先级高于 barSideStyle 和 barSideStyleByFields。
  105. * 默认值:barFaceStyleByCodomain。
  106. * (start code)
  107. * // barSideStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性:
  108. * // start: 值域值下限(包含);
  109. * // end: 值域值上限(不包含);
  110. * // style: 数据可视化图形的 style,这个样式对象的可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> 。
  111. * // barSideStyleByCodomain 数组形如:
  112. * [
  113. * {
  114. * start:0,
  115. * end:250,
  116. * style:{
  117. * fillColor:"#00CD00"
  118. * }
  119. * },
  120. * {
  121. * start:250,
  122. * end:500,
  123. * style:{
  124. * fillColor:"#00EE00"
  125. * }
  126. * },
  127. * {
  128. * start:500,
  129. * end:750,
  130. * style:{
  131. * fillColor:"#00FF7F"
  132. * }
  133. * },
  134. * {
  135. * start:750,
  136. * end:1500,
  137. * style:{
  138. * fillColor:"#00FF00"
  139. * }
  140. * }
  141. * ]
  142. * (end)
  143. *
  144. * barTopStyle - {Object} 3d 柱状图柱条顶面基础 style,此参数控制柱条顶面基础样式,优先级低于 barTopStyleByFields 和 barTopStyleByCodomain。
  145. * 此样式对象对象可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> ,默认值:barFaceStyle。
  146. * barTopStyleByFields - {Array{Object}} 按专题字段 themeFields(<SuperMap.Layer.Graph::themeFields>)为柱条顶面赋 style,此参数按字段控制柱条顶面样式,
  147. * 优先级低于 barTopStyleByCodomain,高于 barTopStyle。此数组中的元素是样式对象,其可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> 。
  148. * 此参数中的 style 与 themeFields 中的字段一一对应 。例如: themeFields(<SuperMap.Layer.Graph::themeFields>) 为 ["POP_1992", "POP_1995", "POP_1999"],
  149. * barTopStyleByFields 为[style1, style2, style3],则在图表中,字段 POP_1992 对应的柱条顶面使用 style1,字段 POP_1995 对应的柱条顶面使用 style2 ,
  150. * 字段 POP_1999 对应的柱条顶面使用 style3。默认值:barFaceStyleByFields。
  151. * barTopStyleByCodomain - {Array{Object}} 按柱条顶面代表的数据值所在值域范围控制柱条顶面样式,优先级高于 barTopStyle 和 barTopStyleByFields。
  152. * 默认值:barFaceStyleByCodomain。
  153. * (start code)
  154. * // barTopStyleByCodomain 的每个元素是个包含值域信息和与值域对应样式信息的对象,该对象(必须)有三个属性:
  155. * // start: 值域值下限(包含);
  156. * // end: 值域值上限(不包含);
  157. * // style: 数据可视化图形的 style,这个样式对象的可设属性: <SuperMap.Feature.ShapeParameters.Polygon::style> 。
  158. * // barTopStyleByCodomain 数组形如:
  159. * [
  160. * {
  161. * start:0,
  162. * end:250,
  163. * style:{
  164. * fillColor:"#00CD00"
  165. * }
  166. * },
  167. * {
  168. * start:250,
  169. * end:500,
  170. * style:{
  171. * fillColor:"#00EE00"
  172. * }
  173. * },
  174. * {
  175. * start:500,
  176. * end:750,
  177. * style:{
  178. * fillColor:"#00FF7F"
  179. * }
  180. * },
  181. * {
  182. * start:750,
  183. * end:1500,
  184. * style:{
  185. * fillColor:"#00FF00"
  186. * }
  187. * }
  188. * ]
  189. * (end)
  190. *
  191. * barFaceHoverStyle - {Object} 3d 柱条正面 hover 状态时的样式,barHoverAble 为 true 时有效。
  192. * barSideHoverStyle - {Object} 3d 柱条侧面 hover 状态时的样式,barHoverAble 为 true 时有效,默认值:barFaceHoverStyle。
  193. * barTopHoverStyle - {Object} 3d 柱条顶面 hover 状态时的样式,barHoverAble 为 true 时有效,默认值:barFaceHoverStyle。
  194. *
  195. * barHoverAble - {Object} 是否允许柱条使用 hover 状态,默认允许。同时设置 barHoverAble 和 barClickAble 为 false,可以直接屏蔽柱条对专题图层事件的响应。
  196. * barClickAble - {Object} 是否允许柱条被点击,默认允许。同时设置 barHoverAble 和 barClickAble 为 false,可以直接屏蔽柱条对专题图层事件的响应。
  197. *
  198. * Inherits:
  199. * - <SuperMap.Feature.Theme.Graph>
  200. */
  201. SuperMap.Feature.Theme.Bar3D = SuperMap.Class(SuperMap.Feature.Theme.Graph, {
  202. /**
  203. * Constructor: SuperMap.Feature.Theme.Bar3D
  204. * 创建一个三维柱状图表。
  205. *
  206. * Parameters:
  207. * data - {<SuperMap.Feature.Vector>} 用户数据,必设参数。
  208. * layer - {<SuperMap.Layer.Graph>} 此专题要素所在图层,必设参数。
  209. * fields - {Array{String}} data 中的参与此图表生成的字段名称,必设参数。
  210. * setting - {Object} 图表配置对象,必设参数。
  211. * lonlat - {<SuperMap.LonLat>} 专题要素地理位置。默认为 data 指代的地理要素 Bounds 中心。
  212. *
  213. * Returns:
  214. * {<SuperMap.Feature.Theme.Bar3D>} 返回一个三维柱状图表对象。
  215. */
  216. initialize: function(data, layer, fields, setting, lonlat) {
  217. SuperMap.Feature.Theme.Graph.prototype.initialize.apply(this, arguments);
  218. },
  219. /**
  220. * APIMethod: destroy
  221. * 销毁此专题要素。调用 destroy 后此对象所以属性置为 null。
  222. */
  223. destroy: function() {
  224. SuperMap.Feature.Theme.Graph.prototype.destroy.apply(this, arguments);
  225. },
  226. /**
  227. * Method: assembleShapes
  228. * 图形装配实现(扩展接口)
  229. */
  230. assembleShapes: function(){
  231. // 图表配置对象
  232. var sets = this.setting;
  233. // 默认数据视图框
  234. if(!sets.dataViewBoxParameter){
  235. if(typeof(sets.useAxis) === "undefined" || sets.useAxis){
  236. sets.dataViewBoxParameter = [45, 25, 20, 20];
  237. }
  238. else{
  239. sets.dataViewBoxParameter = [5, 5, 5, 5];
  240. }
  241. }
  242. // 3d 柱图的坐标轴默认使用坐标轴箭头
  243. sets.axisUseArrow = (typeof(sets.axisUseArrow) !== "undefined")? sets.axisUseArrow: true;
  244. sets.axisXLabelsOffset = (typeof(sets.axisXLabelsOffset) !== "undefined")? sets.axisXLabelsOffset: [-10, 10];
  245. // 重要步骤:初始化参数
  246. if(!this.initBaseParameter()) return;
  247. // 值域
  248. var codomain = this.DVBCodomain;
  249. // 重要步骤:定义图表 Bar 数据视图框中单位值的含义
  250. this.DVBUnitValue = (codomain[1]-codomain[0])/this.DVBHeight;
  251. // 数据视图域
  252. var dvb = this.dataViewBox;
  253. // 用户数据值
  254. var fv = this.dataValues;
  255. if(fv.length < 1) return; // 没有数据
  256. // 数据溢出值域范围处理
  257. for(var i = 0, fvLen = fv.length; i < fvLen; i++){
  258. if(fv[i] < codomain[0] || fv[i] > codomain[1]) return;
  259. }
  260. // 获取 x 轴上的图形信息
  261. var xShapeInfo = this.calculateXShapeInfo(dvb, sets, "Bar3D", fv.length);
  262. if(!xShapeInfo) return;
  263. // 每个柱条 x 位置
  264. var xsLoc = xShapeInfo.xPositions;
  265. // 柱条宽度
  266. var xsWdith = xShapeInfo.width;
  267. // 坐标轴, 默认启用
  268. if(typeof(sets.useBackground) === "undefined" || sets.useBackground){
  269. this.shapes.push(SuperMap.Feature.ShapeFactory.Background(this.shapeFactory, this.chartBox, sets));
  270. }
  271. // 坐标轴
  272. if(!sets.axis3DParameter || isNaN(sets.axis3DParameter) || sets.axis3DParameter < 15){
  273. sets.axis3DParameter = 20;
  274. }
  275. if(typeof(sets.useAxis) === "undefined" || sets.useAxis){
  276. this.shapes = this.shapes.concat(SuperMap.Feature.ShapeFactory.GraphAxis(this.shapeFactory, dvb, sets, xShapeInfo));
  277. }
  278. // 3d 偏移量, 默认值 10;
  279. var offset3d = (sets.bar3DParameter && !isNaN(sets.bar3DParameter))? sets.bar3DParameter: 10;
  280. for(var i = 0; i < fv.length; i++){
  281. // 无 3d 偏移量时的柱面顶部 y 坐标
  282. var yPx = dvb[1] - (fv[i] - codomain[0])/this.DVBUnitValue;
  283. // 无 3d 偏移量时的柱面的左、右端 x 坐标
  284. var iPoiL = xsLoc[i] - xsWdith/2;
  285. var iPoiR = xsLoc[i] + xsWdith/2;
  286. // 3d 柱顶面节点
  287. var bar3DTopPois = [
  288. [iPoiL, yPx],
  289. [iPoiR, yPx],
  290. [iPoiR - offset3d, yPx + offset3d],
  291. [iPoiL - offset3d, yPx + offset3d]
  292. ];
  293. // 3d 柱侧面节点
  294. var bar3DSidePois = [
  295. [iPoiR, yPx],
  296. [iPoiR - offset3d, yPx + offset3d],
  297. [iPoiR - offset3d, dvb[1] + offset3d],
  298. [iPoiR, dvb[1]]
  299. ];
  300. // 3d 柱正面节点
  301. var bar3DFacePois = [
  302. [iPoiL - offset3d, dvb[1] + offset3d],
  303. [iPoiR - offset3d, dvb[1] + offset3d],
  304. [iPoiR - offset3d, yPx + offset3d],
  305. [iPoiL - offset3d, yPx + offset3d]
  306. ];
  307. if(offset3d <= 0){ // offset3d <= 0 时正面不偏移
  308. bar3DFacePois = [
  309. [iPoiL, dvb[1]],
  310. [iPoiR, dvb[1]],
  311. [iPoiR, yPx],
  312. [iPoiL, yPx]
  313. ];
  314. }
  315. // 新建 3d 柱面顶面、侧面、正面图形参数对象
  316. var polyTopSP = new SuperMap.Feature.ShapeParameters.Polygon(bar3DTopPois);
  317. var polySideSP = new SuperMap.Feature.ShapeParameters.Polygon(bar3DSidePois);
  318. var polyFaceSP = new SuperMap.Feature.ShapeParameters.Polygon(bar3DFacePois);
  319. // 侧面、正面图形 style 默认值
  320. sets.barSideStyle = sets.barSideStyle? sets.barSideStyle: sets.barFaceStyle;
  321. sets.barSideStyleByFields = sets.barSideStyleByFields? sets.barSideStyleByFields: sets.barFaceStyleByFields;
  322. sets.barSideStyleByCodomain = sets.barSideStyleByCodomain? sets.barSideStyleByCodomain: sets.barFaceStyleByCodomain;
  323. sets.barTopStyle = sets.barTopStyle? sets.barTopStyle: sets.barFaceStyle;
  324. sets.barTopStyleByFields = sets.barTopStyleByFields? sets.barTopStyleByFields: sets.barFaceStyleByFields;
  325. sets.barTopStyleByCodomain = sets.barTopStyleByCodomain? sets.barTopStyleByCodomain: sets.barFaceStyleByCodomain;
  326. // 顶面、侧面、正面图形 style
  327. polyFaceSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool({stroke: true, strokeColor: "#ffffff", fillColor: "#ee9900"},
  328. sets.barFaceStyle, sets.barFaceStyleByFields, sets.barFaceStyleByCodomain, i, fv[i]);
  329. polySideSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool({stroke: true, strokeColor: "#ffffff", fillColor: "#ee9900"},
  330. sets.barSideStyle, sets.barSideStyleByFields, sets.barSideStyleByCodomain, i, fv[i]);
  331. polyTopSP.style = SuperMap.Feature.ShapeFactory.ShapeStyleTool({stroke: true, strokeColor: "#ffffff", fillColor: "#ee9900"},
  332. sets.barTopStyle, sets.barTopStyleByFields, sets.barTopStyleByCodomain, i, fv[i]);
  333. // 3d 柱条高亮样式
  334. sets.barSideHoverStyle = sets.barSideHoverStyle? sets.barSideHoverStyle: sets.barFaceHoverStyle;
  335. sets.barTopHoverStyle = sets.barTopHoverStyle? sets.barTopHoverStyle: sets.barFaceHoverStyle;
  336. polyFaceSP.highlightStyle = SuperMap.Feature.ShapeFactory.ShapeStyleTool({stroke: true}, sets.barFaceHoverStyle);
  337. polySideSP.highlightStyle = SuperMap.Feature.ShapeFactory.ShapeStyleTool({stroke: true}, sets.barSideHoverStyle);
  338. polyTopSP.highlightStyle = SuperMap.Feature.ShapeFactory.ShapeStyleTool({stroke: true}, sets.barTopHoverStyle);
  339. // 图形携带的数据 id 信息 & 高亮模式
  340. polyTopSP.refDataID = polySideSP.refDataID = polyFaceSP.refDataID = this.data.id;
  341. // hover 模式(组合)
  342. polyTopSP.isHoverByRefDataID = polySideSP.isHoverByRefDataID = polyFaceSP.isHoverByRefDataID = true;
  343. // 高亮组(当鼠标 hover 到组内任何一个图形,整个组的图形都会高亮。refDataHoverGroup 在 isHoverByRefDataID 为 true 时有效)
  344. polyTopSP.refDataHoverGroup = polySideSP.refDataHoverGroup = polyFaceSP.refDataHoverGroup = SuperMap.Util.createUniqueID("lr_shg");
  345. // 图形携带的数据信息
  346. polyTopSP.dataInfo = polySideSP.dataInfo = polyFaceSP.dataInfo = {
  347. field: this.fields[i],
  348. value: fv[i]
  349. };
  350. // 3d 柱条顶面、侧面、正面图形 hover click 设置
  351. if(typeof(sets.barHoverAble) !== "undefined"){
  352. polyTopSP.hoverable = polySideSP.hoverable = polyFaceSP.hoverable = sets.barHoverAble;
  353. }
  354. if(typeof(sets.barClickAble) !== "undefined"){
  355. polyTopSP.clickable = polySideSP.clickable = polyFaceSP.clickable = sets.barClickAble;
  356. }
  357. // 创建3d 柱条的顶面、侧面、正面图形并添加到图表的图形列表数组
  358. this.shapes.push(this.shapeFactory.createShape(polySideSP));
  359. this.shapes.push(this.shapeFactory.createShape(polyTopSP));
  360. this.shapes.push(this.shapeFactory.createShape(polyFaceSP));
  361. }
  362. // 重要步骤:将图形转为由相对坐标表示的图形,以便在地图平移缩放过程中快速重绘图形
  363. // (统计专题图模块从结构上要求使用相对坐标,assembleShapes() 函数必须在图形装配完成后调用 shapesConvertToRelativeCoordinate() 函数)
  364. this.shapesConvertToRelativeCoordinate();
  365. },
  366. /**
  367. * Method: calculateXShapeInfo
  368. * 计算 X 轴方向上的图形信息,此信息是一个对象,包含两个属性,
  369. * 属性 xPositions 是一个一维数组,该数组元素表示图形在 x 轴方向上的像素坐标值,
  370. * 如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。
  371. * width 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。
  372. *
  373. * 本函数中图形配置对象 setting 可设属性:
  374. * Symbolizer properties:
  375. * xShapeBlank - {Array{Number}} 水平方向上的图形空白间隔参数。
  376. * 长度为 3 的数组,第一元素表示第一个图形左端与数据视图框左端的空白间距,第二个元素表示图形间空白间距,
  377. * 第三个元素表示最后一个图形右端与数据视图框右端端的空白间距 。
  378. *
  379. * Returns:
  380. * {Object} 如果计算失败,返回 null;如果计算成功,返回 X 轴方向上的图形信息,此信息是一个对象,包含以下两个属性:
  381. * Symbolizer properties:
  382. * xPositions - {Array{Number}} 表示图形在 x 轴方向上的像素坐标值,如果图形在 x 方向上有一定宽度,通常取图形在 x 方向上的中心点为图形在 x 方向上的坐标值。
  383. * width - {Number} 表示图形的宽度(特别注意:点的宽度始终为 0,而不是其直径)。
  384. *
  385. */
  386. calculateXShapeInfo: function(){
  387. var dvb = this.dataViewBox; // 数据视图框
  388. var sets = this.setting; // 图表配置对象
  389. var fvc = this.dataValues.length; // 数组值个数
  390. if(fvc < 1) return null;
  391. var xBlank; // x 轴空白间隔参数
  392. var xShapePositions = []; // x 轴上图形的位置
  393. var xShapeWidth = 0; // x 轴上图形宽度(自适应)
  394. var dvbWidth = this.DVBWidth; // 数据视图框宽度
  395. // x 轴空白间隔参数处理
  396. if(sets.xShapeBlank && sets.xShapeBlank.length && sets.xShapeBlank.length == 3){
  397. xBlank = sets.xShapeBlank;
  398. var xsLen = dvbWidth - (xBlank[0] + xBlank[2] + (fvc - 1)*xBlank[1])
  399. if(xsLen <= fvc){ return null; }
  400. xShapeWidth = xsLen/fvc
  401. }
  402. else{
  403. // 默认使用等距离空白间隔,空白间隔为图形宽度
  404. xShapeWidth = dvbWidth/(2*fvc + 1);
  405. xBlank = [xShapeWidth, xShapeWidth, xShapeWidth];
  406. }
  407. // 图形 x 轴上的位置计算
  408. var xOffset = 0
  409. for(var i = 0; i < fvc; i++){
  410. if(i == 0){
  411. xOffset = xBlank[0] + xShapeWidth/2;
  412. }
  413. else{
  414. xOffset += (xShapeWidth + xBlank[1]);
  415. }
  416. xShapePositions.push(dvb[0] + xOffset);
  417. }
  418. return {
  419. "xPositions": xShapePositions,
  420. "width": xShapeWidth
  421. };
  422. },
  423. CLASS_NAME: "SuperMap.Feature.Theme.Bar3D"
  424. });