diff --git a/04.系统编码/Frontend/src/components/DecisionSupport.vue b/04.系统编码/Frontend/src/components/DecisionSupport.vue index 4a9a3c9..b1f4cba 100644 --- a/04.系统编码/Frontend/src/components/DecisionSupport.vue +++ b/04.系统编码/Frontend/src/components/DecisionSupport.vue @@ -19,7 +19,7 @@ </div> </div> <div class="container panel decision-container"> - <span class="save-btn" @click="onSaveClick"><img src="/images/save.png" /></span> + <span class="save-btn" @click="onSaveClick" v-if="currentIndicator != 'pollution-indicator'"><img src="/images/save.png" /></span> <div class="download-pictures" id="pictures"> <a v-for="(url, index) in urls" :key="index" download></a> </div> @@ -47,37 +47,66 @@ </el-col> </el-row> </div> - <div class="picture-view indicator-picture-view" v-if="currentIndicator === 'pollution-indicator'"> - <h2 class="title">高楼污染指数</h2> - <div class="picture-block"> - <div class="picture"> - <el-image - :src="indicatorImg" - :preview-src-list="indicatorPreview" - :initial-index="1" - fit="contain" - > - <template #error> - <div class="image-slot"> - <img src="/images/null-picture.png" /> - </div> - <p class="image-tip">暂无图片</p> - </template> - <template #placeholder> - <div class="image-placeholder">正在加载...</div> - </template> - </el-image> - </div> - <div class="instruction"> - <h2>高楼污染指数说明:</h2> - <p>使用激光雷达数据反演PM2.5和PM10</p> - <p>浓度廓线,基于PM2.5和PM10的平均</p> - <p>值构建高楼污染指数,</p> - <p> 高楼(60米),</p> - <p> 超高楼(200米),</p> - <p> 极高楼层(500米)</p> - </div> + + + <div class="toolbar day-toolbar" v-show="currentIndicator === 'pollution-indicator'"> + <div class="times"> + <div class="time-item" v-for="(time, index) in times" :key="index" + :class="{'active': currentTime === time.date, 'first-hour': time.day === '01'}"> + <span class="hour" style="padding-left: 10px">{{ time.month }}</span> + <span class="time" @click="onChangeDayClick(time, index)">{{ time.day }}</span> + </div> + </div> + + <el-date-picker v-model="date" type="date" placeholder="请选择" :clearable="false" :editable="false" + class="date-picker" @change="onChange"> + </el-date-picker> + <div class="control-btn"> + <span @click="onPrevDayTimeClick"><img src="/images/prev.png"/></span> + <span @click="onNextDayTimeClick"><img src="/images/next.png"/></span> + </div> + </div> + + <div class="picture-container raman-picture-container" v-show="currentIndicator === 'pollution-indicator'"> + <div class="picture"> + <div id="pollutionIndicator" + style="margin-top: 66px" + v-loading="loadingPollutionIndicatorStatus" + custom-class="loading" + element-loading-text="加载中"> + </div> </div> +<!-- <div class="picture-block">--> +<!-- <div class="picture">--> +<!-- <el-image--> +<!-- :src="indicatorImg"--> +<!-- :preview-src-list="indicatorPreview"--> +<!-- :initial-index="1"--> +<!-- fit="contain"--> +<!-- >--> +<!-- <template #error>--> +<!-- <div class="image-slot">--> +<!-- <img src="/images/null-picture.png" />--> +<!-- </div>--> +<!-- <p class="image-tip">暂无图片</p>--> +<!-- </template>--> +<!-- <template #placeholder>--> +<!-- <div class="image-placeholder">正在加载...</div>--> +<!-- </template>--> +<!-- </el-image>--> +<!-- </div>--> +<!-- <div class="instruction">--> +<!-- <h2>高楼污染指数说明:</h2>--> +<!-- <p>使用激光雷达数据反演PM2.5和PM10</p>--> +<!-- <p>浓度廓线,基于PM2.5和PM10的平均</p>--> +<!-- <p>值构建高楼污染指数,</p>--> +<!-- <p> 高楼(60米),</p>--> +<!-- <p> 超高楼(200米),</p>--> +<!-- <p> 极高楼层(500米)</p>--> +<!-- </div>--> +<!-- </div>--> + + </div> </div> </div> @@ -87,12 +116,20 @@ import { onMounted, reactive, toRefs } from 'vue'; import * as Tiff from 'browser-tiff.js'; import { DecisionSupportConfig } from '../uilts/Config'; -import { post } from '../uilts/axios'; - + import {get, post} from '../uilts/axios'; + import {HighChartCreate} from "../model/high-chart-create"; + import moment from "moment"; + import {ConstantRamanLidar} from "../model/constant"; + import {CustomeArray} from "../model/custome-array"; export default { name: 'DecisionSupport', setup() { + let options = reactive({ + times: [], + currentTime: null, + date: moment().format('YYYY-MM-DD 00:00:00'), + index: 0, currentIndicator: 'plan-advice', currentProduct: 'control-experiment', items: [{ @@ -128,18 +165,28 @@ import { post } from '../uilts/axios'; }], indicatorImg: '/product/picture/images/decision-support/pollution-indicator/pollution-indicator.png', indicatorPreview: ['/product/picture/images/decision-support/pollution-indicator/pollution-indicator.png'], - urls: [] + urls: [], + loadingPollutionIndicatorStatus: false }) + let creates: { + pollutionIndicator: HighChartCreate + } = { + pollutionIndicator: null + } onMounted(() => { + initTimeLineDay() setImage(options.currentIndicator + '/' + options.currentProduct); }) const onIndicatorClick = (indicator) => { options.currentIndicator = indicator; - if(options.currentIndicator === 'plan-advice') - setImage(options.currentIndicator + '/' + options.currentProduct); + if(options.currentIndicator === 'plan-advice') { + setImage(options.currentIndicator + '/' + options.currentProduct); + } + reloadChartsRecognition('hbpi', drawPollutionIndicator) + pollutionIndicatorInit() } const onProductClick = (product) => { @@ -193,11 +240,133 @@ import { post } from '../uilts/axios'; } } + const pollutionIndicatorInit = () => { + creates.pollutionIndicator = new HighChartCreate('pollutionIndicator'); + creates.pollutionIndicator.setChart(false, 'line', 1500, 600); + creates.pollutionIndicator.setXAxisTypeDate(); + creates.pollutionIndicator.setSpecialYAxis('高楼污染指数'); + creates.pollutionIndicator.setLegend(true); + creates.pollutionIndicator.setTooltip('{point.y}'); + creates.pollutionIndicator.setSeries('高楼', 0, null, null, '#B21523') + creates.pollutionIndicator.setSeries('超高楼', 0, null, null, '#000B6F') + creates.pollutionIndicator.setSeries('极高楼层', 0, null, null, '#853083') + creates.pollutionIndicator.init(); + } + + const drawPollutionIndicator = (result: CustomeArray<any>) => { + if (result[0].time == null) return; + const data = prepareChartData(result); + creates.pollutionIndicator.updateSeries(0, data[0]); + creates.pollutionIndicator.updateSeries(1, data[1]); + creates.pollutionIndicator.updateSeries(2, data[2]); + options.loadingPollutionIndicatorStatus = false + } + + const prepareChartData = (result) => { + if (result[0].data == null) { + let temp = [] + for (let i = 0; i < 72; i++) { + temp.push(NaN); + } + result[0].data = [temp]; + } + let prepareData = [] + let startTimeMoment = moment(result[0].time, 'M_D_H').add(8, 'h') + result[0].data.forEach(item => { + let data = [] + for (let i = 0, len = item.length; i < len; i++) { + data.push([startTimeMoment.clone().add(1 * i, 'h').valueOf(), item[i]]) + } + prepareData.push(data) + }) + return prepareData; + } + + const reloadChartsRecognition = (element: string, callback: any) => { + options.loadingPollutionIndicatorStatus = true + let result = new CustomeArray(callback); + let time = moment(options.date); + reloadPollutionIndicator(time.format('M_D_H'), element, result); + } + + const reloadPollutionIndicator = (time: string, elementCode, result: CustomeArray<any>) => { + let params = prepareApiParams(time, elementCode) + get('/njqxj/lmlidar', params, ConstantRamanLidar.baseUrl).then((response: any) => { + if (response.state != 0) { + setChartsRecognitionResult(time, response.message, null, result); + return; + } + setChartsRecognitionResult(time, response.message, response.data, result); + }).catch(error => { + setChartsRecognitionResult(time, error.message, null, result); + }) + } + + const prepareApiParams = (time, elementCode) => { + return { + var: elementCode, + locate: 'nj', + date: moment(time,'MM_DD_hh').format('M_D'), + } + } + + const setChartsRecognitionResult = (time: string, message: string, data: any, result: CustomeArray<any>) => { + result.push({ + time: time, + message: message, + data: data == null ? null : JSON.parse(data) + }) + } + + const initTimeLineDay = () => { + options.times = []; + options.currentTime = moment(options.date).format('YYYY-MM-DD'); + let now = moment(options.date).add(1, 'd'); + let day = new Date(now.year(), now.month() + 1, 0); + for (let i = 0; i < 24; i++) { + options.times.push({ + day: now.add(-1, 'd').format('DD'), + month: now.format('MM'), + date: now.format('YYYY-MM-DD'), + }) + } + options.times.reverse(); + options.index = options.times.length - 1; + } + + const onChangeDayClick = (time, index) => { + options.currentTime = time.date + options.date = moment(time.date).format('YYYY-MM-DD'); + reloadChartsRecognition('hbpi', drawPollutionIndicator) + options.index = index; + } + + const onPrevDayTimeClick = () => { + options.date = moment(options.date).add(-1, 'day').format('YYYY-MM-DD'); + initTimeLineDay() + reloadChartsRecognition('hbpi', drawPollutionIndicator) + } + + const onNextDayTimeClick = () => { + options.date = moment(options.date).add(1, 'day').format('YYYY-MM-DD'); + initTimeLineDay() + reloadChartsRecognition('hbpi', drawPollutionIndicator) + } + + const onChange = () => { + initTimeLineDay(); + reloadChartsRecognition('hbpi', drawPollutionIndicator) + } + return { ...toRefs(options), onIndicatorClick, onProductClick, - onSaveClick + onSaveClick, + onChangeDayClick, + onPrevDayTimeClick, + onNextDayTimeClick, + onChange } } } @@ -284,6 +453,25 @@ import { post } from '../uilts/axios'; } } } + .raman-picture-container { + margin: 0 auto; + .picture { + width: 100%; + height: 100%; + } + } + .toolbar { + //padding: 0.15rem 0; + padding-bottom: 7px; + margin: -12px 0.25rem 0px; + .times { + padding-bottom: 0; + } + :deep(.date-picker), .control-btn { + margin-top: 12px; + } + + } } } </style> diff --git a/04.系统编码/Frontend/src/components/Login.vue b/04.系统编码/Frontend/src/components/Login.vue index afaa4b2..729afab 100644 --- a/04.系统编码/Frontend/src/components/Login.vue +++ b/04.系统编码/Frontend/src/components/Login.vue @@ -93,7 +93,7 @@ export default { <style lang="less" scoped> .loginInput { - width: 6.51rem; + width: 6.1rem; border-radius: 10px; position: absolute; left: 50%; @@ -129,16 +129,17 @@ export default { line-height: 0.4rem; color: #222222; text-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16); - margin-top: 1.20rem; + margin-top: 0.9rem; margin-bottom: 0.52rem; padding-left: 0.12rem; + z-index: 100; } :deep(.input) { width: 4.96rem; - height: 0.69rem; + height: 0.59rem; background: #FFFFFF; border: 1px solid #BCBCBC; - margin-bottom: 0.7rem; + margin-bottom: 0.6rem; .el-input__inner{ height: 100% !important; @@ -156,7 +157,7 @@ export default { width: 0.18rem; height: 0.18rem; position: absolute; - top: -0.10rem; + top: -0.14rem; left: 0.18rem; } } diff --git a/04.系统编码/Frontend/src/components/MicrowaveRadiation.vue b/04.系统编码/Frontend/src/components/MicrowaveRadiation.vue index 7fd04e9..50c304f 100644 --- a/04.系统编码/Frontend/src/components/MicrowaveRadiation.vue +++ b/04.系统编码/Frontend/src/components/MicrowaveRadiation.vue @@ -629,11 +629,11 @@ export default { clearBoxDrawer(drawers.originalDrawer); clearBoxDrawer(drawers.abnormalDrawer); if (response.code != 200 || response.data.radar_data.length === 0) { - createEmptyCanvas('original-data-canvas', 800, 600); + createEmptyCanvas('original-data-canvas', 800, 650); // createEmptyCanvas('abnormal-canvas', 1500, 500); return; } - drawers.originalDrawer = new BoxDrawer(800, 600, prepareTmpOriginalColors(options.SeasonValue), response.data, 'original-data-canvas', 'T/℃'); + drawers.originalDrawer = new BoxDrawer(800, 650, 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; @@ -652,15 +652,15 @@ export default { clearBoxDrawer(drawers.interpolateDrawer); if (response.code != 200 || response.data.radar_data.length === 0) { if (options.currentTab === 'MWR') - createEmptyCanvas('interpolate-canvas', 800, 600); + createEmptyCanvas('interpolate-canvas', 800, 650); else if (options.currentTab === 'shixu_BPFY') - createEmptyCanvas('BP-temp', 1200, 600); + createEmptyCanvas('BP-temp', 1400, 700); return; } if (options.currentTab === 'MWR') - drawers.interpolateDrawer = new BoxDrawer(800, 600, prepareTmpOriginalColors(options.SeasonValue), response.data, 'interpolate-canvas', 'T/℃'); + drawers.interpolateDrawer = new BoxDrawer(800, 650, prepareTmpOriginalColors(options.SeasonValue), response.data, 'interpolate-canvas', 'T/℃'); else if (options.currentTab === 'shixu_BPFY') - drawers.interpolateDrawer = new BoxDrawer(1200, 600, prepareBPTempColors(), response.data, 'BP-temp', '(degree)'); + drawers.interpolateDrawer = new BoxDrawer(1400, 700, prepareBPTempColors(), response.data, 'BP-temp', '(degree)'); // options.contrast.fillingImgUrl = drawers.interpolateDrawer.base64Image; }) } @@ -675,10 +675,10 @@ export default { 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', 1200, 600); + createEmptyCanvas('BP-relative-humidity', 1400, 700); return; } - drawers.BPRelativeHumidity = new BoxDrawer(1200, 600, prepareBPRelativeHumidityColors(), response.data, 'BP-relative-humidity', '(%)'); + drawers.BPRelativeHumidity = new BoxDrawer(1400, 700, prepareBPRelativeHumidityColors(), response.data, 'BP-relative-humidity', '(%)'); // options.contrast.fillingImgUrl = drawers.interpolateDrawer.base64Image; }) } @@ -693,10 +693,10 @@ export default { 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', 1200, 600); + createEmptyCanvas('BP-vapor-density', 1400, 700); return; } - drawers.BPVaporDensity = new BoxDrawer(1200, 600, prepareBPVaporDensityColors(), response.data, 'BP-vapor-density', '(g/kg)'); + drawers.BPVaporDensity = new BoxDrawer(1400, 700, prepareBPVaporDensityColors(), response.data, 'BP-vapor-density', '(g/kg)'); // options.contrast.fillingImgUrl = drawers.interpolateDrawer.base64Image; }) } @@ -1020,7 +1020,7 @@ export default { } } .raman-picture-container { - width: calc(~"100% - 1rem"); + //width: calc(~"100% - 1rem"); margin: 0 auto; #original-data-canvas /*#abnormal-canvas*/, #interpolate-canvas { } @@ -1033,7 +1033,7 @@ export default { width: 100%; font-size: 0.22rem; position: absolute; - left: 3.4rem; + left: 3.6rem; top: 0.3rem; z-index: 1000; } @@ -1046,7 +1046,7 @@ export default { // //} #BP-temp, #BP-relative-humidity, #BP-vapor-density { - transform: scale(1, 1.0) translate(-42px, 55px); + transform: scale(1, 1.0) translateX(-42px); } .shiXu { diff --git a/04.系统编码/Frontend/src/components/RamanLidar.vue b/04.系统编码/Frontend/src/components/RamanLidar.vue index 7463d44..8b71d7c 100644 --- a/04.系统编码/Frontend/src/components/RamanLidar.vue +++ b/04.系统编码/Frontend/src/components/RamanLidar.vue @@ -40,13 +40,13 @@ </el-row> </div> - <div class="menu-item"> - <h2 class="tip">要素选择</h2> + <div class="menu-item"> + <h2 class="tip">要素选择</h2> <el-row :gutter="12"> - <el-col :span="24" v-for="(item, index) in elementData" :key = 'index'> + <el-col :span="24" v-for="(item, index) in elementData" :key='index'> <span @click="onElementClick(item.value)" - :class="{'active': currentElement === item.value}">{{ item.label }}</span></el-col> - </el-row> + :class="{'active': currentElement === item.value}">{{ item.label }}</span></el-col> + </el-row> </div> </div> @@ -105,7 +105,7 @@ <div class="picture-container raman-picture-container" v-show=" currentElement=== 'aod-icot-wcot'"> <div class="picture"> <div id="opticalThickness" - style="width: 1000px;height: 450px;margin-top: 66px" + style="margin-top: 66px" v-loading="loadingOpticalThicknessStatus" custom-class="loading" element-loading-text="加载中"> @@ -113,7 +113,7 @@ </div> </div> - <div class="picture-container raman-picture-container" v-show = "currentElement=== 'extinctionOptics'"> + <div class="picture-container raman-picture-container" v-show="currentElement=== 'extinctionOptics'"> <div class="picture special-picture"> <div v-loading="loadingExtinctionOpticsStatus" style="width: 100%;height: 100%" @@ -155,20 +155,20 @@ </div> </div> - <div class="picture-container raman-picture-container" v-show="currentElement=== 'pblh'"> + <div class="picture-container raman-picture-container" v-show="currentElement=== 'pblh'"> <div class="picture"> <div id="BoundaryLayerHeight" - style="width: 1000px;height: 450px;margin-top: 66px" + style="margin-top: 66px" v-loading="loadingBoundaryLayerHeightStatus" custom-class="loading" element-loading-text="加载中"></div> </div> - </div> + </div> - <div class="picture-container raman-picture-container" v-show="currentElement=== 'lidarratio'"> + <div class="picture-container raman-picture-container" v-show="currentElement=== 'lidarratio'"> <div class="picture"> <div id="LidarRatio" - style="width: 1000px;height: 450px;margin-top: 66px" + style="margin-top: 66px" v-loading="loadingLidarRatioStatus" custom-class="loading" element-loading-text="加载中"> @@ -191,7 +191,7 @@ <div class="picture-container raman-picture-container" v-show="currentElement=== 'cloudbaseheight'"> <div class="picture special-picture"> <div id="cloudsHeight" - style="width: 1000px;height: 450px;margin-top: 66px" + style="margin-top: 66px" v-loading="loadingCloudsHeightStatus" custom-class="loading" element-loading-text="加载中"></div> @@ -201,7 +201,7 @@ <div class="picture-container raman-picture-container" v-show="currentElement=== 'cloudtopheight'"> <div class="picture special-picture"> <div id="cloudTopHeight" - style="width: 1000px;height: 450px;margin-top: 66px" + style="margin-top: 66px" v-loading="loadingCloudTopHeightStatus" custom-class="loading" element-loading-text="加载中"></div> @@ -209,18 +209,17 @@ </div> - -<!-- <div class="picture-container raman-picture-container" v-show="currentElement === 'layertype'">--> -<!-- <div class="picture special-picture">--> -<!--<!– <h2 class="title">云的识别</h2>–>--> -<!-- <div v-loading="loadingCloudRecognitionStatus"--> -<!-- style="width: 100%;"--> -<!-- custom-class="loading"--> -<!-- element-loading-text="加载中">--> -<!-- <canvas id='cloud_recognition_chart'></canvas>--> -<!-- </div>--> -<!-- </div>--> -<!-- </div>--> + <!-- <div class="picture-container raman-picture-container" v-show="currentElement === 'layertype'">--> + <!-- <div class="picture special-picture">--> + <!--<!– <h2 class="title">云的识别</h2>–>--> + <!-- <div v-loading="loadingCloudRecognitionStatus"--> + <!-- style="width: 100%;"--> + <!-- custom-class="loading"--> + <!-- element-loading-text="加载中">--> + <!-- <canvas id='cloud_recognition_chart'></canvas>--> + <!-- </div>--> + <!-- </div>--> + <!-- </div>--> <div class="picture-container raman-picture-container" v-show="currentElement === 'extinction'"> <div class="picture special-picture"> @@ -285,7 +284,7 @@ export default { name: 'RamanLidar', setup() { let timer = null; - const quailtyTimes = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", + const quailtyTimes = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"]; let creates: { @@ -394,20 +393,19 @@ export default { //边界层高度 const boundaryLayerHeightInit = () => { creates.boundaryLayerHeight = new HighChartCreate('BoundaryLayerHeight'); - creates.boundaryLayerHeight.setChart(false,'line', 1000); + creates.boundaryLayerHeight.setChart(false, 'line', 1500, 600); creates.boundaryLayerHeight.setXAxisTypeDate(); creates.boundaryLayerHeight.setSpecialYAxis('边界层高度(m)'); creates.boundaryLayerHeight.setLegend(); creates.boundaryLayerHeight.setTooltip('高度: {point.y}'); - creates.boundaryLayerHeight.setSeries('边界层高度',0, null, null, '#3636FF') + creates.boundaryLayerHeight.setSeries('边界层高度', 0, null, null, '#3636FF') creates.boundaryLayerHeight.init(); } //云层高度 const cloudsHeightInit = () => { creates.cloudsHeight = new HighChartCreate('cloudsHeight'); - creates.cloudsHeight.setChart(false, 'scatter', 1000); - // creates.cloudsHeight.setSpecialXAxis('时间(小时)', 24, 0, 2); + creates.cloudsHeight.setChart(false, 'scatter', 1500, 600); creates.cloudsHeight.setXAxisTypeDate(); creates.cloudsHeight.setSpecialYAxis('高度(m)'); creates.cloudsHeight.setLegend(); @@ -419,7 +417,7 @@ export default { //云顶高度 const cloudTopHeightInit = () => { creates.cloudTopHeight = new HighChartCreate('cloudTopHeight'); - creates.cloudTopHeight.setChart(false, 'scatter', 1000); + creates.cloudTopHeight.setChart(false, 'scatter', 1500, 600); // creates.cloudTopHeight.setSpecialXAxis('时间(小时)', 24, 0, 2); creates.cloudTopHeight.setXAxisTypeDate(); creates.cloudTopHeight.setSpecialYAxis('高度(m)'); @@ -432,10 +430,9 @@ export default { //激光雷达比 const LidarRatioInit = () => { creates.LidarRatio = new HighChartCreate('LidarRatio'); - creates.LidarRatio.setChart(false,'line', 1000); + creates.LidarRatio.setChart(false, 'line', 1500, 600); creates.LidarRatio.setSpecialXAxis('激光雷达比(单位立体角)', 120, 0, 20); - // creates.LidarRatio.setSpecialYAxis('高度(m)'); - creates.LidarRatio.setYAxis('高度(m)', 3000, 0); + creates.LidarRatio.setSpecialYAxis('高度(m)', 3000, 0); creates.LidarRatio.setLegend(); creates.LidarRatio.setTooltip('高度: {point.y}'); creates.LidarRatio.setSeries('激光雷达比', 0, null, null, '#3636FF') @@ -445,7 +442,7 @@ export default { //光学厚度 const opticalThicknessInit = () => { creates.opticalThickness = new HighChartCreate('opticalThickness'); - creates.opticalThickness.setChart(false,'line', 1000); + creates.opticalThickness.setChart(false, 'line', 1500, 600); creates.opticalThickness.setXAxisTypeDate(); creates.opticalThickness.setSpecialYAxis('光学厚度'); creates.opticalThickness.setLegend(true); @@ -465,14 +462,14 @@ export default { const setAndChangeCurrentTime = (name) => { options.index = 23; - if ("MWR" === name){ + if ("MWR" === name) { options.date = moment().format('YYYY-MM-DD 00:00:00'); options.timeLineFormat = ""; - }else{ + } else { options.date = moment().format('YYYY-MM-DD HH:00:00'); options.timeLineFormat = ""; } - + options.currentTime = options.date; } @@ -487,10 +484,10 @@ export default { if (options.currentTab === 'boundary-layer-height') { options.currentElement = 'singleWatervapor' options.elementData = [ - { - value: 'singleWatervapor', - label: '水汽' - }] + { + value: 'singleWatervapor', + label: '水汽' + }] } else if (options.currentTab === 'optical-property') { options.currentElement = 'aod-icot-wcot' @@ -513,7 +510,7 @@ export default { options.elementData = [ { value: 'pm2_5', - label: '气溶胶PM' + label: '气溶胶浓度' }, { value: 'pblh', @@ -597,9 +594,9 @@ export default { initTimeLine() reloadChartsRecognition('cloudtopheight', drawCloudTopHeightCharts); break; - // case 'layertype' : - // reloadCloudRecognition('layertype', 801, 'layertype', drawCloudRecognition); - // break; + // case 'layertype' : + // reloadCloudRecognition('layertype', 801, 'layertype', drawCloudRecognition); + // break; case 'extinction' : initTimeLine(true); reloadExtinctionBefore(); @@ -618,14 +615,14 @@ export default { const reloadWatervaporBefore = () => { options.loadingWatervaporBeforeStatus = true; let params = { - date: moment(options.date).format('YYYY-MM-DD 00'), - var: 'Vapor Mixing Ratio', - locate: options.currentRegion - } + date: moment(options.date).format('YYYY-MM-DD 00'), + var: 'Vapor Mixing Ratio', + locate: options.currentRegion + } post("/qualityCompare/findByTimeAndElement", params).then((response: any) => { options.loadingWatervaporBeforeStatus = false; - if (response.error != 0){ - createEmptyCanvas('watervapor_chart-before', 800, 650); + if (response.error != 0) { + createEmptyCanvas('watervapor_chart-before', 810, 650); console.log("未找到质控前数据文件"); return; } @@ -635,7 +632,7 @@ export default { } let matrix = convertValueToBox(response.data); - creates.watervaporBeforeDrawer = new HeatMapDrawer(800, 650, matrix, "watervapor_chart-before", 'g/kg'); + creates.watervaporBeforeDrawer = new HeatMapDrawer(810, 700, matrix, "watervapor_chart-before", 'g/kg'); creates.watervaporBeforeDrawer.setAxis(new CoordinateScale(quailtyTimes), new CoordinateScale([0, 500, 1000, 1500], true, true)); creates.watervaporBeforeDrawer.setColorChart(prepareWatervaporColors()); creates.watervaporBeforeDrawer.draw(); @@ -645,14 +642,14 @@ export default { const reloadExtinctionBefore = () => { options.loadingExtinctionBeforeStatus = true; let params = { - date: moment(options.date).format('YYYY-MM-DD HH'), - var: 'MEXT', - locate: options.currentRegion - } + date: moment(options.date).format('YYYY-MM-DD HH'), + var: 'MEXT', + locate: options.currentRegion + } post("/qualityCompare/findByTimeAndElement", params).then((response: any) => { options.loadingExtinctionBeforeStatus = false; - if (response.error != 0){ - createEmptyCanvas('extinction_chart-before', 800, 650); + if (response.error != 0) { + createEmptyCanvas('extinction_chart-before', 810, 650); console.log("未找到质控前数据文件"); return; } @@ -662,7 +659,7 @@ export default { } let matrix = convertValueToBox(response.data); - creates.extinctionBeforeDrawer = new HeatMapDrawer(800, 650, matrix, "extinction_chart-before", '/km'); + creates.extinctionBeforeDrawer = new HeatMapDrawer(810, 700, matrix, "extinction_chart-before", '/km'); creates.extinctionBeforeDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true)); creates.extinctionBeforeDrawer.setColorChart(prepareExtinctionnColors()); creates.extinctionBeforeDrawer.draw(); @@ -671,7 +668,7 @@ export default { const convertValueToBox = (data) => { let timeMoment = moment(options.date).set('h', 1).add(-1, 'd'); - if (options.currentElement === 'extinction'){ + if (options.currentElement === 'extinction') { timeMoment.add(12, 'h'); } @@ -680,7 +677,7 @@ export default { let boxes = new Array<Array<Box>>(); let index = 1; data.forEach(r => { - if (index % 11 == 0){ + if (index % 11 == 0) { timeMoment.add(1, 'h'); timeFormat = timeMoment.format("MM月DD日HH时"); } @@ -788,7 +785,7 @@ export default { } let matrix = converCloudRecognition(801, result, 'backscatter'); - creates.backscatterDrawer = new HeatMapDrawer(1200, 650, matrix, "backscatter_chart",'km/sr'); + creates.backscatterDrawer = new HeatMapDrawer(1400, 700, matrix, "backscatter_chart", 'km/sr'); creates.backscatterDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true)); creates.backscatterDrawer.setColorChart(prepareBackscatterColors()); creates.backscatterDrawer.draw(); @@ -798,7 +795,6 @@ export default { let colorChart = new ColorChart(['#8F0000', '#E00000', '#FF1F00', '#FF6600', '#FF9900', '#FFE000', '#EBFF14', '#99FF66', '#66FF99', '#1FFFE0', '#00E0FF', '#0099FF', '#005CFF', '#0029FF', '#0000E0', '#000099'], [-1, -1.25, -1.5, -1.75, -2, -2.25, -2.5, -2.75, -3, -3.25, -3.5, -3.75, -4, -4.25, -4.5, -4.75, -5] - // [-4, -4.25, -4.5, -4.75, -5, -5.25, -5.5, -5.75, -6, -6.25, -6.5, -6.75, -7, -7.25, -7.5, -7.75, -8] ); colorChart.setDefaultColors('#000099', '#8F0000'); return colorChart; @@ -811,7 +807,7 @@ export default { creates.pm2Point5Drawer.close(); } let matrix = converCloudRecognition(201, result, 'pm2_5'); - creates.pm2Point5Drawer = new HeatMapDrawer(800, 650, matrix, "pm2_5_chart",'μg/m³', 'PM2.5'); + creates.pm2Point5Drawer = new HeatMapDrawer(810, 700, matrix, "pm2_5_chart", 'μg/m³', 'PM2.5'); creates.pm2Point5Drawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 1000, 2000, 3000], true, true)); creates.pm2Point5Drawer.setColorChart(preparePmColors()); creates.pm2Point5Drawer.draw(); @@ -826,7 +822,7 @@ export default { } let matrix = converCloudRecognition(201, result, 'pm10'); - creates.pm10Drawer = new HeatMapDrawer(800, 650, matrix, "pm10_chart", 'μg/m³', 'PM10'); + creates.pm10Drawer = new HeatMapDrawer(810, 700, matrix, "pm10_chart", 'μg/m³', 'PM10'); creates.pm10Drawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 1000, 2000, 3000], true, true)); creates.pm10Drawer.setColorChart(preparePmColors()); creates.pm10Drawer.draw(); @@ -842,7 +838,6 @@ export default { const drawLidarRatioCharts = (result: CustomeArray<any>) => { if (result.length <= 0) return; const data = LidarRatioPrepareChartData(result); - console.log(data); creates.LidarRatio.updateSeries(0, data); options.loadingLidarRatioStatus = false } @@ -935,7 +930,7 @@ export default { } let matrix = converCloudRecognition(801, result, 'cloudSol'); - creates.cloudSolDrawer = new HeatMapDrawer(1200, 650, matrix, "cloud_sol_chart"); + creates.cloudSolDrawer = new HeatMapDrawer(1400, 700, matrix, "cloud_sol_chart"); creates.cloudSolDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true)); creates.cloudSolDrawer.setColorChart(prepareCloudRecognitionColors()); creates.cloudSolDrawer.draw(); @@ -950,7 +945,7 @@ export default { } let matrix = converCloudRecognition(801, result, 'extinctionOptics'); - creates.opticsExtinctionDrawer = new HeatMapDrawer(1200, 650, matrix, "extinction_optics_chart",'/km'); + creates.opticsExtinctionDrawer = new HeatMapDrawer(1400, 700, matrix, "extinction_optics_chart", '/km'); creates.opticsExtinctionDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true)); creates.opticsExtinctionDrawer.setColorChart(prepareExtinctionnColors()); creates.opticsExtinctionDrawer.draw(); @@ -966,7 +961,7 @@ export default { } let matrix = converCloudRecognition(101, result, 'singleWatervapor'); - creates.singleWatervaporDrawer = new HeatMapDrawer(1200, 650, matrix, "watervapor_single_chart",' g/kg'); + creates.singleWatervaporDrawer = new HeatMapDrawer(1400, 700, matrix, "watervapor_single_chart", ' g/kg'); creates.singleWatervaporDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 500, 1000, 1500], true, true)); creates.singleWatervaporDrawer.setColorChart(prepareWatervaporColors()); creates.singleWatervaporDrawer.draw(); @@ -981,7 +976,7 @@ export default { } let matrix = converCloudRecognition(101, result, 'watervapor'); - creates.watervaporDrawer = new HeatMapDrawer(800, 650, matrix, "watervapor_chart-after",'g/kg'); + creates.watervaporDrawer = new HeatMapDrawer(800, 700, matrix, "watervapor_chart-after", 'g/kg'); creates.watervaporDrawer.setAxis(new CoordinateScale(quailtyTimes), new CoordinateScale([0, 500, 1000, 1500], true, true)); creates.watervaporDrawer.setColorChart(prepareWatervaporColors()); creates.watervaporDrawer.draw(); @@ -1003,7 +998,7 @@ export default { } let matrix = converCloudRecognition(801, result, 'extinction'); - creates.extinctionDrawer = new HeatMapDrawer(800, 650, matrix, "extinction_chart-after", '/km'); + creates.extinctionDrawer = new HeatMapDrawer(800, 700, matrix, "extinction_chart-after", '/km'); creates.extinctionDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true)); creates.extinctionDrawer.setColorChart(prepareExtinctionnColors()); creates.extinctionDrawer.draw(); @@ -1044,10 +1039,8 @@ export default { const reloadChartLidarratio = (element: string, callback: any) => { preprocessingCharts(element) let result = new CustomeArray(callback); - let time = moment(options.date); - - reloadSingleChartsRecognition(time.format('M_D_H'), element, result); + reloadSingleChartsRecognition(time.format('M_D_H'), element, result); } const drawCloudRecognition = (result: CustomeArray<any>) => { @@ -1066,7 +1059,7 @@ export default { const prepareCloudRecognitionColors = () => { return new ColorChart(['#0000FF', '#00FF00', '#FF0000', '#FFFFFF'], - [{ label: '冰云', value: 3 }, { label: '水云', value: 2 }, { label: '气溶胶', value: 1 }, { label: '晴空', value: 0 }], + [{label: '冰云', value: 3}, {label: '水云', value: 2}, {label: '气溶胶', value: 1}, {label: '晴空', value: 0}], false, false, "equal" @@ -1094,8 +1087,8 @@ export default { const interval = Math.round(11 / r.data[0].length); for (let h = 0, len = capacity; h < len; h++) { let tempIndex = parseInt(index + ""); - if (r.data[h] == null){ - for(let i = 0; i < 11; i++){ + if (r.data[h] == null) { + for (let i = 0; i < 11; i++) { tempIndex++; if (matrix[tempIndex] == null) { matrix[tempIndex] = new Array<Box>(capacity); @@ -1114,7 +1107,7 @@ export default { matrix[tempIndex] = new Array<Box>(capacity); } - if (h < 4){ + if (h < 4) { matrix[tempIndex][h] = new Box(tempIndex, h, 0, 0, NaN, h * 15, time, "米"); continue; } @@ -1372,10 +1365,9 @@ export default { const onPrevDayClick = () => { let element = getCurrentElement(); - if (moment(options.date).add(-1, 'day').format('YYYY-MM-DD') == moment().format('YYYY-MM-DD') ) { + if (moment(options.date).add(-1, 'day').format('YYYY-MM-DD') == moment().format('YYYY-MM-DD')) { options.date = moment().format('YYYY-MM-DD HH') - } - else options.date = moment(options.date).add(-1, 'day').format('YYYY-MM-DD'); + } else options.date = moment(options.date).add(-1, 'day').format('YYYY-MM-DD'); options.currentTime = options.date; options.index--; if (options.index < 0) { @@ -1390,10 +1382,9 @@ export default { } const onNextDayClick = () => { - if (moment(options.date).add(1, 'day').format('YYYY-MM-DD') == moment().format('YYYY-MM-DD') ) { + if (moment(options.date).add(1, 'day').format('YYYY-MM-DD') == moment().format('YYYY-MM-DD')) { options.date = moment().format('YYYY-MM-DD HH') - } - else options.date = moment(options.date).add(1, 'day').format('YYYY-MM-DD') + } else options.date = moment(options.date).add(1, 'day').format('YYYY-MM-DD') options.timeLineFormat = "day"; initTimeLine() elementChange(options.currentElement) @@ -1440,9 +1431,7 @@ export default { // const timeExcute = () => { // clearTimer(); - // // let element = getCurrentElement(); - // // timer = setInterval(() => { // options.index++; // if (options.index > element.childElementCount - 1) @@ -1471,12 +1460,11 @@ export default { // } const onChange = (e) => { - if (options.currentElement === 'extinction' || options.currentElement=== 'lidarratio' || options.currentElement === 'watervapor') { + if (options.currentElement === 'extinction' || options.currentElement === 'lidarratio' || options.currentElement === 'watervapor') { options.timeLineFormat = "hour"; initTimeLineDay() - } - else { - if (moment(e).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD') ) { + } else { + if (moment(e).format('YYYY-MM-DD') == moment().format('YYYY-MM-DD')) { options.date = moment().format('YYYY-MM-DD HH') } options.timeLineFormat = "day"; @@ -1519,7 +1507,7 @@ export default { const prepareApiParams = (time, variableName) => { if (variableName == 'lidarratio') { return { - date: moment(time,'MM_DD_hh').format('M_D'), + date: moment(time, 'MM_DD_hh').format('M_D'), var: variableName, locate: options.currentRegion } @@ -1570,7 +1558,6 @@ export default { options.date = moment(time.date).format('YYYY-MM-DD'); elementChange(options.currentElement) options.index = index; - } const onPrevDayTimeClick = () => { @@ -1617,7 +1604,6 @@ export default { :deep(.el-date-editor), .control-btn, :deep(.el-select), .unit { padding-top: 0.08rem; } - :deep(.el-input__prefix) { top: 4px; } @@ -1632,7 +1618,7 @@ export default { } .raman-picture-container { - width: calc(~"100% - 1rem"); + //width: calc(~"100% - 1rem"); margin: 0 auto; .special-picture { @@ -1648,43 +1634,34 @@ export default { //margin-top: 30px; #watervapor_single_chart { - transform: translateX(9%) translateY(20px); - //transform: scale(1.0, 0.8) translateX(539px); + transform: translateX(6%) translateY(50px); } #extinction_optics_chart { - //transform: scale(0.56, 0.85) translateX(-32%); - transform: translateX(9%) translateY(20px); - + transform: translateX(6%) translateY(50px); } #pm2_5_chart { - transform: translateX(-50px) translateY(20px); + transform: translateX(-15px) translateY(50px); } #pm10_chart { - transform: translateX(-50px) translateY(20px); + transform: translateX(-15px) translateY(50px); } #backscatter_chart { - transform: translateX(9%) translateY(20px); - //transform: scale(0.6, 0.85) translateX(-76px); + transform: translateX(6%) translateY(50px); } #cloud_sol_chart { - transform: translateX(9%) translateY(20px); - //transform: scale(0.6, 0.85) translate(-12%, -12px); + transform: translateX(6%) translateY(50px); } - //#cloud_recognition_chart, #extinction_chart-before, #extinction_chart-after, #watervapor_chart-before, - #watervapor_chart-after - { - transform: translateX(-50px) translateY(50px); - //transform: scale(0.6, 0.8) translateX(-260px); - //transform: scale(0.6, 0.8) translateX(-131px); + #watervapor_chart-after { + transform: translateY(50px); } .title { @@ -1704,7 +1681,6 @@ export default { width: 50%; } } - } } } diff --git a/04.系统编码/Frontend/src/model/heat-map-drawer.ts b/04.系统编码/Frontend/src/model/heat-map-drawer.ts index dc9fae5..d04ecc3 100644 --- a/04.系统编码/Frontend/src/model/heat-map-drawer.ts +++ b/04.系统编码/Frontend/src/model/heat-map-drawer.ts @@ -12,9 +12,9 @@ export class HeatMapDrawer{ private readonly width: number = null; private readonly height: number = null; - private readonly paddingLeft: number = 150; - private readonly paddingRight: number = 100; - private readonly paddingTop: number = 80; + private readonly paddingLeft: number = 100; + private readonly paddingRight: number = 115; + private readonly paddingTop: number = 50; private readonly paddingBottom: number = 100; private colorChart: ColorChart = null; private values: any = null; @@ -259,7 +259,7 @@ export class HeatMapDrawer{ // 保存原有的canvas状态,供restore方法重置 this.canvasContext.save(); let name = "高度(m)"; - this.canvasContext.translate(90, this.height / 2 + this.paddingTop - this.canvasContext.measureText(name).width); + this.canvasContext.translate(45, this.height / 2 + this.paddingTop - this.canvasContext.measureText(name).width); this.canvasContext.rotate(Math.PI * 1.5); this.canvasContext.font="normal 22px 微软雅黑"; this.canvasContext.fillStyle="#000000"; @@ -295,17 +295,17 @@ export class HeatMapDrawer{ //温度单位 private drawTemperatureText(unit): void { - this.canvasContext.font = "normal 25px 微软雅黑"; + this.canvasContext.font = "normal 35px 微软雅黑"; this.canvasContext.fillStyle = "#000000"; let unitX = this.width - this.paddingRight; - this.canvasContext.fillText(unit, unitX, 70); + this.canvasContext.fillText(unit, unitX, 45); } private drawResolutionName(name): void { this.canvasContext.font = "normal 35px 微软雅黑"; this.canvasContext.fillStyle = "#000000"; - let nameX = 380 - this.canvasContext.fillText(name, nameX, 60) + let nameY = this.paddingTop - 23 + this.canvasContext.fillText(name, 380, nameY) } private drawVerticalScale(): void{ @@ -315,7 +315,7 @@ export class HeatMapDrawer{ let startX = this.paddingLeft + this.horizontalScaleLine; let startY = this.paddingTop + this.verticalScaleLine; - this.canvasContext.font = "normal 16px 微软雅黑"; + this.canvasContext.font = "normal 25px 微软雅黑"; this.canvasContext.fillStyle = "#000000"; for(let index = 0, len = scaleCount, lastLen = scaleCount - 1; index < len; index++){ if ((index == 0 && !this.xAxis.showStartValue) || (index == lastLen && !this.xAxis.showEndValue)) continue; @@ -339,9 +339,9 @@ export class HeatMapDrawer{ private setTimeDetail(_x: number, startY: number, text: string): void{ // const text = this.values[15][0].time.slice(0, 6); - this.canvasContext.font = "normal 14px 微软雅黑"; + this.canvasContext.font = "normal 15px 微软雅黑"; this.canvasContext.fillText(text, _x - this.canvasContext.measureText(text).width / 2, startY + this.verticalScaleLine + this.borderHeight + 38); - this.canvasContext.font = "normal 16px 微软雅黑"; + this.canvasContext.font = "normal 17px 微软雅黑"; } private drawHorizontalScale(): void{ diff --git a/04.系统编码/Frontend/src/model/high-chart-create.ts b/04.系统编码/Frontend/src/model/high-chart-create.ts index 713dc73..e614d59 100644 --- a/04.系统编码/Frontend/src/model/high-chart-create.ts +++ b/04.系统编码/Frontend/src/model/high-chart-create.ts @@ -19,11 +19,12 @@ export class HighChartCreate { this.id = id; } - public setChart(inverted: boolean = false, type: string = 'line', width: number = null): void { + public setChart(inverted: boolean = false, type: string = 'line', width: number = null, height: number = null): void { this.chart = { type: type, inverted: inverted, - width: width + width: width, + height: height }; } @@ -54,7 +55,7 @@ export class HighChartCreate { type: 'datetime', labels: { style: { - fontSize:'18px' + fontSize:'20px' }, formatter: function () { return Highcharts.dateFormat('%d日%H时', this.value); @@ -86,7 +87,7 @@ export class HighChartCreate { }, labels: { style: { - fontSize:'18px' + fontSize:'20px' }, }, max: max, @@ -129,7 +130,7 @@ export class HighChartCreate { labels: { y: 8, style: { - fontSize:'18px' + fontSize:'20px' }, }, max: max, diff --git a/04.系统编码/Frontend/src/uilts/box-drawer.ts b/04.系统编码/Frontend/src/uilts/box-drawer.ts index 38cacd4..9135eec 100644 --- a/04.系统编码/Frontend/src/uilts/box-drawer.ts +++ b/04.系统编码/Frontend/src/uilts/box-drawer.ts @@ -26,8 +26,8 @@ export class BoxDrawer{ private readonly width: number = null; private readonly height: number = null; - private readonly paddingLeft: number = 150; - private readonly paddingRight: number = 130; + private readonly paddingLeft: number = 110; + private readonly paddingRight: number = 110; private readonly paddingTop: number = 60; private readonly paddingBottom: number = 50; private readonly colorChart: ColorChart = null; @@ -243,7 +243,7 @@ export class BoxDrawer{ this.canvasContext.save(); let name = "高度(km)"; this.canvasContext.font="normal 22px 微软雅黑"; - this.canvasContext.translate(80, this.height / 2 + this.paddingTop); + this.canvasContext.translate(70, this.height / 2 + this.paddingTop); this.canvasContext.rotate(Math.PI * 1.5); this.canvasContext.fillStyle="#000000"; this.canvasContext.fillText(name, 0, 0); @@ -278,9 +278,9 @@ export class BoxDrawer{ private drawTemperatureText(unit): void { this.canvasContext.font = "normal 35px 微软雅黑"; this.canvasContext.fillStyle = "#000000"; - let unitX = this.width - this.paddingRight; - if (unit === '(degree)') unitX = this.width - this.paddingRight - 30; - this.canvasContext.fillText(unit, unitX,50); + let unitX = this.width - this.paddingRight - 15; + if (unit === '(degree)') unitX = this.width - this.paddingRight - 40; + this.canvasContext.fillText(unit, unitX,60); } private drawVerticalScale(): void{ @@ -336,7 +336,7 @@ export class BoxDrawer{ this.canvasContext.stroke(); if (flag) { - this.canvasContext.font = "normal 30px 微软雅黑"; + this.canvasContext.font = "normal 25px 微软雅黑"; this.canvasContext.fillStyle = "#000000"; const text = this.values.radar_info[index].col_factor; this.canvasContext.fillText(text, startX - this.canvasContext.measureText(text).width - this.horizontalScaleLine, _y + 10); @@ -417,7 +417,7 @@ export class ColorChart{ throw new Error("色标数据不正确,数据个数应为颜色个数 + 1"); } - public getColor(value: number, id: string = null ): string{ + public getColor(value: number ): string{ if (isNaN(value)) return null; const length = this.valueLength; @@ -443,8 +443,6 @@ export class ColorChart{ } } - - return null; } }