You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1077 lines
42 KiB

<template>
<div class="tabs">
<div :class="{'active': currentTab === 'MWR'}" class="tab-item" @click="onTabClick('MWR')">
质控对比
<img v-if="currentTab === 'MWR'" src="/images/line.png"/>
</div>
<div :class="{'active': currentTab === 'kuoxian'}" class="tab-item" @click="onTabClick('kuoxian')">
垂直廓线
<img v-if="currentTab === 'kuoxian'" src="/images/line.png"/>
</div>
<div :class="{'active': currentTab === 'shixu'}" class="tab-item" @click="onTabClick('shixu')">
对流指数
<img v-if="currentTab === 'shixu'" src="/images/line.png"/>
</div>
<div :class="{'active': currentTab === 'T-logP'}" class="tab-item" @click="onTabClick('T-logP')">
T-logP图
<img v-if="currentTab === 'T-logP'" src="/images/line.png"/>
</div>
<div :class="{'active': currentTab === 'shixu_BPFY'}" class="tab-item" @click="onTabClick('shixu_BPFY')">
BP反演产品
<img v-if="currentTab === 'shixu_BPFY'" src="/images/line.png"/>
</div>
</div>
<div class="main">
<div class="menu panel">
<div class="menu-item">
<h2 class="tip">区域选择</h2>
<el-row :gutter="12">
<el-col :span="8"><span :class="{'active': currentRegion === 'jiang-ning'}"
@click="onRegionClick('jiang-ning')">江宁</span></el-col>
<el-col :span="8"><span :class="{'active': currentRegion === 'liu-he'}"
@click="onRegionClick('liu-he')">六合</span></el-col>
<el-col :span="8"><span :class="{'active': currentRegion === 'pu-kou'}"
@click="onRegionClick('pu-kou')">浦口</span></el-col>
<el-col :span="8"><span :class="{'active': currentRegion === 'gao-chun'}"
@click="onRegionClick('gao-chun')">高淳</span></el-col>
<el-col :span="8"><span :class="{'active': currentRegion === 'li-shui'}"
@click="onRegionClick('li-shui')">溧水</span></el-col>
</el-row>
</div>
<div class="menu-item">
<h2 class="tip">分辨率选择</h2>
<el-row :gutter="12">
<el-col :span="8"><span :class="{'active': currentElement === 'six-minute'}"
@click="onElementClick('six-minute', -2, 6)">6分钟</span></el-col>
<el-col :span="8"><span :class="{'active': currentElement === 'half-hour'}"
@click="onElementClick('half-hour', -12, 30)">30分钟</span></el-col>
<el-col :span="8"><span :class="{'active': currentElement === 'one-hour'}"
@click="onElementClick('one-hour', -24, 60)">1小时</span></el-col>
</el-row>
</div>
</div>
<div class="container panel">
<div class="toolbar">
<!--6分钟-->
<div v-show ="currentElement === 'six-minute'" class="times sixMinute">
<div v-for="(time, index) in times" :key="index"
:class="{'active': currentTime === time.date, 'first-hour': time.minute === '00'}" class="time-item">
<span class="hour">{{ time.hour }}</span>
<span class="time" @click="onTimeClick(time, index)">{{ time.minute }}</span>
</div>
</div>
<!--30分钟-->
<div v-show ="currentElement === 'half-hour'" class="times halfHour">
<div v-for="(time, index) in times" :key="index" :class="{'active': currentTime === time.date}"
class="time-item">
<span class="hour ">{{ time.hour }}</span>
<span class="time" @click="onTimeClick(time, index)">{{ time.minute }}</span>
</div>
</div>
<!--1小时-->
<div v-show ="currentElement === 'one-hour'" class="times oneHour">
<div v-for="(time, index) in times" :key="index" :class="{'active': currentTime === time.date}"
class="time-item">
<span class="hour">{{ time.hour }}</span>
<span class="time" @click="onTimeClick(time, index)">{{ time.minute }}</span>
</div>
</div>
<el-date-picker v-model="date" :clearable="false" :editable="false" class="date-picker" placeholder="请选择"
type="date" @change="onChange">
</el-date-picker>
<div class="control-btn">
<span @click="onPrevDayClick"><img src="/images/prev.png"/></span>
<span @click="onNextDayClick"><img src="/images/next.png"/></span>
</div>
<el-select v-model="currentHour" placeholder="" @change="onChange">
<el-option
v-for="item in hours"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<p class="unit">时</p>
</div>
<div class="picture-view">
<!--质控对比-->
<div v-show ="currentTab === 'MWR'" class="picture-container contrast-picture-container picture-MWR">
<!-- <el-switch-->
<!-- v-model="SeasonValue"-->
<!-- @change="onchangeSeason"-->
<!-- active-value="1"-->
<!-- inactive-value="2"-->
<!-- active-text="夏"-->
<!-- inactive-text="冬"-->
<!-- />-->
<div class="picture special-picture">
<h2 class="title">质控前</h2>
<canvas id='original-data-canvas'></canvas>
</div>
<div class="picture special-picture">
<h2 class="title">质控后</h2>
<canvas id='interpolate-canvas'></canvas>
</div>
</div>
<!--BP反演产品-->
<div v-show ="currentTab === 'shixu_BPFY'" class="picture-container contrast-picture-container shiXuBP">
<div class="BPPicture picture">
<h2 class="title">BP反演温度</h2>
<canvas id="BP-temp"></canvas>
</div>
<div class="BPPicture picture">
<h2 class="title">BP反演相对湿度</h2>
<canvas id="BP-relative-humidity"></canvas>
</div>
<div class="BPPicture picture">
<h2 class="title">BP反演水汽密度</h2>
<canvas id="BP-vapor-density"></canvas>
</div>
</div>
<div v-show ="currentTab === 'kuoxian'" class="verticalProfile">
<div class="verticalProfile-picture">
<h2 class="verticalProfileTitle">温度廓线</h2>
<div id="verticalProfileTemp" style="width: 400px;height: 400px"></div>
</div>
<div class="verticalProfile-picture">
<h2 class="verticalProfileTitle">相对湿度廓线</h2>
<div id="verticalProfileRelativeHumidity" style="width: 400px;height: 400px"></div>
</div>
<div class="verticalProfile-picture">
<h2 class="verticalProfileTitle" style="left: 1.4rem;">水汽密度廓线</h2>
<div id="verticalProfileVaporDensity" style="width: 400px;height: 400px"></div>
</div>
</div>
<div v-show ="currentTab === 'shixu'" class="picture-container contrast-picture-container shiXu">
<div class="picture" style="margin-top: 570px">
<h2 class="title">对流有效位能CAPE</h2>
<div id="convectiveHighChartCAPE" style="width: 100%;height:75%"></div>
</div>
<div class="picture" style="margin-top: 570px">
<h2 class="title">K指数</h2>
<div id="kIndexChart" style="width: 100%;height:75%"></div>
</div>
<div class="picture">
<h2 class="title">对流抑制势能CIN</h2>
<div id="convectiveHighChartCIN" style="width:100%;height:75%"></div>
</div>
<div class="picture">
<h2 class="title">沙式指数</h2>
<div id="sandIndexChart" style="width:100%;height:75%"></div>
</div>
<div class="picture">
<h2 class="title">LCL气压</h2>
<div id="airPressureChart" style="width:100%;height:75%"></div>
</div>
<div class="picture">
<h2 class="title">850hpa和500hpa温差</h2>
<div id="deltaTChart" style="width:100%;height:75%"></div>
</div>
<div class="picture">
<h2 class="title">0度层高度</h2>
<div id="zeroHeightChart" style="width:100%;height:75%"></div>
</div>
<div class="picture">
<h2 class="title">-20度层高度</h2>
<div id="NegativeTwentyHeightChart" style="width:100%;height:75%"></div>
</div>
</div>
<div v-show ="currentTab === 'T-logP'" class="picture-container contrast-picture-container">
<img :src="tLogPPicture" style="width: 20%">
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import {onMounted, reactive, ref, toRefs} from 'vue';
import moment from "moment";
import {get, post} from '../uilts/axios';
import {BoxDrawer, ColorChart, createEmptyCanvas} from "../uilts/box-drawer";
import {Constant} from "../model/constant";
import {HighChartCreate} from "../model/high-chart-create";
import {ElMessage} from 'element-plus'
export default {
name: 'MicrowaveRadiation',
setup() {
let timer = null;
let creates: {
verticalProfileTemp: HighChartCreate
verticalProfileVaporDensity: HighChartCreate
verticalProfileRelativeHumidity: HighChartCreate
convectiveIndexProfileTimeChartCAPE: HighChartCreate
convectiveIndexProfileTimeChartCIN: HighChartCreate
kIndexChart: HighChartCreate
sandIndex: HighChartCreate
airPressure: HighChartCreate
deltaT: HighChartCreate
zeroHeight: HighChartCreate
NegativeTwentyHeight: HighChartCreate
} = {
verticalProfileTemp: null,
verticalProfileVaporDensity: null,
verticalProfileRelativeHumidity: null,
convectiveIndexProfileTimeChartCAPE: null,
convectiveIndexProfileTimeChartCIN: null,
kIndexChart: null,
sandIndex: null,
airPressure: null,
deltaT: null,
zeroHeight: null,
NegativeTwentyHeight: null
}
let options = reactive({
currentTab: 'MWR',
currentRegion: 'jiang-ning',
currentType: 'TEMP',
currentElement: 'six-minute',
currentCategory: 'CAPE',
date: moment('2021-12-05').format('YYYY-MM-DD'),
currentHour: '00',
hours: [],
times: [],
days: [],
currentTime: null,
srcList: [],
title: null,
index: 0,
downloadSrc: null,
urls: [],
titleStartTime: null,
titleEndTime: null,
apiTimeLength: -2,
apiTimeInterval: 6,
// onPitchTime: 0,
BPTitleTime: null,
highChartXAxis: [],
specialStartTime: null,
tLogPPicture: "/images/no-data.png",
SeasonValue: '1'
});
let drawers = {
originalDrawer: null,
interpolateDrawer: null,
abnormalDrawer: null,
BPTempDrawer: null,
BPRelativeHumidity: null,
BPVaporDensity: null
}
onMounted(() => {
initTimeLine()
initHours();
setTimeout(() => {
changeColor()
}, 100)
reloadData()
})
const onTabClick = (name) => {
options.currentTab = name;
setTimeout(() => {
initEcharts(name);
reloadChangeData();
}, 500)
}
const initEcharts = (name) => {
if (name === 'kuoxian') {
verticalProfileTempInit()
verticalProfileVaporDensityInit()
verticalProfileRelativeHumidityInit()
} else if (name === 'shixu') {
convectiveIndexProfileTimeChartInitCAPE()
convectiveIndexProfileTimeChartInitCIN()
kIndexChartInit()
sandIndexInit()
airPressureInit()
deltaTInit()
zeroHeightInit()
NegativeTwentyHeightInit()
}
}
// const verticalProfileInit = () => {
// creates.verticalProfile = new HighChartCreate('container');
// creates.verticalProfile.setChart(true);
// creates.verticalProfile.setXAxis('高度(km)', false);
// creates.verticalProfile.setYAxis('温度T(degree)', 10, -40, 10, 6, true);
// creates.verticalProfile.setYAxis('相对湿度RH(%)', 100, 0, 10, 6);
// creates.verticalProfile.setYAxis('水汽密度q(g/kg)', 10, 0, 1, 11);
// creates.verticalProfile.setLegend();
// creates.verticalProfile.setTooltip('{point.category} KM: {point.y}');
// creates.verticalProfile.setSeries('温度', 0, '℃', '#F49927');
// creates.verticalProfile.setSeries('相对湿度', 1, '%', '#3534FD');
// creates.verticalProfile.setSeries('水汽密度', 2, 'g/Kg', '#6AB312');
// creates.verticalProfile.init();
// }
//垂直廓线温度数据图
const verticalProfileTempInit = () => {
creates.verticalProfileTemp = new HighChartCreate('verticalProfileTemp');
creates.verticalProfileTemp.setChart(true);
creates.verticalProfileTemp.setXAxis('高度(km)', false);
creates.verticalProfileTemp.setYAxis('温度T(℃)', 10, -40, 10, 6);
creates.verticalProfileTemp.setLegend();
creates.verticalProfileTemp.setTooltip('{point.category} KM, {point.y}');
creates.verticalProfileTemp.setSeries('温度', 0, '℃', '#F49927');
creates.verticalProfileTemp.init();
}
//垂直廓线水汽密度数据图
const verticalProfileVaporDensityInit = () => {
creates.verticalProfileVaporDensity = new HighChartCreate('verticalProfileVaporDensity');
creates.verticalProfileVaporDensity.setChart(true);
creates.verticalProfileVaporDensity.setXAxis('高度(km)', false);
creates.verticalProfileVaporDensity.setYAxis('水汽密度q(g/kg)', 10, 0, 1, 11);
creates.verticalProfileVaporDensity.setLegend();
creates.verticalProfileVaporDensity.setTooltip('{point.category} KM, {point.y}');
creates.verticalProfileVaporDensity.setSeries('水汽密度', 0, 'g/Kg', '#6AB312');
creates.verticalProfileVaporDensity.init();
}
//垂直廓线相对湿度数据图
const verticalProfileRelativeHumidityInit = () => {
creates.verticalProfileRelativeHumidity = new HighChartCreate('verticalProfileRelativeHumidity');
creates.verticalProfileRelativeHumidity.setChart(true);
creates.verticalProfileRelativeHumidity.setXAxis('高度(km)', false);
creates.verticalProfileRelativeHumidity.setYAxis('相对湿度RH(%)', 100, 0, 10, 6);
creates.verticalProfileRelativeHumidity.setLegend();
creates.verticalProfileRelativeHumidity.setTooltip('{point.category} KM, {point.y}');
creates.verticalProfileRelativeHumidity.setSeries('相对湿度', 0, '%', '#498DF0');
creates.verticalProfileRelativeHumidity.init();
}
const convectiveIndexProfileTimeChartInitCAPE = () => {
creates.convectiveIndexProfileTimeChartCAPE = new HighChartCreate('convectiveHighChartCAPE');
creates.convectiveIndexProfileTimeChartCAPE.setChart();
creates.convectiveIndexProfileTimeChartCAPE.setXAxis('时间(时/分)', false);
creates.convectiveIndexProfileTimeChartCAPE.setYAxis('CAPE(J/kg)', 800, 0, 100, 9);
creates.convectiveIndexProfileTimeChartCAPE.setLegend();
creates.convectiveIndexProfileTimeChartCAPE.setTooltip('{point.category}, {point.y}(J/kg)');
creates.convectiveIndexProfileTimeChartCAPE.setSeries('CAPE')
creates.convectiveIndexProfileTimeChartCAPE.init();
}
const convectiveIndexProfileTimeChartInitCIN = () => {
creates.convectiveIndexProfileTimeChartCIN = new HighChartCreate('convectiveHighChartCIN');
creates.convectiveIndexProfileTimeChartCIN.setChart();
creates.convectiveIndexProfileTimeChartCIN.setXAxis('时间(时/分)', false);
creates.convectiveIndexProfileTimeChartCIN.setYAxis('CIN(J/kg)', 800, 0, 100, 9);
creates.convectiveIndexProfileTimeChartCIN.setLegend();
creates.convectiveIndexProfileTimeChartCIN.setTooltip('{point.category}, {point.y}(J/kg)');
creates.convectiveIndexProfileTimeChartCIN.setSeries('CIN')
creates.convectiveIndexProfileTimeChartCIN.init();
}
//绘制K指数
const kIndexChartInit = () => {
creates.kIndexChart = new HighChartCreate('kIndexChart');
creates.kIndexChart.setChart();
creates.kIndexChart.setXAxis('时间(时/分)', false);
creates.kIndexChart.setYAxis('K(℃)', 40, -40, 10, 9);
creates.kIndexChart.setLegend();
creates.kIndexChart.setTooltip('{point.category}, {point.y}(℃)');
creates.kIndexChart.setSeries('K指数')
creates.kIndexChart.init();
}
//绘制沙式指数
const sandIndexInit = () => {
creates.sandIndex = new HighChartCreate('sandIndexChart');
creates.sandIndex.setChart();
creates.sandIndex.setXAxis('时间(时/分)', false);
creates.sandIndex.setYAxis('SI(℃)', 30, 0, 3, 11);
creates.sandIndex.setLegend();
creates.sandIndex.setTooltip('{point.category}, {point.y}(℃)');
creates.sandIndex.setSeries('沙式指数')
creates.sandIndex.init();
}
//绘制LCl气压
const airPressureInit = () => {
creates.airPressure = new HighChartCreate('airPressureChart');
creates.airPressure.setChart();
creates.airPressure.setXAxis('时间(时/分)', false);
creates.airPressure.setYAxis('LCL气压(hPa)', 1000, 300, 100, 8);
creates.airPressure.setLegend();
creates.airPressure.setTooltip('{point.category}, {point.y}(hPa)');
creates.airPressure.setSeries('LCL气压')
creates.airPressure.init();
}
//绘制850hpa和500hpa温差
const deltaTInit = () => {
creates.deltaT = new HighChartCreate('deltaTChart');
creates.deltaT.setChart();
creates.deltaT.setXAxis('时间(时/分)', false);
creates.deltaT.setYAxis('deltaT(℃)', 1000, 300, 100, 8);
creates.deltaT.setLegend();
creates.deltaT.setTooltip('{point.category}, {point.y}(℃)');
creates.deltaT.setSeries('deltaT')
creates.deltaT.init();
}
//绘制0度层高度
const zeroHeightInit = () => {
creates.zeroHeight = new HighChartCreate('zeroHeightChart');
creates.zeroHeight.setChart();
creates.zeroHeight.setXAxis('时间(时/分)', false);
creates.zeroHeight.setYAxis('hgt_0(m)', 10, 0, 1, 11);
creates.zeroHeight.setLegend();
creates.zeroHeight.setTooltip('{point.category}, {point.y}(m)');
creates.zeroHeight.setSeries('hgt_0')
creates.zeroHeight.init();
}
//绘制-20度层高度
const NegativeTwentyHeightInit = () => {
creates.NegativeTwentyHeight = new HighChartCreate('NegativeTwentyHeightChart');
creates.NegativeTwentyHeight.setChart();
creates.NegativeTwentyHeight.setXAxis('时间(时/分)', false);
creates.NegativeTwentyHeight.setYAxis('hgt_-20(m)', 20, -20, 5, 9);
creates.NegativeTwentyHeight.setLegend();
creates.NegativeTwentyHeight.setTooltip('{point.category}, {point.y}(m)');
creates.NegativeTwentyHeight.setSeries('hgt_-20')
creates.NegativeTwentyHeight.init();
}
const onRegionClick = (region) => {
options.currentRegion = region;
}
const onElementClick = (element, apiTimeLength, apiTimeInterval) => {
options.apiTimeInterval = apiTimeInterval;
options.apiTimeLength = apiTimeLength;
options.currentElement = element;
// options.onPitchTime = onPitchTime
initTimeLine(reloadChangeData)
if (element === 'six-minute') {
setTimeout(() => {
changeColor()
}, 0)
}
reloadChangeData()
}
//初始化时间轴
const initTimeLine = (callback = null, ...params) => {
options.times = [];
options.currentTime = moment(options.date).hour(parseInt(options.currentHour) /*+ options.onPitchTime*/).minute(options.currentElement === 'six-minute' ? 30 : 0).format('YYYY-MM-DD HH:mm:ss');
options.titleEndTime = options.currentTime
let now = moment(options.date).hour(parseInt(options.currentHour) + options.apiTimeLength).minute(options.currentElement === 'six-minute' ? 36 : 30);
let minute = now.minute();
const remainder = minute % options.apiTimeInterval;
if (remainder > 0) {
now.minute(minute + (options.apiTimeInterval - remainder));
}
now.minute(now.minute() - options.apiTimeInterval);
for (let i = 0; i < 24; i++) {
options.times.push({
hour: now.add(options.apiTimeInterval, 'minute').format('HH时'),
minute: now.format('mm'),
date: now.format('YYYY-MM-DD HH:mm:00')
});
}
options.index = options.times.length - 1;
options.titleStartTime = options.times[0].date;
if (callback != null)
callback(params);
}
const initHours = () => {
for (let i = 1; i < 24; i++) {
options.hours.push({
value: i,
label: i < 10 ? '0' + i : i,
})
}
}
const onTimeClick = (time, index) => {
options.currentHour = time.hour.substring(0, 2)
options.currentTime = time.date;
options.titleStartTime = moment(time.date).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:ss')
options.titleEndTime = time.date
options.date = moment(time.date).format('YYYY-MM-DD')
reloadChangeData()
}
//上一天
const onPrevDayClick = () => {
options.date = moment(options.date).add(-1, 'day').format('YYYY-MM-DD');
initTimeLine()
options.titleStartTime = moment(options.date).hour(parseInt(options.currentHour) + options.apiTimeLength).minute(options.currentElement === 'six-minute' ? 36 : 30).format('YYYY-MM-DD HH:mm:ss');
options.titleEndTime = moment(options.date).hour(parseInt(options.currentHour)).minute(options.currentElement === 'six-minute' ? 30 : 0).format('YYYY-MM-DD HH:mm:ss');
reloadChangeData()
}
//下一天
const onNextDayClick = () => {
options.date = moment(options.date).add(1, 'day').format('YYYY-MM-DD');
initTimeLine()
options.titleStartTime = moment(options.date).hour(parseInt(options.currentHour) + options.apiTimeLength).minute(options.currentElement === 'six-minute' ? 36 : 30).format('YYYY-MM-DD HH:mm:ss');
options.titleEndTime = moment(options.date).hour(parseInt(options.currentHour)).minute(options.currentElement === 'six-minute' ? 30 : 0).format('YYYY-MM-DD HH:mm:ss');
reloadChangeData()
}
//重置时间
const onRefreshClick = () => {
let element = getCurrentElement();
options.currentHour = '00';
options.date = moment('2021-12-05').format('YYYY-MM-DD');
element.children[options.times.length - 1].classList.add('active');
initTimeLine()
reloadChangeData()
}
const getCurrentElement = () => {
return document.querySelector('.times');
}
const onChange = () => {
initTimeLine(reloadChangeData);
}
const reloadData = () => {
reloadQualityComparison()
reloadQualityInterpolation()
}
const reloadBPData = () => {
reloadBPRelativeHumidity()
reloadQualityInterpolation()
reloadBPVaporDensity()
}
const BPBrokenLineData = () => {
BPTempData()
BPVaporDensityData()
BPRelativeHumidityData()
}
const reloadChangeData = () => {
if (options.currentTab === 'MWR')
reloadData()
else if (options.currentTab === 'shixu_BPFY')
reloadBPData()
else if (options.currentTab === 'kuoxian') {
BPBrokenLineData()
} else if (options.currentTab === 'shixu') {
convectiveIndexCAPEData()
convectiveIndexCINData()
kIndexApi()
sandIndexApi()
airPressureApi()
deltaTApi()
zeroHeightApi()
NegativeTwentyHeightApi()
}else if (options.currentTab === 'T-logP'){
reloadTLogPData();
}
}
const reloadTLogPData = () => {
let params = {
startTime: moment(options.titleEndTime).add(-options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00'),
endTime: options.titleEndTime
}
post("/tLogP/findLater", params).then((response: any) => {
response == "" ? options.tLogPPicture = "/images/no-data.png" : options.tLogPPicture = response ;
})
}
const changeColor = () => {
let timeLine = document.querySelectorAll('.time-item')
timeLine.forEach((item: any, index) => {
if (index >= 4 && index <= 13) {
const spanTimeColor = item.querySelector('.time')
spanTimeColor.style.backgroundColor = '#CDDAF6'
}
})
}
// 重新加载质控对比数据
const reloadQualityComparison = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams(401, startTime, options.titleEndTime);
get('/njplatform/radardata/getOriginRangeData', params, Constant.baseUrl).then((response: any) => {
clearBoxDrawer(drawers.originalDrawer);
clearBoxDrawer(drawers.abnormalDrawer);
if (response.code != 200 || response.data.radar_data.length === 0) {
createEmptyCanvas('original-data-canvas', 1500, 500);
// createEmptyCanvas('abnormal-canvas', 1500, 500);
return;
}
drawers.originalDrawer = new BoxDrawer(1500, 500, prepareTmpOriginalColors(options.SeasonValue), response.data, 'original-data-canvas', 'T/℃');
// drawers.abnormalDrawer = new BoxDrawer(1500, 500, prepareTmpOriginalColors(), response.data, 'abnormal-canvas', '℃');
// options.contrast.noQCImgUrl = drawers.originalDrawer.base64Image;
// options.contrast.checkImgUrl = drawers.abnormalDrawer.base64Image;
})
}
const reloadQualityInterpolation = () => {
options.specialStartTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
if (options.currentTab === 'shixu_BPFY') {
if (options.currentElement === 'six-minute') {
options.specialStartTime = moment(options.currentTime).add(-8, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
}
}
const params = prepareApiParams(401, options.specialStartTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
clearBoxDrawer(drawers.interpolateDrawer);
if (response.code != 200 || response.data.radar_data.length === 0) {
if (options.currentTab === 'MWR')
createEmptyCanvas('interpolate-canvas', 1500, 500);
else if (options.currentTab === 'shixu_BPFY')
createEmptyCanvas('BP-temp', 1500, 500);
return;
}
if (options.currentTab === 'MWR')
drawers.interpolateDrawer = new BoxDrawer(1500, 500, prepareTmpOriginalColors(options.SeasonValue), response.data, 'interpolate-canvas', 'T/℃');
else if (options.currentTab === 'shixu_BPFY')
drawers.interpolateDrawer = new BoxDrawer(1500, 500, prepareBPTempColors(), response.data, 'BP-temp', '(degree)');
// options.contrast.fillingImgUrl = drawers.interpolateDrawer.base64Image;
})
}
//BP反演相对湿度
const reloadBPRelativeHumidity = () => {
options.specialStartTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
if (options.currentElement === 'six-minute') {
options.specialStartTime = moment(options.currentTime).add(-8, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
}
const params = prepareApiParams(404, options.specialStartTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
clearBoxDrawer(drawers.BPRelativeHumidity);
if (response.code != 200 || response.data.radar_data.length === 0) {
createEmptyCanvas('BP-relative-humidity', 1500, 500);
return;
}
drawers.BPRelativeHumidity = new BoxDrawer(1500, 500, prepareBPRelativeHumidityColors(), response.data, 'BP-relative-humidity', '(%)');
// options.contrast.fillingImgUrl = drawers.interpolateDrawer.base64Image;
})
}
//水汽密度
const reloadBPVaporDensity = () => {
options.specialStartTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
if (options.currentElement === 'six-minute') {
options.specialStartTime = moment(options.currentTime).add(-8, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
}
const params = prepareApiParams(402, options.specialStartTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
clearBoxDrawer(drawers.BPVaporDensity);
if (response.code != 200 || response.data.radar_data.length === 0) {
createEmptyCanvas('BP-vapor-density', 1500, 500);
return;
}
drawers.BPVaporDensity = new BoxDrawer(1500, 500, prepareBPVaporDensityColors(), response.data, 'BP-vapor-density', '(g/kg)');
// options.contrast.fillingImgUrl = drawers.interpolateDrawer.base64Image;
})
}
const BPTempData = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams(401, startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
// creates.verticalProfile.updateSeries(0, getVerticalProfileResponseData(response));
creates.verticalProfileTemp.updateSeries(0, getVerticalProfileResponseData(response))
})
}
const BPVaporDensityData = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams(402, startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
// creates.verticalProfile.updateSeries(2, getVerticalProfileResponseData(response));
creates.verticalProfileVaporDensity.updateSeries(0, getVerticalProfileResponseData(response));
})
}
const BPRelativeHumidityData = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams(404, startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
// creates.verticalProfile.updateSeries(1, getVerticalProfileResponseData(response));
creates.verticalProfileRelativeHumidity.updateSeries(0, getVerticalProfileResponseData(response))
})
}
const getVerticalProfileResponseData = (response) => {
if (response.code != 200 || response.data == null || response.data.radar_data.length === 0) {
options.BPTitleTime = null;
verify();
return [];
}
// creates.verticalProfile.updateXAxis(response.data.radar_info.map(r => r.col_factor));
creates.verticalProfileTemp.updateXAxis(response.data.radar_info.map(r => r.col_factor))
creates.verticalProfileVaporDensity.updateXAxis(response.data.radar_info.map(r => r.col_factor))
creates.verticalProfileRelativeHumidity.updateXAxis(response.data.radar_info.map(r => r.col_factor))
// verticalProfileHighChart.xAxis[0].setCategories(response.data.radar_info.map(r => r.col_factor));
response.data.radar_data.sort((x, y) => {
return moment(x.data_time).isBefore(moment(y.data_time));
});
let data = response.data.radar_data[0];
options.BPTitleTime = data.data_time;
let optionData = [];
response.data.radar_info.forEach(r => {
optionData.push([r.col_name, data[r.col_name]]);
});
return optionData;
}
const convectiveIndexCAPEData = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('cape', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
let data = convectiveIndexResponseData(response);
creates.convectiveIndexProfileTimeChartCAPE.updateSeries(0, data[0])
creates.convectiveIndexProfileTimeChartCAPE.updateXAxis(data[1], 0)
})
}
const convectiveIndexCINData = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('cin', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response: any) => {
let data = convectiveIndexResponseData(response);
creates.convectiveIndexProfileTimeChartCIN.updateSeries(0, data[0])
creates.convectiveIndexProfileTimeChartCIN.updateXAxis(data[1], 0)
})
}
//K-index
const kIndexApi = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('K', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response) => {
let data = convectiveIndexResponseData(response);
creates.kIndexChart.updateSeries(0, data[0])
creates.kIndexChart.updateXAxis(data[1], 0)
})
}
//沙式指数
const sandIndexApi = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('SI', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response) => {
let data = convectiveIndexResponseData(response);
creates.sandIndex.updateSeries(0, data[0])
creates.sandIndex.updateXAxis(data[1], 0)
})
}
//LCL气压
const airPressureApi = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('LCL_pres', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response) => {
let data = convectiveIndexResponseData(response);
creates.airPressure.updateSeries(0, data[0])
creates.airPressure.updateXAxis(data[1], 0)
})
}
//850hpa和500hpa温差
const deltaTApi = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('LCL_pres', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response) => {
let data = convectiveIndexResponseData(response);
creates.deltaT.updateSeries(0, data[0])
creates.deltaT.updateXAxis(data[1], 0)
})
}
//绘制0度层高度
const zeroHeightApi = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('hgt_0', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response) => {
let data = convectiveIndexResponseData(response);
creates.zeroHeight.updateSeries(0, data[0])
creates.zeroHeight.updateXAxis(data[1], 0)
})
}
//绘制-20度层高度
const NegativeTwentyHeightApi = () => {
const startTime = moment(options.currentTime).add(options.apiTimeLength, 'h').add(options.apiTimeInterval, 'm').format('YYYY-MM-DD HH:mm:00');
const params = prepareApiParams('hgt_-20', startTime, options.titleEndTime);
get('/njplatform/radardata/getBpRangeData', params, Constant.baseUrl).then((response) => {
let data = convectiveIndexResponseData(response);
creates.NegativeTwentyHeight.updateSeries(0, data[0])
creates.NegativeTwentyHeight.updateXAxis(data[1], 0)
})
}
const convectiveIndexResponseData = (response) => {
if (response.code != 200 || response.data == null || response.data.radar_data.length === 0) {
verify();
return [[], []];
}
let radarData = response.data.radar_data;
let times = [];
let values = [];
radarData.forEach(item => {
if (item.f001 >= 10000) {
item.f001 = 0
}
times.push(moment(item.data_time).format('HH:mm'))
values.push(item.f001)
});
return [values, times];
}
const clearBoxDrawer = (boxDrawer: BoxDrawer) => {
if (boxDrawer == null) return;
boxDrawer.close();
}
const verify = () => {
ElMessage({
showClose: true,
message: '请求接口无数据',
icon: '',
type: null,
grouping: true,
duration: 1500
})
}
// const prepareTmpOriginalColors = () => {
// return new ColorChart(['#860200', '#CD0402', '#FF1A04', '#FF5E0C',
// '#FEA61B', '#FDED2A', '#C1FE46', '#7AFD86',
// '#2BFDCD', '#05E6FD', '#14A0FA', '#1B5AFB',
// '#1C1FF9', '#1310C4', '#09067C'],
// [999, 30, 25, 20, 15, 10, 5, 0, -5, -10, -15, -20, -25, -30, -35, -999]
// );
// }
const prepareTmpOriginalColors = (type: string) => {
switch (type) {
case '1' :
return new ColorChart(['#860200', '#CD0402', '#FF1A04', '#FF5E0C',
'#FEA61B', '#FDED2A', '#C1FE46', '#7AFD86',
'#2BFDCD', '#05E6FD', '#14A0FA', '#1B5AFB',
'#1C1FF9', '#1310C4', '#09067C'],
[999, 30, 25, 20, 15, 10, 5, 0, -5, -10, -15, -20, -25, -30, -35, -999]
);
case '2' :
return new ColorChart(['#860200', '#CD0402', '#FF1A04', '#FF5E0C',
'#FEA61B', '#FDED2A', '#C1FE46', '#7AFD86',
'#2BFDCD', '#05E6FD', '#14A0FA', '#1B5AFB',
'#1C1FF9', '#1310C4', '#09067C'],
[999, -5, -7, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -29, -31, -999]
);
default:
throw new Error("无效的type类型");
}
}
const prepareBPTempColors = () => {
return new ColorChart(['#860100', '#D20201', '#FF2402', '#FF6F09',
'#FEBF14', '#EFFE24', '#9FFE61', '#52FEAA',
'#03FEF8', '#0AB8FD', '#1069FD', '#1222FD',
'#0C0AC9', '#05037D'],
[999, 12, 8, 4, 0, -4, -8, -12, -16, -20, -24, -28, -32, -36, -999]
);
}
const prepareBPRelativeHumidityColors = () => {
return new ColorChart(['#860100', '#F60301', '#FF6708', '#FED718',
'#B3FE4F', '#3EFEBD', '#07CFFE', '#1061FD',
'#100DED', '#05037D'],
[999, 90, 80, 70, 60, 50, 40, 30, 20, 10, -999]
)
}
const prepareBPVaporDensityColors = () => {
return new ColorChart(['#860100', '#F60301', '#FF6708', '#FED718',
'#B3FE4F', '#3EFEBD', '#07CFFE', '#1061FD',
'#100DED', '#05037D'],
[999, 9, 8, 7, 6, 5, 4, 3, 2, 1, -999]
)
}
const prepareApiParams = (radarDataCode, startTime, endTime) => {
return {
radar_data_code: radarDataCode,
data_time_start: startTime,
data_time_end: endTime
}
}
const onchangeSeason = () => {
reloadData()
}
return {
...toRefs(options),
onTabClick,
onRegionClick,
onElementClick,
onTimeClick,
onPrevDayClick,
onNextDayClick,
onRefreshClick,
onChange,
changeColor,
onchangeSeason
}
}
}
</script>
<style lang="less" scoped>
.main {
.container {
.verticalProfile {
width: 100%;
height: 100%;
display: flex;
justify-content: space-evenly;
align-items: center;
.verticalProfile-picture {
position: relative;
.verticalProfileTitle {
position: absolute;
font-size: 0.22rem;
left: 1.77rem;
top: -0.8rem;
}
}
}
:deep(.el-date-editor), .control-btn, :deep(.el-select), .unit {
padding-top: 0.06rem;
}
.contrast-picture-container {
width: calc(~"100% - 2.5rem");
margin: 0 auto;
//width: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
// justify-content: space-between;
.special-picture {
height: 100%!important;
.title {
top: 80px!important;
}
}
.picture {
width: 45%;
height: 45%;
position: relative;
#original-data-canvas /*#abnormal-canvas*/, #interpolate-canvas {
transform: scale(0.47, 0.8);
}
.title {
width: 100%;
font-size: 0.22rem;
position: absolute;
left: 3.10rem;
top: 0;
z-index: 1000;
}
}
.BPPicture {
width: 65% !important;
height: 45%;
position: relative;
#BP-temp, #BP-relative-humidity, #BP-vapor-density {
transform: scale(0.50, 0.4);
}
.title {
left: 3.85rem !important;
}
}
}
.shiXu {
overflow-y: scroll;
width: 100% !important;
}
.shiXuBP {
flex-flow: column;
align-content: space-around !important;
}
.picture-MWR {
width: 100%;
height: 100%;
display: flex;
position: relative;
:deep(.el-switch) {
position: absolute;
left: 0px;
bottom: 0px;
width: 150px;
z-index: 1000;
//width: 10%;
}
:deep(.el-switch__core) {
width: 40px !important;
//height: 20px !important;
}
:deep(.el-switch__core::after) {
width: 50px;
height: 35px;
margin-top: -1px;
margin-bottom: 2px;
}
}
}
}
::-webkit-scrollbar {
width: 8px;
border-radius: 4px;
}
::-webkit-scrollbar-track {
background-color: inherit;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background-color: #c3c9cd;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
</style>