microwave-project-unite/src/components/rtReport/index.vue

543 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="rtReport">
<div class="realResult">
<div class="box1">
<span class="sp1"></span><span class="sp2">真实性检验结果</span>
</div>
<div class="resContent">
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%"
:data="tDatas"
:stripe="true"
class="table-head-transparent"
size="medium"
>
<el-table-column
v-for="(item, index) in Object.keys(tData).slice(0, midValue)"
:key="index"
:label="item | truthFunFilter"
:property="item"
align="center"
>
<template slot-scope="scope">{{ scope.row[item] }}</template>
</el-table-column>
</el-table>
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%; margin-top: 16px"
:data="tDatas"
:stripe="true"
class="table-head-transparent"
size="medium"
>
<el-table-column
v-for="(item, index) in Object.keys(tData).slice(midValue)"
:key="index"
:label="item | truthFunFilter"
:property="item"
align="center"
>
<template slot-scope="scope">{{ scope.row[item] }}</template>
</el-table-column>
</el-table>
<!--<span v-for="(item,index) in resMap" :key="index">{{item.name | truthFunFilter}}{{item.val}}</span>-->
<div v-if="meanError.length !== 0 && meanError !== []">
<el-table
:header-cell-style="headerRowClass"
:cell-style="tableRowClassName"
style="width: 100%"
:data="meanError"
:stripe="true"
size="medium"
>
<el-table-column
prop="3_0"
label="平均相对误差相对X轴误差"
align="center"
v-if="meanError[0]['3_0'] != null"
>
</el-table-column>
<el-table-column
prop="3_1"
label="平均相对误差相对Y轴误差"
align="center"
v-if="meanError[0]['3_1'] != null"
>
</el-table-column>
<el-table-column
prop="4_0"
label="平均绝对相对误差相对X轴误差"
align="center"
v-if="meanError[0]['4_0'] != null"
>
</el-table-column>
<el-table-column
prop="4_1"
label="平均绝对相对误差相对Y轴误差"
align="center"
v-if="meanError[0]['4_1'] != null"
>
</el-table-column>
</el-table>
</div>
<!--<span>相对误差:</span>-->
<!-- <div v-if="relativeError.length !== 0 && relativeError !== []">
<el-table
:data="relativeError"
size="medium"
>
<el-table-column
prop="cre_orthoXRelativeError"
label="相对误差相对X轴误差"
align="center">
</el-table-column>
<el-table-column
prop="cre_orthoYRelativeError"
label="相对误差相对Y轴误差"
align="center">
</el-table-column>
</el-table>
</div> -->
</div>
</div>
<div class="errorGraph">
<div class="box1">
<span class="sp1"></span
><span class="sp2">{{ pdSubTypeName }}误差结果图</span>
</div>
<div class="errContent">
<div id="rtReportEcharts" ref="chart"></div>
<div class="legend" v-if="pdSubType === 1">
<div class="line">
<span class="circle"></span>
<span>样本点</span>
</div>
<div class="line">
<span class="circle_2"></span>
<span>选取点</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { productTypeMap } from "@/lib/variateMap";
import { truthFunVal, productSubTypeVal } from "@/lib/contract";
export default {
props: {
realRes: {
require: true,
},
pdSubType: {
require: true,
},
},
filters: {
truthFunFilter(truthFun) {
const truthFunMap = {
0: "平均误差",
1: "平均绝对误差",
2: "相对误差",
3: "平均相对误差",
4: "平均绝对相对误差",
5: "均方根误差",
6: "平面中误差",
7: "相关系数",
8: "误差矩阵",
9: "总体分类精度",
10: "Kappa系数",
};
return truthFunMap[truthFun];
},
},
data() {
return {
resMap: [],
myCharts: null,
relativeError: [],
meanError: [],
pdSubTypeName: "",
tData: {},
tDatas: null,
midValue: 10,
};
},
created() {
this.initParam();
},
mounted() {
this.myCharts = this.$echarts.init(this.$refs.chart);
if (this.pdSubType === 1) {
this.drawOtgEchart(this.realRes.otgVal);
let da = {};
let dae = {};
for (let i = 0; i < this.resMap.length; i++) {
const o = this.resMap[i];
if (typeof o.val === "number" || typeof o.val === "string") {
da[o.name] = o.val;
} else if (Number(o.name) === truthFunVal.ACM_MEANRELATIVEERROR) {
dae[o.name + "_0"] = o.val.X轴平均相对误差;
dae[o.name + "_1"] = o.val.Y轴平均相对误差;
} else if (
Number(o.name) === truthFunVal.ACM_MEANABSOLUTERELATIVEERROR
) {
dae[o.name + "_0"] = o.val.X轴平均相对绝对误差;
dae[o.name + "_1"] = o.val.Y轴平均相对绝对误差;
}
}
if (Object.keys(dae).length !== 0) {
this.meanError = [dae];
}
this.tData = da;
this.tDatas = [da];
} else {
this.drawPie(this.realRes.errorImageValue);
let da = {};
this.midValue =
this.resMap.length - 1 >= 3
? Math.ceil((this.resMap.length - 1) / 2)
: this.resMap.length;
for (let i = 0; i < this.resMap.length; i++) {
const o = this.resMap[i];
if (
Number(o.name) === truthFunVal.ACM_RELATIVEERROR ||
Number(o.name) === truthFunVal.ACM_REALVALLIST
)
continue; //跳过执行相对误差与真值列表
da[o.name] =
typeof o.val === "number" || typeof o.val === "string"
? o.val
: o.val[0];
}
this.tDatas = [da];
this.tData = da;
}
},
methods: {
headerRowClass() {
return "background: #E4E9F1;text-align:center";
},
tableRowClassName({ rowIndex }) {
if ((rowIndex + 1) % 2 !== 0) {
return "background:#F5F7FA;text-align:center";
} else {
return "background:#FFFFFF;text-align:center";
}
},
getProductDes() {
let prodDes = null;
switch (this.pdSubType) {
case 46:
prodDes = "高程值,单位:米";
break;
case 51:
prodDes = "后向散射系数,单位dB";
break;
case 52:
prodDes = "延迟相位值";
break;
case 53:
prodDes = "形变量,单位:米";
break;
case 38:
prodDes = "土壤含水量";
break;
case 49:
prodDes = "土壤盐碱度";
break;
case 50:
prodDes = "地表粗糙度";
break;
case 48:
prodDes = "植被高度值,单位:米";
break;
case 43:
prodDes = "叶面积指数";
break;
}
return prodDes;
},
initParam() {
// console.log('报告信息',this.realRes)
if (this.realRes !== undefined) {
this.pdSubTypeName = productTypeMap(this.pdSubType);
const rr = this.realRes.report;
if (this.pdSubType === productSubTypeVal.ACS_ORTHOPHOTO) {
for (var i in rr) {
let rVal = rr[i];
switch (Number(i)) {
case truthFunVal.ACM_RELATIVEERROR: //相对误差
this.relativeError = rVal;
break;
case truthFunVal.ACM_MEANRELATIVEERROR: //平均相对误差
const objMap1 = {
cre_orthoXMeanRelativeError: "X轴平均相对误差",
cre_orthoYMeanRelativeError: "Y轴平均相对误差",
};
rVal = Object.fromEntries(
Object.entries(rVal).map(([k, v]) => [objMap1[k] || k, v])
);
this.resMap.push({ name: i, val: rVal });
break;
case truthFunVal.ACM_MEANABSOLUTERELATIVEERROR: //平均绝对相对误差
const objMap2 = {
cre_orthoXMeanAbsoluteRelativeError: "X轴平均相对绝对误差",
cre_orthoYMeanAbsoluteRelativeError: "Y轴平均相对绝对误差",
};
rVal = Object.fromEntries(
Object.entries(rVal).map(([k, v]) => [objMap2[k] || k, v])
);
this.resMap.push({ name: i, val: rVal });
break;
default:
this.resMap.push({ name: i, val: rVal });
}
}
} else {
for (var i in rr) {
let rVal = rr[i];
this.resMap.push({ name: i, val: rVal });
}
}
}
},
drawPie(errorVala) {
let data = [];
let xArr = [];
for (let i in errorVala) {
const a = [errorVala[i].cre_imageValue, errorVala[i].cre_deviation];
xArr.push(errorVala[i].cre_imageValue);
data.push(a);
}
const x_limit = Math.abs(Math.max(...xArr) / xArr.length);
//多项式回归
// var myRegression = this.$ecstat.regression("polynomial", data, 3);
let myRegression = this.$ecstat.regression("linear", data);
myRegression.points.sort(function (a, b) {
return a[0] - b[0];
});
var option = {
animation: false,
xAxis: {
name: "像元值(" + this.getProductDes() + "",
nameLocation: "middle",
min: (Math.min(...xArr) - x_limit).toFixed(5),
max: (Math.max(...xArr) + x_limit).toFixed(5),
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
},
yAxis: {
name: "误差",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
},
series: [
{
symbolSize: 10,
type: "scatter",
data: data,
},
{
type: "line",
smooth: true,
showSymbol: false,
data: myRegression.points,
itemStyle: {
normal: {
color: "#91cc75",
lineStyle: {
width: 3,
},
},
},
},
],
};
option && this.myCharts.setOption(option);
},
drawOtgEchart(otgVal) {
let xl = [];
let yl = [];
let allData = [];
for (let i in otgVal) {
xl.push(otgVal[i].x);
yl.push(otgVal[i].y);
let ad = [];
ad.push(otgVal[i].x, otgVal[i].y);
allData.push(ad);
const j = Number(i) + 1;
if (Number.isInteger(j / 2)) {
allData.push("-");
}
}
let xMax = Math.max(...xl),
xMin = Math.min(...xl);
let yMax = Math.max(...yl),
yMin = Math.min(...yl);
const avgxVal = (xMax - xMin) / 8;
const avgyVal = (yMax - yMin) / 8;
let option = {
grid: {
left: "14%",
},
animation: false,
xAxis: {
name: "经度(°)",
nameLocation: "middle",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
min: Number(xMin - avgxVal * 2).toFixed(4),
max: Number(xMax + avgxVal * 2).toFixed(4),
axisLabel: {
formatter: function (value) {
return Number(value);
},
},
},
yAxis: {
name: "纬度(°)",
nameTextStyle: {
lineHeight: 30,
height: 60,
fontWeight: "bold",
},
min: Number(yMin - avgyVal * 2).toFixed(4),
max: Number(yMax + avgyVal * 2).toFixed(4),
axisLabel: {
formatter: function (value) {
return Number(value);
},
},
},
series: [
{
symbolSize: 8,
data: allData,
type: "line",
itemStyle: {
color: function (params) {
if ((params.dataIndex + 1) % 3 === 2) return "#0000CD";
},
},
},
],
};
option && this.myCharts.setOption(option);
},
},
};
</script>
<style scoped lang="less">
.rtReport {
width: 100%;
height: 100%;
}
.realResult {
width: 100%;
height: calc(55% - 5px);
background-color: white;
margin-bottom: 5px;
}
.errorGraph {
width: 100%;
height: 45%;
background-color: white;
}
.resContent {
border: 1px black solid;
height: calc(100% - 60px);
width: calc(100% - 20px);
margin: 10px;
font-size: 20px;
overflow-y: scroll;
span {
display: block;
margin: 10px;
}
}
.errContent {
border: 1px black solid;
height: calc(100% - 60px);
width: calc(100% - 20px);
margin: 10px;
position: relative;
}
#rtReportEcharts {
width: 100%;
height: 100%;
position: relative;
}
.box1 {
height: 40px;
line-height: 40px;
border-bottom: 1px solid rgb(205, 205, 205, 0.5);
}
.sp1 {
display: inline-block;
width: 7px;
height: 26px;
background-color: #354595;
vertical-align: top;
margin-left: 20px;
margin-top: 8px;
}
.sp2 {
margin-left: 10px;
font-size: 20px;
font-weight: 700;
color: #354595;
vertical-align: top;
}
.legend {
position: absolute;
top: 20px;
right: 20px;
background-color: transparent;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
.line {
height: 20px;
line-height: 20px;
margin: 0 5px;
.circle {
display: inline-block;
width: 7px;
height: 7px;
border: 1px solid rgb(194, 53, 49);
border-radius: 50%;
margin-right: 5px;
}
.circle_2 {
display: inline-block;
width: 7px;
height: 7px;
border-radius: 50%;
margin-right: 5px;
border: 1px solid #0000cd;
}
}
}
</style>