| | |
| | | <script> |
| | | import echarts from "echarts"; |
| | | import BaseChart from "./BaseChart"; |
| | | import common from '@/components/diagram/js/common'; |
| | | import {getAllMapOutlineAction} from "@/views/home/js/api"; |
| | | import common from "@/components/diagram/js/common"; |
| | | import { getAllMapOutlineAction } from "@/views/home/js/api"; |
| | | const { throttle } = common; |
| | | import HomeNormal from "@/assets/images/home.png"; |
| | | // let mapHomeImage = new Image(); |
| | | // mapHomeImage.src = HomeNormal; |
| | | // 正常的图标 |
| | | import HomeNormalImage from "@/assets/images/home-normal.png"; |
| | | // let homeNormalImage = new Image(); |
| | | // homeNormalImage.src = HomeNormalImage; |
| | | // 充电的图标 |
| | | import HomeChargeImage from "@/assets/images/home-charge.png"; |
| | | // let homeChargeImage = new Image(); |
| | | // homeChargeImage.src = HomeChargeImage; |
| | | // 告警图标 |
| | | import HomeWarnImage from "@/assets/images/home-warn.png"; |
| | | // let homeWarnImage = new Image(); |
| | | // homeWarnImage.src = HomeWarnImage; |
| | | // 放电图标 |
| | | import HomeDischargeImage from "@/assets/images/home-discharge.png"; |
| | | // let homeDischargeImage = new Image(); |
| | | // homeDischargeImage.src = HomeDischargeImage; |
| | | // 停电放电图标 |
| | | import HomeTingDianImage from "@/assets/images/home-tingdian.png"; |
| | | // let homeTingDianImage = new Image(); |
| | | // homeTingDianImage.src = HomeTingDianImage; |
| | | |
| | | // 透明背景图标 |
| | | import HomeTransImage from "@/assets/images/home-trans.png"; |
| | | // let homeTransImage = new Image(); |
| | | // homeTransImage.src = HomeTransImage; |
| | | |
| | | const subwayLines = [ |
| | | { |
| | | name: '地铁 1 号线', |
| | | coords: [ |
| | | [114.287177, 30.598208], |
| | | [114.293133, 30.594368], |
| | | // 更多站点经纬度... |
| | | ] |
| | | }, |
| | | ]; |
| | | |
| | | const colorList = ['#f00', '#00ff6c', '#ff00f0', '#f5f500', '#f1bb4c', '#ff5a06', '#9b00ff', '#00faaf', '#e5741c']; |
| | | |
| | | // 生成随机颜色的函数 |
| | | function getRandomColor() { |
| | | const letters = '0123456789ABCDEF'; |
| | | let color = '#'; |
| | | for (let i = 0; i < 6; i++) { |
| | | color += letters[Math.floor(Math.random() * 16)]; |
| | | } |
| | | return color; |
| | | } |
| | | |
| | | // [1,2,3,4] => [1,2] [2,3], [3,4] |
| | | function transformArray(arr, label) { |
| | | const result = []; |
| | | for (let i = 0, j = arr.length -1; i < j; i++) { |
| | | result.push({coords: [arr[i], arr[i + 1]], label}); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | export default { |
| | | name: "MapChart", |
| | | extends: BaseChart, |
| | | props: {}, |
| | | data() { |
| | | return { |
| | | name: "zhongguo" |
| | | props: { |
| | | roam: { |
| | | type: [String, Boolean], |
| | | validator: (v) => [true, false, "scale", "move"].includes(v), |
| | | default: true, |
| | | }, |
| | | subway: { |
| | | type: String, |
| | | default: '' |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | name: "zhongguo", |
| | | subWaySeries: [], |
| | | }; |
| | | }, |
| | | methods: { |
| | | async getSubWayData() { |
| | | let subwayData = await require(`../../../public/mapJson/subway/${this.subway}.json`); |
| | | // console.log('sub', subwayData, '============='); |
| | | // format 数据 |
| | | try { |
| | | this.subWaySeries = subwayData.l.map((item, index) => { |
| | | let points = item.st.map(v => v.sl.split(',').map(vv => vv*1)); |
| | | return { |
| | | type: 'lines', |
| | | coordinateSystem: 'geo', |
| | | name: item.ln, |
| | | data: transformArray(points, item.ln), |
| | | lineStyle: { |
| | | color: colorList[index % colorList.length], |
| | | width: 2 |
| | | }, |
| | | z: 3 |
| | | } |
| | | }) |
| | | } catch (error) { |
| | | this.subWaySeries = []; |
| | | console.log('error', error, '============='); |
| | | } |
| | | // console.log('subwayseries', JSON.stringify(this.subWaySeries), '============='); |
| | | |
| | | }, |
| | | setMapName() { |
| | | //查询激活轮廓图 |
| | | getAllMapOutlineAction() |
| | | .then(res => { |
| | | .then((res) => { |
| | | let rs = res.data; |
| | | if (rs.code == 1) { |
| | | let data = rs.data; |
| | |
| | | } |
| | | this.setData([]); |
| | | }) |
| | | .catch(err => { |
| | | .catch((err) => { |
| | | this.setData([]); |
| | | console.log(err); |
| | | }); |
| | |
| | | label: "测试机房1", |
| | | value: 8, |
| | | color: "#7668F9", |
| | | points: [118.8062, 31.9208] |
| | | points: [120.548762, 31.293819], |
| | | }, |
| | | { |
| | | name: "", |
| | | label: "测试机房2", |
| | | value: 100, |
| | | color: "#0081FF", |
| | | points: [127.9688, 45.368], |
| | | points: [120.614052, 31.30514], |
| | | }, |
| | | { |
| | | name: "", |
| | | label: "测试机房3", |
| | | value: 100, |
| | | color: "#0081FF", |
| | | points: [110.3467, 41.4899], |
| | | }, |
| | | { |
| | | name: "节", |
| | | label: "测试机房4", |
| | | value: 50, |
| | | color: "#FF6B6C", |
| | | points: [125.8154, 44.2584] |
| | | }, |
| | | { |
| | | name: "", |
| | | value: 8, |
| | | label: "测试机房6", |
| | | color: "#7668F9", |
| | | points: [116.4551, 40.2539] |
| | | }, |
| | | { |
| | | name: "节", |
| | | label: "测试机房7", |
| | | value: 8, |
| | | color: "#66F842", |
| | | points: [123.1238, 42.1216] |
| | | }, |
| | | { |
| | | name: "节", |
| | | label: "测试机房8", |
| | | value: 100, |
| | | color: "#0081FF", |
| | | points: [114.4995, 38.1006], |
| | | }, |
| | | // { |
| | | // name: "", |
| | | // label: "测试机房3", |
| | | // value: 100, |
| | | // color: "#0081FF", |
| | | // points: [110.3467, 41.4899], |
| | | // }, |
| | | // { |
| | | // name: "节", |
| | | // label: "测试机房4", |
| | | // value: 50, |
| | | // color: "#FF6B6C", |
| | | // points: [125.8154, 44.2584], |
| | | // }, |
| | | // { |
| | | // name: "", |
| | | // value: 8, |
| | | // label: "测试机房6", |
| | | // color: "#7668F9", |
| | | // points: [116.4551, 40.2539], |
| | | // }, |
| | | // { |
| | | // name: "节", |
| | | // label: "测试机房7", |
| | | // value: 8, |
| | | // color: "#66F842", |
| | | // points: [123.1238, 42.1216], |
| | | // }, |
| | | // { |
| | | // name: "节", |
| | | // label: "测试机房8", |
| | | // value: 100, |
| | | // color: "#0081FF", |
| | | // points: [114.4995, 38.1006], |
| | | // }, |
| | | ]; |
| | | data = list; |
| | | let geoJson = require(`../../../public/mapJson/${mapName}.json`); |
| | |
| | | areaList.forEach((v) => { |
| | | data0.push({ |
| | | name: v.properties.name, |
| | | value: Math.floor(Math.random() * 2) * 100 |
| | | value: Math.floor(Math.random() * 2) * 100, |
| | | }); |
| | | }); |
| | | |
| | |
| | | fontColor: item.fontColor, |
| | | value: item.points.concat(data[i].value), |
| | | label: item.label ? item.label : "", |
| | | data: item |
| | | data: item, |
| | | }); |
| | | } |
| | | return res; |
| | |
| | | formatter(params) { |
| | | // console.log(params); |
| | | return params.data.label; |
| | | } |
| | | }, |
| | | }, |
| | | visualMap: { |
| | | visualMap: |
| | | { |
| | | show: false, |
| | | type: "continuous", |
| | | text: ["", ""], |
| | |
| | | min: 0, |
| | | max: 100, |
| | | inRange: { |
| | | color: ['#025483', '#116493'] |
| | | color: ["#025483", "#116493"], |
| | | }, |
| | | seriesIndex: [1] |
| | | // seriesIndex: [1], |
| | | seriesIndex: 1, |
| | | }, |
| | | geo: { |
| | | show: true, |
| | | map: mapName, |
| | | label: { |
| | | normal: { |
| | | show: false |
| | | show: false, |
| | | }, |
| | | emphasis: { |
| | | show: false, |
| | | } |
| | | }, |
| | | }, |
| | | roam: true, |
| | | roam: this.roam, |
| | | itemStyle: { |
| | | normal: { |
| | | borderColor: "rgba(147, 235, 248, 1)", |
| | |
| | | show: false, |
| | | }, |
| | | }, |
| | | } |
| | | }, |
| | | }, |
| | | series: [ |
| | | // 图片底色 |
| | | // { |
| | | // name: "", |
| | | // type: "scatter", |
| | | // coordinateSystem: "geo", |
| | | // symbol: "circle", |
| | | // symbolSize: [24, 24], |
| | | // label: { |
| | | // formatter: "{b}", |
| | | // position: "inside", |
| | | // show: true, |
| | | // color: "#FFFFFF", |
| | | // fontWeight: "bold", |
| | | // }, |
| | | // itemStyle: { |
| | | // color(params) { |
| | | // return params.data.color; |
| | | // }, |
| | | // }, |
| | | // data: convertData(data), |
| | | // z: 3, |
| | | // }, |
| | | // { |
| | | // //图片 |
| | | // name: "图片", |
| | | // type: "scatter", |
| | | // coordinateSystem: "geo", |
| | | // symbol: function (value, params) { |
| | | // let img; |
| | | // let color = params.data.color; |
| | | // // let color = "#ff6b6c"; |
| | | // switch (color) { |
| | | // case "#0081ff": // 浮充 |
| | | // img = HomeChargeImage; |
| | | // break; |
| | | // case "#ff6b6c": // 放电 |
| | | // img = HomeDischargeImage; |
| | | // break; |
| | | // case "#66f842": // 充电 |
| | | // img = HomeNormalImage; |
| | | // break; |
| | | // case "#7668f9": // 停电 |
| | | // img = HomeTingDianImage; |
| | | // break; |
| | | // default: |
| | | // // img = HomeChargeImage; |
| | | // img = HomeTransImage; |
| | | // break; |
| | | // } |
| | | // return params.data.name ? "circle" : "image://" + img; |
| | | // }, |
| | | // symbolSize: [24, 24], |
| | | // label: { |
| | | // formatter: "{b}", |
| | | // position: "inside", |
| | | // show: true, |
| | | // color: "#FFFFFF", |
| | | // fontWeight: "bold", |
| | | // }, |
| | | // itemStyle: { |
| | | // color(params) { |
| | | // return params.data.color; |
| | | // }, |
| | | // }, |
| | | // data: convertData(data), |
| | | // showEffectOn: "render", |
| | | // rippleEffect: { |
| | | // brushType: "stroke", |
| | | // }, |
| | | // hoverAnimation: true, |
| | | // // zlevel: 3 |
| | | // z: 4, |
| | | // }, |
| | | // { |
| | | // name: "波纹", |
| | | // type: "effectScatter", |
| | | // coordinateSystem: "geo", |
| | | // rippleEffect: { |
| | | // scale: 3, |
| | | // }, |
| | | // symbolSize: [18, 18], |
| | | // data: convertData(data), |
| | | // itemStyle: { |
| | | // color(params) { |
| | | // return params.data.color; |
| | | // }, |
| | | // }, |
| | | // tooltip: { |
| | | // show: true, |
| | | // }, |
| | | // // zlevel: 2 |
| | | // z: 2, |
| | | // }, |
| | | { |
| | | name: '散点', |
| | | type: 'effectScatter', |
| | | coordinateSystem: 'geo', |
| | | rippleEffect: { |
| | | scale: 3, |
| | | }, |
| | | symbolSize: 20, |
| | | data: convertData(data), |
| | | label: { |
| | | formatter: '{b}', |
| | | position: 'inside', |
| | | show: true, |
| | | color: "#FFFFFF", |
| | | fontWeight: "bold" |
| | | }, |
| | | itemStyle: { |
| | | color(params) { |
| | | return params.data.color; |
| | | } |
| | | }, |
| | | tooltip: { |
| | | show: true, |
| | | }, |
| | | zlevel: 7 |
| | | }, |
| | | { |
| | | name: '散点', |
| | | type: 'effectScatter', |
| | | coordinateSystem: 'geo', |
| | | rippleEffect: { |
| | | scale: 3, |
| | | }, |
| | | symbolSize: 20, |
| | | data: convertData(data), |
| | | label: { |
| | | formatter(params) { |
| | | return params.data.label; |
| | | }, |
| | | position: 'right', |
| | | show: true, |
| | | color: "#FFFFFF", |
| | | fontWeight: "bold", |
| | | padding: [0, 0, 0, 8] |
| | | }, |
| | | itemStyle: { |
| | | show: false, |
| | | }, |
| | | tooltip: { |
| | | show: true, |
| | | }, |
| | | zlevel: 6 |
| | | }, |
| | | { |
| | | type: 'map', |
| | | type: "map", |
| | | map: mapName, |
| | | show: false, |
| | | geoIndex: 0, |
| | | aspectScale: 0.75, //长宽比 |
| | | showLegendSymbol: false, // 存在legend时显示 |
| | |
| | | emphasis: { |
| | | show: false, |
| | | textStyle: { |
| | | color: '#FF0000' |
| | | } |
| | | } |
| | | color: "#FF0000", |
| | | }, |
| | | }, |
| | | }, |
| | | itemStyle: { |
| | | areaColor: "#FF0000" |
| | | areaColor: "#FF0000", |
| | | }, |
| | | roam: true, |
| | | animation: false, |
| | | data: data0, |
| | | tooltip: { |
| | | show: false |
| | | } |
| | | show: false, |
| | | }, |
| | | }, |
| | | ] |
| | | ...this.subWaySeries |
| | | ], |
| | | }; |
| | | }, |
| | | handleClick(params) { |
| | | if (params.seriesIndex == 0) { |
| | | let data = params.data; |
| | | this.$emit('handleClick', data.data); |
| | | this.$emit("handleClick", data.data); |
| | | } |
| | | |
| | | } |
| | | }, |
| | | }, |
| | | mounted() { |
| | | async mounted() { |
| | | let chart = this.$options.chart; |
| | | if (this.subway) { |
| | | // 如果需要显示地铁 则先加载地铁数据 |
| | | await this.getSubWayData(); |
| | | } |
| | | this.setMapName(); |
| | | chart.off("click"); //防止chart点击触发多次 |
| | | chart.on('click', params => { |
| | | chart.on("click", (params) => { |
| | | this.handleClick(params); |
| | | }); |
| | | chart.off('georoam'); |
| | | chart.on('georoam', throttle(() => { |
| | | let option = chart.getOption(); |
| | | chart.setOption(option); |
| | | }, 100)); |
| | | } |
| | | } |
| | | chart.off("georoam"); |
| | | chart.on( |
| | | "georoam", |
| | | throttle(() => { |
| | | let option = chart.getOption(); |
| | | chart.setOption(option); |
| | | }, 100) |
| | | ); |
| | | }, |
| | | }; |
| | | </script> |