mapDataStatistic.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. var zrUtil = require("zrender/lib/core/util");
  2. // FIXME 公用?
  3. /**
  4. * @param {Array.<module:echarts/data/List>} datas
  5. * @param {string} statisticType 'average' 'sum'
  6. * @inner
  7. */
  8. function dataStatistics(datas, statisticType) {
  9. var dataNameMap = {};
  10. var dims = ['value'];
  11. zrUtil.each(datas, function (data) {
  12. data.each(dims, function (value, idx) {
  13. // Add prefix to avoid conflict with Object.prototype.
  14. var mapKey = 'ec-' + data.getName(idx);
  15. dataNameMap[mapKey] = dataNameMap[mapKey] || [];
  16. if (!isNaN(value)) {
  17. dataNameMap[mapKey].push(value);
  18. }
  19. });
  20. });
  21. return datas[0].map(dims, function (value, idx) {
  22. var mapKey = 'ec-' + datas[0].getName(idx);
  23. var sum = 0;
  24. var min = Infinity;
  25. var max = -Infinity;
  26. var len = dataNameMap[mapKey].length;
  27. for (var i = 0; i < len; i++) {
  28. min = Math.min(min, dataNameMap[mapKey][i]);
  29. max = Math.max(max, dataNameMap[mapKey][i]);
  30. sum += dataNameMap[mapKey][i];
  31. }
  32. var result;
  33. if (statisticType === 'min') {
  34. result = min;
  35. } else if (statisticType === 'max') {
  36. result = max;
  37. } else if (statisticType === 'average') {
  38. result = sum / len;
  39. } else {
  40. result = sum;
  41. }
  42. return len === 0 ? NaN : result;
  43. });
  44. }
  45. function _default(ecModel) {
  46. var seriesGroups = {};
  47. ecModel.eachSeriesByType('map', function (seriesModel) {
  48. var hostGeoModel = seriesModel.getHostGeoModel();
  49. var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();
  50. (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel);
  51. });
  52. zrUtil.each(seriesGroups, function (seriesList, key) {
  53. var data = dataStatistics(zrUtil.map(seriesList, function (seriesModel) {
  54. return seriesModel.getData();
  55. }), seriesList[0].get('mapValueCalculation'));
  56. for (var i = 0; i < seriesList.length; i++) {
  57. seriesList[i].originalData = seriesList[i].getData();
  58. } // FIXME Put where?
  59. for (var i = 0; i < seriesList.length; i++) {
  60. seriesList[i].seriesGroup = seriesList;
  61. seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel();
  62. seriesList[i].setData(data.cloneShallow());
  63. seriesList[i].mainSeries = seriesList[0];
  64. }
  65. });
  66. }
  67. module.exports = _default;