<template> <div class="app-container print-work"> <div class="level-title"> <h1>{{ info.EQUIPMENTNAME }}:实时监测数据 {{ info.OPERATTIME }}</h1> </div> <div style="display: flex"> <div v-if="info.WINDDIRECTION != '-'" id="main4"/> <div v-if="info.TEMPERATURE != '-'" id="main5"/> <div v-if="info.WINDSPEED != '-'" id="main6"/> </div> <table class="table-ui"> <tr> <td class="bbg-transparent">风速监测</td> <td>{{ info.WINDSPEED }}</td> <td class="bbg-transparent">风向监测</td> <td>{{ info.WINDDIRECTION }}</td> </tr> <tr> <td class="bbg-transparent">温度监测</td> <td>{{ info.TEMPERATURE }}</td> <td class="bbg-transparent">湿度监测</td> <td>{{ info.COUNTARCHIVE }}</td> </tr> </table> </div> </template> <script> import { requestFN } from '@/utils/request' import * as echarts from 'echarts' let myChart4 = null let myChart5 = null let myChart6 = null export default { props: { id: { type: String, default() { return '' } }, type: { type: String, default() { return '' } } }, data() { return { timer: '', config: config, info: {} } }, mounted() { window.onresize = function() { myChart4 && myChart4.resize() myChart5 && myChart5.resize() myChart6 && myChart6.resize() } this.getMeteorologicalinfo() this.start() }, beforeDestroy() { myChart4 = null myChart5 = null myChart6 = null console.log('定时器关闭') clearInterval(this.timer) }, methods: { // 定时器 start() { console.log('定时器开启') this.timer = setInterval(this.getMeteorologicalinfo, 10000) // 注意: 第一个参数为方法名的时候不要加括号; }, over() { clearInterval(this.timer) }, getMeteorologicalinfo() { requestFN( '/map/getById', { id: this.id, TYPE: this.type } ).then((data) => { this.listLoading = false this.info = data.pd this.info.COUNTARCHIVE = data.pd.COUNTARCHIVE || '-' this.info.TEMPERATURE = data.pd.TEMPERATURE || '-' this.info.WINDSPEED = data.pd.WINDSPEED || '-' this.info.WINDDIRECTION = data.pd.WINDDIRECTION || '-' this.$nextTick(()=>{ if(data.pd.WINDDIRECTION != '-'){ console.log(this.info.WINDDIRECTION) this.initEcharts1(data) this.info.WINDDIRECTION = this.calculateWindDirection(this.info.WINDDIRECTION) console.log(this.info.WINDDIRECTION) } if(data.pd.TEMPERATURE != '-'){ this.initEcharts2(data) } if(data.pd.WINDSPEED != '-'){ this.initEcharts3(data) } }) }).catch((e) => { }) }, initEcharts1(data) { myChart4 = echarts.init(document.querySelector('#main4')) var option = { title: { // x: "center", top: 0, text: '风向监测', textStyle: { fontWeight: 'normal', fontSize: 16, color: '#fff' } }, series: { name: '', type: 'gauge', min: 0, max: 360, startAngle: 90, endAngle: -269.9999, radius: '55%', splitNumber: 8, axisLine: { lineStyle: { width: 15, shadowBlur: 0, color: [ [0.25, '#DDBD4D'], [0.5, '#E43F3D'], [0.75, '#7CBB55'], [1, '#9CD6CE'] ] } }, axisTick: { show: true, splitNumber: 5, lineStyle: { color: '#fff' } }, splitLine: { length: 10, lineStyle: { width: 5, color: '#fff' } }, axisLabel: { formatter: function(e) { switch (e + '') { case '0': return '北' case '45': return '东北' case '135': return '东南' case '225': return '西南' case '315': return '西北' case '360': return '北' case '180': return '南' case '90': return '东' case '270': return '西' default: return e } }, distance: -60, textStyle: { fontSize: 14, fontWeight: '', color: '#fff' } }, pointer: { show: true, length: '80%', width: 5 }, detail: { formatter: function(param) { var level = '' if (param > 0 && param < 90) { level = '东北' } else if (param > 90 && param < 180) { level = '东南' } else if (param > 180 && param < 270) { level = '西南' } else if (param > 270 && param < 360) { level = '西北' } else if (param == 360) { level = '正北' } else if (param == 270) { level = '正西' } else if (param == 90) { level = '正东' } else if (param == 180) { level = '正南' } return '当前风向:' + level + '(' + param + '°)' }, offsetCenter: [0, 150], textStyle: { fontSize: 14, color: '#fff' } }, data: [data.pd.WINDDIRECTION] } } myChart4.setOption(option) }, initEcharts2(data) { myChart5 = echarts.init(document.querySelector('#main5')) var value = data.pd.TEMPERATURE var kd = [] // 刻度使用柱状图模拟,短设置3,长的设置5;构造一个数据 for (var i = 0, len = 130; i <= len; i++) { if (i > 100 || i < 30) { kd.push('0') } else { if (i % 5 === 0) { kd.push('5') } else { kd.push('3') } } } // console.log(kd) // 因为柱状初始化为0,温度存在负值,所以,原本的0-100,改为0-130,0-30用于表示负值 function getData(value) { return [Number(value) + 30] } var mercuryColor = '#fd4d49' var borderColor = '#fd4d49' const option = { title: { text: '温度监测', show: true, textStyle: { fontWeight: 'normal', fontSize: 16, color: '#fff' } }, yAxis: [{ show: false, min: 0, max: 130 }, { show: false, data: [], min: 0, max: 130 }], xAxis: [{ show: false, data: [] }, { show: false, data: [] }, { show: false, data: [] }, { show: false, min: -110, max: 100 }], series: [{ name: '条', type: 'bar', // 对应上面XAxis的第一个对象配置 xAxisIndex: 0, data: getData(value), barWidth: 18, itemStyle: { normal: { color: mercuryColor, barBorderRadius: 0 } }, label: { normal: { show: true, position: 'top', formatter: function(param) { // 因为柱状初始化为0,温度存在负值,所以,原本的0-100,改为0-130,0-30用于表示负值 return (((param.value * 100) - (30 * 100)) / 100) + '°C' }, textStyle: { color: '#ccc', fontSize: '10' } } }, z: 2 }, { name: '白框', type: 'bar', xAxisIndex: 1, barGap: '-100%', data: [129], barWidth: 28, itemStyle: { normal: { color: '#ffffff', barBorderRadius: 50 } }, z: 1 }, { name: '外框', type: 'bar', xAxisIndex: 2, barGap: '-100%', data: [130], barWidth: 38, itemStyle: { normal: { color: borderColor, barBorderRadius: 50 } }, z: 0 }, { name: '圆', type: 'scatter', hoverAnimation: false, data: [0], xAxisIndex: 0, symbolSize: 48, itemStyle: { normal: { color: mercuryColor, opacity: 1 } }, z: 2 }, { name: '白圆', type: 'scatter', hoverAnimation: false, data: [0], xAxisIndex: 1, symbolSize: 60, itemStyle: { normal: { color: '#ffffff', opacity: 1 } }, z: 1 }, { name: '外圆', type: 'scatter', hoverAnimation: false, data: [0], xAxisIndex: 2, symbolSize: 70, itemStyle: { normal: { color: borderColor, opacity: 1 } }, z: 0 }, { name: '刻度', type: 'bar', yAxisIndex: 1, xAxisIndex: 3, label: { normal: { show: true, position: 'right', distance: 10, color: '#fff', fontSize: 10, formatter: function(params) { // 因为柱状初始化为0,温度存在负值,所以,原本的0-100,改为0-130,0-30用于表示负值 if (params.dataIndex > 100 || params.dataIndex < 30) { return '' } else { if (params.dataIndex % 5 === 0) { return params.dataIndex - 30 } else { return '' } } } } }, barGap: '-100%', data: kd, barWidth: 1, itemStyle: { normal: { color: borderColor, barBorderRadius: 10 } }, z: 0 }] } myChart5.setOption(option) }, initEcharts3(data) { myChart6 = echarts.init(document.querySelector('#main6')) const option = { // backgroundColor:'#0F2D5B', title: { text: '风速监测', show: true, textStyle: { fontWeight: 'normal', fontSize: 16, color: '#fff' } }, series: [ { name: '外圈', type: 'gauge', min: 0, max: 30, splitNumber: 10, center: ['50%', '55%'], radius: '73%', axisLine: { lineStyle: { color: [[1, '#2E5BA1']], width: 20 } }, splitLine: { distance: -20, length: 20, lineStyle: { width: 2, color: '#0F2D5B' } }, axisTick: { distance: -20, length: 5, lineStyle: { color: '#0F2D5B' } }, axisLabel: { distance: -25, color: '#7392C1', fontSize: 14 }, anchor: { show: false }, pointer: { show: false } }, { name: '内圈', type: 'gauge', min: 0, max: 30, splitNumber: 10, center: ['50%', '55%'], radius: '65%', axisLine: { lineStyle: { width: 20, color: [ [0.25, '#18EC90'], [0.5, '#E2DC2E'], [0.75, '#E2A02E'], [1, '#FE4747'] ] } }, silent: true, pointer: { length: '85%', width: 4, itemStyle: { color: 'inherit', borderWidth: 1, borderColor: 'inherit', // '#0D3778', shadowColor: 'inherit', shadowBlur: 1 } }, axisTick: { show: false, distance: -20, length: 5, lineStyle: { color: '#0F2D5B' } }, splitLine: { distance: -20, length: 20, lineStyle: { width: 2, color: '#0F2D5B' } }, axisLabel: { show: false }, title: { // 仪表盘标题。 show: true, // 是否显示标题,默认 true。 offsetCenter: [0, '95%'], // 相对于仪表盘中心的偏移位置,数组第一项是水平方向的偏移,第二项是垂直方向的偏移。可以是绝对的数值,也可以是相对于仪表盘半径的百分比。 color: '#ccc', // 文字的颜色,默认 #333。 fontSize: 15 // 文字的字体大小,默认 15。 }, detail: { valueAnimation: true, offsetCenter: [0, '70%'], formatter: '{value}', color: 'inherit', // 文字的颜色,默认 #333。 fontSize: 20 }, data: [{ name: '风速(m/s)', value: data.pd.WINDSPEED }] } ] } myChart6.setOption(option) }, calculateWindDirection(angle) { const arr = [ { directions: '北', minAngle: '348.76', maxAngle: '11.25' }, { directions: '北东北', minAngle: '11.26', maxAngle: '33.75' }, { directions: '东北', minAngle: '33.76', maxAngle: '56.25' }, { directions: '东东北', minAngle: '56.26', maxAngle: '78.75' }, { directions: '东', minAngle: '78.76', maxAngle: '101.25' }, { directions: '东东南', minAngle: '101.26', maxAngle: '123.75' }, { directions: '东南', minAngle: '123.76', maxAngle: '146.25' }, { directions: '南东南', minAngle: '146.26', maxAngle: '168.75' }, { directions: '南', minAngle: '168.76', maxAngle: '191.25' }, { directions: '南西南', minAngle: '191.26', maxAngle: '213.75' }, { directions: '西南', minAngle: '213.76', maxAngle: '236.25' }, { directions: '西西南', minAngle: '236.26', maxAngle: '258.75' }, { directions: '西', minAngle: '258.76', maxAngle: '281.25' }, { directions: '西西北', minAngle: '281.26', maxAngle: '303.75' }, { directions: '西北', minAngle: '303.76', maxAngle: '326.25' }, { directions: '北西北', minAngle: '326.26', maxAngle: '348.75' } ] for (let i = 0; i < arr.length; i++) { if (+angle >= +arr[i].minAngle && +angle <= +arr[i].maxAngle) { return arr[i].directions + '风' } } return '静风' } } } </script> <style lang="scss" scoped> #main4{ width: 340px; height: 380px; } #main5{ width: 340px; height: 380px; } #main6{ width: 340px; height: 380px; } </style>