This commit is contained in:
parent
b38e8b5a23
commit
efde66960f
|
@ -9,8 +9,6 @@
|
||||||
<title>
|
<title>
|
||||||
<%= htmlWebpackPlugin.options.title %>
|
<%= htmlWebpackPlugin.options.title %>
|
||||||
</title>
|
</title>
|
||||||
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
|
|
||||||
<script src="https://cdn.bootcdn.net/ajax/libs/bootstrap/4.5.2/js/bootstrap.min.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<img src="../assets/客户侧总体用能情况分析/图层 2.png" alt="" />
|
<img src="../assets/客户侧总体用能情况分析/logo.png" alt="" />
|
||||||
<p>客户侧总体用能情况分析</p>
|
<p>客户侧总体用能情况分析</p>
|
||||||
<img src="../assets/客户侧总体用能情况分析/反白稿.png" alt="" />
|
<img src="../assets/客户侧总体用能情况分析/反白稿.png" alt="" />
|
||||||
</div>
|
</div>
|
||||||
|
@ -551,30 +551,63 @@ export default {
|
||||||
},
|
},
|
||||||
//用能分类占比
|
//用能分类占比
|
||||||
initYnflzb() {
|
initYnflzb() {
|
||||||
let getParametricEquation = function (
|
let optionData = [
|
||||||
|
{
|
||||||
|
name: "楼宇",
|
||||||
|
value: 60,
|
||||||
|
itemStyle: {
|
||||||
|
color: "#37FFC9",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "工业",
|
||||||
|
value: 44,
|
||||||
|
itemStyle: {
|
||||||
|
color: "#31A1FF",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "其他",
|
||||||
|
value: 32,
|
||||||
|
itemStyle: {
|
||||||
|
color: "#FFF777",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
let option = getPie3D(optionData, 0.59);
|
||||||
|
// 生成扇形的曲面参数方程
|
||||||
|
function getParametricEquation(
|
||||||
startRatio,
|
startRatio,
|
||||||
endRatio,
|
endRatio,
|
||||||
isSelected,
|
isSelected,
|
||||||
isHovered,
|
isHovered,
|
||||||
k,
|
k,
|
||||||
height
|
h
|
||||||
) {
|
) {
|
||||||
// 计算
|
// 计算
|
||||||
let midRatio = (startRatio + endRatio) / 2;
|
const midRatio = (startRatio + endRatio) / 2;
|
||||||
let startRadian = startRatio * Math.PI * 2;
|
|
||||||
let endRadian = endRatio * Math.PI * 2;
|
const startRadian = startRatio * Math.PI * 2;
|
||||||
let midRadian = midRatio * Math.PI * 2;
|
const endRadian = endRatio * Math.PI * 2;
|
||||||
|
const midRadian = midRatio * Math.PI * 2;
|
||||||
|
|
||||||
// 如果只有一个扇形,则不实现选中效果。
|
// 如果只有一个扇形,则不实现选中效果。
|
||||||
if (startRatio === 0 && endRatio === 1) {
|
if (startRatio === 0 && endRatio === 1) {
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
isSelected = false;
|
isSelected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)
|
// 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)
|
||||||
|
// eslint-disable-next-line no-param-reassign
|
||||||
k = typeof k !== "undefined" ? k : 1 / 3;
|
k = typeof k !== "undefined" ? k : 1 / 3;
|
||||||
|
|
||||||
// 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)
|
// 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)
|
||||||
let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
|
const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
|
||||||
let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
|
const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
|
||||||
|
|
||||||
// 计算高亮效果的放大比例(未高亮,则比例为 1)
|
// 计算高亮效果的放大比例(未高亮,则比例为 1)
|
||||||
let hoverRate = isHovered ? 1.05 : 1;
|
const hoverRate = isHovered ? 1.05 : 1;
|
||||||
|
|
||||||
// 返回曲面参数方程
|
// 返回曲面参数方程
|
||||||
return {
|
return {
|
||||||
u: {
|
u: {
|
||||||
|
@ -582,12 +615,14 @@ export default {
|
||||||
max: Math.PI * 3,
|
max: Math.PI * 3,
|
||||||
step: Math.PI / 32,
|
step: Math.PI / 32,
|
||||||
},
|
},
|
||||||
|
|
||||||
v: {
|
v: {
|
||||||
min: 0,
|
min: 0,
|
||||||
max: Math.PI * 2,
|
max: Math.PI * 2,
|
||||||
step: Math.PI / 20,
|
step: Math.PI / 20,
|
||||||
},
|
},
|
||||||
x: function (u, v) {
|
|
||||||
|
x(u, v) {
|
||||||
if (u < startRadian) {
|
if (u < startRadian) {
|
||||||
return (
|
return (
|
||||||
offsetX +
|
offsetX +
|
||||||
|
@ -603,7 +638,7 @@ export default {
|
||||||
return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
|
return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
|
||||||
},
|
},
|
||||||
|
|
||||||
y: function (u, v) {
|
y(u, v) {
|
||||||
if (u < startRadian) {
|
if (u < startRadian) {
|
||||||
return (
|
return (
|
||||||
offsetY +
|
offsetY +
|
||||||
|
@ -619,34 +654,36 @@ export default {
|
||||||
return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
|
return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
|
||||||
},
|
},
|
||||||
|
|
||||||
z: function (u, v) {
|
z(u, v) {
|
||||||
if (u < -Math.PI * 0.5) {
|
if (u < -Math.PI * 0.5) {
|
||||||
return Math.sin(u);
|
return Math.sin(u);
|
||||||
}
|
}
|
||||||
if (u > Math.PI * 2.5) {
|
if (u > Math.PI * 2.5) {
|
||||||
return Math.sin(u);
|
return Math.sin(u) * h * 0.1;
|
||||||
}
|
}
|
||||||
return Math.sin(v) > 0 ? 1 * height : -1;
|
// 当前图形的高度是Z根据h(每个value的值决定的)
|
||||||
|
return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
// 生成模拟 3D 饼图的配置项
|
// 生成模拟 3D 饼图的配置项
|
||||||
let getPie3D = function (pieData, internalDiameterRatio) {
|
function getPie3D(pieData, internalDiameterRatio) {
|
||||||
let series = [];
|
const series = [];
|
||||||
|
// 总和
|
||||||
let sumValue = 0;
|
let sumValue = 0;
|
||||||
let startValue = 0;
|
let startValue = 0;
|
||||||
let endValue = 0;
|
let endValue = 0;
|
||||||
let legendData = [];
|
const legendData = [];
|
||||||
let k =
|
const k =
|
||||||
typeof internalDiameterRatio !== "undefined"
|
typeof internalDiameterRatio !== "undefined"
|
||||||
? (1 - internalDiameterRatio) / (1 + internalDiameterRatio)
|
? (1 - internalDiameterRatio) / (1 + internalDiameterRatio)
|
||||||
: 1 / 3;
|
: 1 / 3;
|
||||||
|
|
||||||
// 为每一个饼图数据,生成一个 series-surface 配置
|
// 为每一个饼图数据,生成一个 series-surface 配置
|
||||||
for (let i = 0; i < pieData.length; i++) {
|
for (let i = 0; i < pieData.length; i += 1) {
|
||||||
sumValue += pieData[i].value;
|
sumValue += pieData[i].value;
|
||||||
|
|
||||||
let seriesItem = {
|
const seriesItem = {
|
||||||
name:
|
name:
|
||||||
typeof pieData[i].name === "undefined"
|
typeof pieData[i].name === "undefined"
|
||||||
? `series${i}`
|
? `series${i}`
|
||||||
|
@ -660,17 +697,19 @@ export default {
|
||||||
pieStatus: {
|
pieStatus: {
|
||||||
selected: false,
|
selected: false,
|
||||||
hovered: false,
|
hovered: false,
|
||||||
k: k,
|
k,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (typeof pieData[i].itemStyle != "undefined") {
|
if (typeof pieData[i].itemStyle !== "undefined") {
|
||||||
let itemStyle = {};
|
const { itemStyle } = pieData[i];
|
||||||
|
|
||||||
typeof pieData[i].itemStyle.color != "undefined"
|
// eslint-disable-next-line no-unused-expressions
|
||||||
|
typeof pieData[i].itemStyle.color !== "undefined"
|
||||||
? (itemStyle.color = pieData[i].itemStyle.color)
|
? (itemStyle.color = pieData[i].itemStyle.color)
|
||||||
: null;
|
: null;
|
||||||
typeof pieData[i].itemStyle.opacity != "undefined"
|
// eslint-disable-next-line no-unused-expressions
|
||||||
|
typeof pieData[i].itemStyle.opacity !== "undefined"
|
||||||
? (itemStyle.opacity = pieData[i].itemStyle.opacity)
|
? (itemStyle.opacity = pieData[i].itemStyle.opacity)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
|
@ -678,12 +717,11 @@ export default {
|
||||||
}
|
}
|
||||||
series.push(seriesItem);
|
series.push(seriesItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
|
// 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,
|
||||||
// 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
|
// 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。
|
||||||
for (let i = 0; i < series.length; i++) {
|
for (let i = 0; i < series.length; i += 1) {
|
||||||
endValue = startValue + series[i].pieData.value;
|
endValue = startValue + series[i].pieData.value;
|
||||||
console.log(series[i]);
|
|
||||||
series[i].pieData.startRatio = startValue / sumValue;
|
series[i].pieData.startRatio = startValue / sumValue;
|
||||||
series[i].pieData.endRatio = endValue / sumValue;
|
series[i].pieData.endRatio = endValue / sumValue;
|
||||||
series[i].parametricEquation = getParametricEquation(
|
series[i].parametricEquation = getParametricEquation(
|
||||||
|
@ -692,189 +730,107 @@ export default {
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
k,
|
k,
|
||||||
series[i].pieData.value
|
// 我这里做了一个处理,使除了第一个之外的值都是10
|
||||||
|
series[i].pieData.value === series[0].pieData.value ? 35 : 10
|
||||||
);
|
);
|
||||||
|
|
||||||
startValue = endValue;
|
startValue = endValue;
|
||||||
|
|
||||||
legendData.push(series[i].name);
|
legendData.push(series[i].name);
|
||||||
}
|
}
|
||||||
return series;
|
|
||||||
};
|
|
||||||
// 传入数据生成 option
|
|
||||||
const optionsData = [
|
|
||||||
{
|
|
||||||
name: "楼宇",
|
|
||||||
value: 4256,
|
|
||||||
itemStyle: {
|
|
||||||
// opacity: 0.5,
|
|
||||||
color: "#2A71FF",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
// 准备待返回的配置项,把准备好的 legendData、series 传入。
|
||||||
name: "工业",
|
const option = {
|
||||||
value: 2356,
|
// animation: false,
|
||||||
itemStyle: {
|
legend: {
|
||||||
// opacity: 0.5,
|
left: "80%",
|
||||||
color: "#00EDFE",
|
top: "40%",
|
||||||
|
data: ["楼宇", "工业", "其他"],
|
||||||
|
orient: "vertical",
|
||||||
|
icon: "roundRect",
|
||||||
|
itemWidth: 10, // 图标宽度
|
||||||
|
itemHeight: 10, // 图标高度
|
||||||
|
textStyle: {
|
||||||
|
fontSize: "0.06rem",
|
||||||
|
fontFamily: "AlibabaPuHuiTi",
|
||||||
|
fontWeight: 400,
|
||||||
|
color: "rgba(255,255,255,0.8)",
|
||||||
|
},
|
||||||
|
formatter: (name) => {
|
||||||
|
if (optionData.length) {
|
||||||
|
const item = optionData.filter((item) => item.name === name)[0];
|
||||||
|
return ` ${name} ${item.value}%`;
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "其他",
|
|
||||||
value: 2018,
|
|
||||||
itemStyle: {
|
|
||||||
// opacity: 0.5,
|
|
||||||
color: "#FEDB4B",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
];
|
|
||||||
const series = getPie3D(optionsData, 0.8, 240, 28, 26, 0.5);
|
|
||||||
series.push({
|
|
||||||
name: "pie2d",
|
|
||||||
type: "pie",
|
|
||||||
|
|
||||||
label: {
|
|
||||||
show: false,
|
|
||||||
opacity: 1,
|
|
||||||
fontSize: "0.07rem",
|
|
||||||
lineHeight: 20,
|
|
||||||
textStyle: {
|
|
||||||
fontSize: "0.07rem",
|
|
||||||
color: "#fff",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
labelLine: {
|
|
||||||
length: 30,
|
|
||||||
length2: 30,
|
|
||||||
},
|
|
||||||
startAngle: -30, //起始角度,支持范围[0, 360]。
|
|
||||||
clockwise: false, //饼图的扇区是否是顺时针排布。上述这两项配置主要是为了对齐3d的样式
|
|
||||||
radius: ["40%", "60%"],
|
|
||||||
// center: ["30%", "50%"],
|
|
||||||
center: ["40%", "50%"],
|
|
||||||
data: optionsData,
|
|
||||||
itemStyle: {
|
|
||||||
opacity: 0,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
let data = [
|
|
||||||
{
|
|
||||||
name: "楼宇",
|
|
||||||
value: "30%",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "工业",
|
|
||||||
value: "30%",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "其他",
|
|
||||||
value: "40%",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
// 准备待返回的配置项,把准备好的 legendData、series 传入。
|
|
||||||
let option = {
|
|
||||||
legend: {
|
|
||||||
show: true,
|
|
||||||
tooltip: {
|
tooltip: {
|
||||||
|
formatter: (params) => {
|
||||||
|
if (params.seriesName !== "mouseoutSeries") {
|
||||||
|
return `${
|
||||||
|
params.seriesName
|
||||||
|
}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${
|
||||||
|
params.color
|
||||||
|
};"></span>${option.series[params.seriesIndex].pieData.value}`;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
xAxis3D: {
|
||||||
|
min: -1,
|
||||||
|
max: 1,
|
||||||
|
},
|
||||||
|
yAxis3D: {
|
||||||
|
min: -1,
|
||||||
|
max: 1,
|
||||||
|
},
|
||||||
|
zAxis3D: {
|
||||||
|
min: -1,
|
||||||
|
max: 1,
|
||||||
|
},
|
||||||
|
grid3D: {
|
||||||
show: false,
|
show: false,
|
||||||
|
boxHeight: 10,
|
||||||
|
top: "0%",
|
||||||
|
viewControl: {
|
||||||
|
// 3d效果可以放大、旋转等,请自己去查看官方配置
|
||||||
|
alpha: 20,
|
||||||
|
beta: 30,
|
||||||
|
autoRotate: false, // 禁用自动旋转
|
||||||
|
distance: 200, // 初始视角距离主体的距离
|
||||||
|
panMouseButton: "none", // 设置中键拖拽进行平移
|
||||||
|
rotateMouseButton: "none", // 设置右键拖拽进行旋转
|
||||||
|
zoomMouseButton: "none", // 禁用鼠标缩放
|
||||||
|
},
|
||||||
|
// 后处理特效可以为画面添加高光、景深、环境光遮蔽(SSAO)、调色等效果。可以让整个画面更富有质感。
|
||||||
|
postEffect: {
|
||||||
|
// 配置这项会出现锯齿,请自己去查看官方配置有办法解决
|
||||||
|
enable: false,
|
||||||
|
bloom: {
|
||||||
|
enable: true,
|
||||||
|
bloomIntensity: 0.1,
|
||||||
|
},
|
||||||
|
SSAO: {
|
||||||
|
enable: true,
|
||||||
|
quality: "medium",
|
||||||
|
radius: 2,
|
||||||
|
},
|
||||||
|
// temporalSuperSampling: {
|
||||||
|
// enable: true,
|
||||||
|
// },
|
||||||
|
},
|
||||||
},
|
},
|
||||||
orient: "vertical",
|
series,
|
||||||
data: data,
|
};
|
||||||
top: "center",
|
return option;
|
||||||
itemGap: 14,
|
}
|
||||||
itemHeight: 8,
|
let chartDom = document.getElementById("ynflzb");
|
||||||
itemWidth: 17,
|
var myChart = this.$echarts.init(chartDom, null, {
|
||||||
right: "2%",
|
devicePixelRatio: 10, // 设置为2或更高的值
|
||||||
textStyle: {
|
});
|
||||||
color: "#fff",
|
myChart.setOption(option);
|
||||||
fontSize: "0.06rem",
|
window.addEventListener("resize", function () {
|
||||||
},
|
myChart.resize();
|
||||||
formatter: function (name) {
|
});
|
||||||
let res = data.filter((v) => v.name === name);
|
|
||||||
res = res[0] || {};
|
|
||||||
let unit = res.unit || "";
|
|
||||||
return name + " " + res.value + unit;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
animation: false,
|
|
||||||
tooltip: {
|
|
||||||
show: false,
|
|
||||||
formatter: (params) => {
|
|
||||||
if (
|
|
||||||
params.seriesName !== "mouseoutSeries" &&
|
|
||||||
params.seriesName !== "pie2d"
|
|
||||||
) {
|
|
||||||
return `${
|
|
||||||
params.seriesName
|
|
||||||
}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${
|
|
||||||
params.color
|
|
||||||
};"></span>${
|
|
||||||
option.series[params.seriesIndex].pieData.value + "%"
|
|
||||||
}`;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
textStyle: {
|
|
||||||
fontSize: "0.07rem",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
title: {
|
|
||||||
x: "center",
|
|
||||||
top: "20",
|
|
||||||
textStyle: {
|
|
||||||
color: "#fff",
|
|
||||||
fontSize: "0.11rem",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// backgroundColor: "#0E3567",
|
|
||||||
labelLine: {
|
|
||||||
show: false,
|
|
||||||
lineStyle: {
|
|
||||||
color: "#7BC0CB",
|
|
||||||
},
|
|
||||||
normal: {
|
|
||||||
show: true,
|
|
||||||
length: 10,
|
|
||||||
length2: 10,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
label: {
|
|
||||||
show: false,
|
|
||||||
// position: "outside",
|
|
||||||
// formatter: "{b} \n{d}%",
|
|
||||||
// textStyle: {
|
|
||||||
// color: "#fff",
|
|
||||||
// fontSize: "14px",
|
|
||||||
// },
|
|
||||||
},
|
|
||||||
xAxis3D: {
|
|
||||||
min: -1,
|
|
||||||
max: 1,
|
|
||||||
},
|
|
||||||
yAxis3D: {
|
|
||||||
min: -1,
|
|
||||||
max: 1,
|
|
||||||
},
|
|
||||||
zAxis3D: {
|
|
||||||
min: -1,
|
|
||||||
max: 1,
|
|
||||||
},
|
|
||||||
grid3D: {
|
|
||||||
show: false,
|
|
||||||
boxHeight: 0.01,
|
|
||||||
//top: '30%',
|
|
||||||
bottom: "500%",
|
|
||||||
left: "-7%",
|
|
||||||
// environment: "rgba(255,255,255,0)",
|
|
||||||
viewControl: {
|
|
||||||
distance: 180,
|
|
||||||
alpha: 25,
|
|
||||||
beta: 60,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
series: series,
|
|
||||||
};
|
|
||||||
this.defineEcharts("ynflzb", option);
|
|
||||||
},
|
},
|
||||||
//地图
|
//地图
|
||||||
initMap() {
|
initMap() {
|
||||||
|
@ -1582,14 +1538,16 @@ export default {
|
||||||
#ynflzb {
|
#ynflzb {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
padding-right: 40px;
|
||||||
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pic {
|
.pic {
|
||||||
width: 300px;
|
width: 250px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
height: 150px;
|
height: 120px;
|
||||||
top: 100px;
|
top: 120px;
|
||||||
left: 40px;
|
left: 70px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue