UNPKG

@dfsj/echarts

Version:

专业的水文曲线组件或构造函数以及通用的echart二次封装图表

387 lines (383 loc) 13.7 kB
/** * * @dfsj/echarts: 专业的水文曲线组件或构造函数以及通用的echart二次封装图表 * 版本: v3.7.0-alpha.5 * 作者:yangbo <1747837358@qq.com> * 日期:2025-11-21 13:30:34 * * */ import assign from '../../utils/assign.js'; import { toArea, to, findNowIndex, numeralFormat } from '../../utils/tools.js'; import last from 'lodash-es/last'; import config, { TYPE_SYMBOL } from '../../config.js'; import def, { IMAGES, TYPES } from './default.js'; import img from './images/-1.png.js'; import { createLinearInterpolator } from 'commons-math-interpolation/Linear'; import units from '../../utils/units.js'; import { useECharts } from '../../hooks/useECharts.js'; function useDamSchematic(chartRef) { var _useECharts = useECharts(chartRef), setOptions = _useECharts.setOptions, echarts = _useECharts.echarts, getInstance = _useECharts.getInstance, container = _useECharts.container; var assemble = function assemble(value, options) { var chart = getInstance(); var optioned = assign({}, def, options); var times, points = value === null || value === void 0 ? void 0 : value.points; if (points !== null && points !== void 0 && points.length) { var source = value.source || []; var area = toArea(optioned.$area, value.area, source); var grid = optioned.grid; var availableHeight = chart.getHeight() - (grid.top + grid.bottom); var availableWidth = chart.getWidth() - (grid.left + grid.right); optioned.graphic.style.image = IMAGES[value.type] || img; optioned.graphic.style.width = availableWidth; optioned.graphic.style.height = availableHeight; var _cfg = TYPES[value.type]; var section = _cfg.section.slice(); var top = (points.find(function (e) { return e.type === 'top'; }) || last(value.points)).altitude; var bom = (points.find(function (e) { return e.type === 'bottom'; }) || points[0]).altitude; var diff = top - bom; var scale = availableHeight / section[3]; var pixel = diff / (section[1] * scale); var min = bom - section[0] * scale * pixel; var max = min + scale * section[3] * pixel; var limit = bom; var counter = 0; optioned.yAxis.min = min; optioned.yAxis.max = max; optioned.series[0] = { z: 9, type: 'custom' }; optioned.series[0].data = points.slice().filter(function (e) { return e.altitude && e.type !== 'bottom'; }).sort(function (a, b) { return b.altitude - a.altitude; }).map(function (e) { var x1 = _cfg.point((e.altitude - min) / pixel / scale); var y1 = e.altitude; var x2 = _cfg.mark[0]; var y2 = min + (_cfg.mark[1] - counter * 70) * scale * pixel; var x3 = _cfg.mark[0] + 50; var symbol = e.symbol || TYPE_SYMBOL[e.type]; if (symbol == null) counter++; return { value: [x1, y1, x2, y2, x3, y2, e.label || e.name, symbol, e.level, e.color] }; }); optioned.series[0].renderItem = function (params, api) { var index = chart.getOption().timeline[0].currentIndex; var stage = source.length ? source[index][1] : 0; return renderAltitude(params, api, stage, 1); }; times = source.map(function (e) { var _value$dimensions, _value$dimensions2; var c = e[1]; if (bom - e[1] > 1) e[1] = bom; if (top - e[1] < 1) e[1] = top; var x1 = _cfg.water[0]((e[1] - limit) / pixel / scale); var x2 = _cfg.water[1]((e[1] - limit) / pixel / scale); var y = limit + (e[1] - limit) / 2; var amplitude = 3; return { title: { text: ['时间:' + e[0], e[1] != null ? "\u6C34\u4F4D\uFF1A".concat(to(e[1]), "\uFF08m\uFF09") : '', e[2] != null ? "\u5E93\u5BB9\uFF1A".concat(to(e[2]), "\uFF08").concat(value === null || value === void 0 || (_value$dimensions = value.dimensions) === null || _value$dimensions === void 0 || (_value$dimensions = _value$dimensions[2]) === null || _value$dimensions === void 0 ? void 0 : _value$dimensions.unit, "\uFF09") : ''].join(' '), subtext: c !== e[1] ? "\u6570\u636E\u6709\u8BEF\uFF0C\u5DF2\u8FDB\u884C\u8C03\u6574\uFF0C\u539F\u6C34\u4F4D\uFF1A".concat(c, "\uFF08m\uFF09") : undefined }, series: [{}, assign({ data: [[0, e[1]], [x1, e[1]], [x2, optioned.yAxis.min]], amplitude: amplitude }, optioned.$water), assign({ data: [assign({ value: [40, e[1]], label: { formatter: "\u5F53\u524D\u6C34\u4F4D\uFF1A".concat(to(e[1]), "\uFF08m\uFF09") } }, optioned.$stage), assign({ value: [40, y], label: { formatter: "\u5F53\u524D\u5E93\u5BB9\uFF1A".concat(to(e[2]), "\uFF08").concat(value === null || value === void 0 || (_value$dimensions2 = value.dimensions) === null || _value$dimensions2 === void 0 || (_value$dimensions2 = _value$dimensions2[2]) === null || _value$dimensions2 === void 0 ? void 0 : _value$dimensions2.unit, "\uFF09") } }, optioned.$capacity)] }, optioned.$current)] }; }); optioned.timeline.data = source.map(function (e, i) { if (area == null) return { value: e[0], tooltip: { formatter: e[0] } }; var mark = area.find(function (e) { return e.index[0] <= i && i <= e.index[1]; }); var tooltip = { formatter: mark ? "".concat(mark.title, " ").concat(e[0]) : e[0] }; return assign({ tooltip: tooltip, value: e[0] }, mark); }); try { var x = Array.from(new Set([bom].concat(source.map(function (e) { return e[1]; }).sort()))); var y = Array.from(new Set([0x0].concat(source.map(function (e) { return e[2]; }).sort()))); var interpolator = createLinearInterpolator(x, y); optioned.tooltip.formatter = function (p) { var index = chart.getOption().timeline[0].currentIndex; var stage = source[index][1], current = source[index][2]; var capacity = interpolator(p.value[1]); var capDiff = interpolator(p.value[1]) - current; var staDiff = p.value[1] - stage; return tooltip(p.value[6], capacity, capDiff, staDiff, value.dimensions[2].unit); }; } catch (e) {} var history = area === null || area === void 0 ? void 0 : area.find(function (e) { return e.type = 'history'; }); optioned.timeline.currentIndex = history == null ? findNowIndex(source) : Math.max(history.index[1], 0); } return { baseOption: optioned, options: times }; }; var tooltip = function tooltip(name, capacity, capDiff, staDiff, unit) { return "<article class=\"tooltip\">\n <fieldset>\n <legend>".concat(name, "</legend>\n <li><i>\u5BF9\u5E94\u5E93\u5BB9</i><i>").concat(to(capacity), "\uFF08").concat(unit, "\uFF09</i></li>\n <li><i>\u5E93\u5BB9\u5DEE</i><i>").concat(to(capDiff), "\uFF08").concat(unit, "\uFF09</i></li>\n <li><i>\u6C34\u4F4D\u5DEE</i><i>").concat(to(staDiff), "\uFF08m\uFF09</i></li>\n </fieldset>\n </article>"); }; var renderAltitude = function renderAltitude(params, api, current) { var scale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; var p1 = api.coord([api.value(0), api.value(1)]); var p2 = api.coord([api.value(2), api.value(3)]); var p3 = api.coord([api.value(4), api.value(5)]); var symbol = api.value(7), stage = api.value(1); var text = "".concat(api.value(6), "\uFF1A").concat(to(api.value(1)), "\uFF08m\uFF09"); var color = current >= stage && config.indexColor[api.value(8)] || api.value(9) || config.markColor.safe; var shadow = 'rgba(51,51,51,0.6)'; if (symbol === 'stage') { return { type: 'group', z2: 1, children: [{ type: 'path', z2: 1, shape: { pathData: config.icon.stage, x: p1[0] - 3 * scale, y: p1[1] - 18.5 * scale, width: 190 * scale, height: 30 * scale }, style: { fill: color, shadowBlur: 8 * scale, shadowColor: 'rgba(255,255,255,0.3)' }, styleEmphasis: { shadowBlur: 5 * scale, shadowColor: shadow, shadowOffsetX: scale, shadowOffsetY: 3 * scale } }, { type: 'text', z2: 1, style: { text: text, x: p1[0] + 20 * scale, y: p1[1] - 10 * scale, font: 'normal 11px arial', fill: '#fff', borderWidth: 1, borderRadius: 20 * scale, backgroundColor: color, lineWidth: 100 * scale, verticalAlign: 'middle', padding: [4 * scale, 5 * scale, 2 * scale, 5 * scale] }, styleEmphasis: { font: 'normal 12px arial', shadowColor: shadow, shadowBlur: 10 * scale, shadowOffsetX: scale, shadowOffsetY: 3 * scale, backgroundColor: '#fff', fill: color } }] }; } if (symbol === 'altitude') { return { type: 'group', z2: 1, children: [{ type: 'path', z2: 1, shape: { pathData: config.icon.altitude, x: p1[0] - 3 * scale, y: p1[1] - 23 * scale, width: 190 * scale, height: 30 * scale }, style: { fill: color, shadowBlur: 8 * scale, shadowColor: 'rgba(255,255,255,0.3)' }, styleEmphasis: { shadowBlur: 2 * scale, shadowColor: shadow, shadowOffsetX: scale, shadowOffsetY: 3 * scale } }, { type: 'text', z2: 1, style: { text: text, x: p1[0] + 20 * scale, y: p1[1] - 10 * scale, font: 'normal 11px arial', fill: '#fff', borderWidth: 1, borderRadius: 20 * scale, backgroundColor: color, lineWidth: 100 * scale, verticalAlign: 'middle', padding: [4 * scale, 5 * scale, 2 * scale, 5 * scale] }, styleEmphasis: { font: 'normal 12px arial', shadowColor: shadow, shadowBlur: 10 * scale, shadowOffsetX: scale, shadowOffsetY: 3 * scale, backgroundColor: '#fff', fill: color } }] }; } return { type: 'group', z2: 0, children: [{ z2: 5, type: 'circle', shape: { cx: p1[0], cy: p1[1], r: 3 }, style: { fill: '#fff', stroke: color }, styleEmphasis: { fill: color, stroke: '#fff', shadowBlur: 3, shadowColor: color } }, { type: 'polyline', z2: 0, shape: { points: [p1, p2, p3] }, style: { fill: null, lineWidth: 0.5, stroke: color, shadowBlur: 8 * scale, shadowColor: '#fff' }, styleEmphasis: { shadowBlur: 2 * scale, shadowColor: shadow, shadowOffsetX: scale, shadowOffsetY: 3 * scale, lineWidth: 2 } }, { type: 'text', style: { text: text, x: p3[0], y: p3[1] - 12 * scale, font: 'normal 12px arial', fill: '#fff', borderWidth: 1, borderRadius: 20 * scale, backgroundColor: color, lineWidth: 100 * scale, padding: [6 * scale, 10 * scale, 3 * scale, 10 * scale] }, styleEmphasis: { font: 'normal 13px arial', fill: color, shadowColor: shadow, shadowBlur: 10 * scale, shadowOffsetX: scale, shadowOffsetY: 3 * scale, backgroundColor: '#fff' } }] }; }; var transform = function transform(data) { if (data != null) { var maximum = data.source.reduce(function (p, v) { return v[2] > p ? v[2] : p; }, 0); var unit = units.find(function (e) { return maximum >= e.value; }) || units[2]; if (unit.value !== 0) { data.source.forEach(function (e) { return e[2] = e[2] && numeralFormat(e[2] / unit.value); }); data.unit = unit; } data.dimensions = ['时间', '水位(m)', { name: "\u5E93\u5BB9\uFF08".concat(unit.symbol, "\uFF09"), unit: unit.symbol }, { name: "\u5165\u5E93\u6D41\u91CF(m\xB3/s)" }, { name: "\u4E0B\u6CC4\u6D41\u91CF(m\xB3/s)" }]; } return data; }; var createOptions = function createOptions(data) { return data; }; return { setOptions: setOptions, echarts: echarts, getInstance: getInstance, container: container, assemble: assemble, transform: transform, createOptions: createOptions }; } export { useDamSchematic };