bonus-ui/src/views/screen/components/countryMap.vue

535 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="centerTopPage">
<div class="top-btns">
<div class="btn" :class="{ active: btnIndex == 1 }" @click="">装备总数</div>
</div>
<div class="store-equip">仓库装备<span class="cont">{{ warehouseEquipmentNum }}</span> </div>
<div class="out-city-equip">{{ outCityEquipmentNum }}</div>
<div class="mapBox">
<div id="mapEcharts"></div>
</div>
</div>
</template>
<script>
import * as echarts from 'echarts'
import { mapDataApi } from "@/api/screen/cityScreen";
import anhui from '@/utils/mapJson/anhui.json'
import hefeiJson from '@/utils/mapJson/hefei.json'
import wuhuJson from '@/utils/mapJson/wuhu.json'
import bengbuJson from '@/utils/mapJson/bengbu.json'
import maanshanJson from '@/utils/mapJson/maanshan.json'
import huaibeiJson from '@/utils/mapJson/huaibei.json'
import huainanJson from '@/utils/mapJson/huainan.json'
import tonglingJson from '@/utils/mapJson/tongling.json'
import anqingJson from '@/utils/mapJson/anqing.json'
import huangshanJson from '@/utils/mapJson/huangshan.json'
import chuzhouJson from '@/utils/mapJson/chuzhou.json'
import fuyangJson from '@/utils/mapJson/fuyang.json'
import suzhouJson from '@/utils/mapJson/suzhou.json'
import liuanJson from '@/utils/mapJson/liuan.json'
import bozhouJson from '@/utils/mapJson/bozhou.json'
import chizhouJson from '@/utils/mapJson/chizhou.json'
import xuanchenJson from '@/utils/mapJson/xuanchen.json'
export default {
name: 'centerTopPage',
props: {
sendHeight: {
type: String,
default: '100%',
},
sendMapColor: {
type: String,
default: '#17A1F1',
},
sendGeo: {
type: Array,
default: null,
},
sendNumber: {
type: Number,
},
showLine: {
type: Boolean,
default: false,
},
sendProjSpin: {
type: Array | Object,
},
},
data() {
return {
type: 1,
zoom: 1,
zoom2: 1,
mapEcharts: null,
mapEcharts2: null,
mapJson: null,
pointArea: this.sendProjSpin,
pointAll: [],
companyList: [],
companyAreaList: [],
isCity: 0,
cityCount: [],
gozoom: 1,
geoVal: [],
cityName:'合肥',
btnIndex: 1,
warehouseEquipmentNum: null, // 仓库装备数
outCityEquipmentNum: null, // 市外装备数
}
},
created() {
},
mounted() {
console.log('🚀 ~ mounted ~ .cityName:', this.$router.currentRoute.query.cityName)
this.cityName = this.$router.currentRoute.query.cityName || "合肥"
this.getCityJson()
},
methods: {
getCityJson(){
if(this.cityName.indexOf("合肥")>-1){
this.mapJson = hefeiJson;
}else if(this.cityName.indexOf("芜湖")>-1){
this.mapJson = wuhuJson
}else if(this.cityName.indexOf("蚌埠")>-1){
this.mapJson = bengbuJson
}else if(this.cityName.indexOf("淮南")>-1){
this.mapJson = huainanJson
}else if(this.cityName.indexOf("马鞍山")>-1){
this.mapJson = maanshanJson
}else if(this.cityName.indexOf("淮北")>-1){
this.mapJson = huaibeiJson
}else if(this.cityName.indexOf("铜陵")>-1){
this.mapJson = tonglingJson
}else if(this.cityName.indexOf("安庆")>-1){
this.mapJson = anqingJson
}else if(this.cityName.indexOf("黄山")>-1){
this.mapJson = huangshanJson
}else if(this.cityName.indexOf("滁州")>-1){
this.mapJson = chuzhouJson
}else if(this.cityName.indexOf("阜阳")>-1){
this.mapJson = fuyangJson
}else if(this.cityName.indexOf("宿州")>-1){
this.mapJson = suzhouJson
}else if(this.cityName.indexOf("六安")>-1){
this.mapJson = liuanJson
}else if(this.cityName.indexOf("亳州")>-1){
this.mapJson = bozhouJson
}else if(this.cityName.indexOf("池州")>-1){
this.mapJson = chizhouJson
}else if(this.cityName.indexOf("宣城")>-1){
this.mapJson = xuanchenJson
} else if (this.cityName.indexOf("安徽送变电") > -1) {
this.mapJson = anhui
}
console.log(this.mapJson)
this.getMapData()
},
getMapData(){
// 获取地区中心坐标
var mapFeatures = this.mapJson.features.map(item=>{
let obj = {
name:item.properties.name,
value:item.properties.center
}
return obj
})
console.log(mapFeatures)
let param = {companyId:sessionStorage.getItem('companyId'),city:this.cityName}
mapDataApi(param).then(response => {
console.log(response,'mapDataApi--> 大屏地图数据')
// response.data.proList.forEach(item=>{
// let obj = Object.assign({},item)
// obj.name = item.county;
// let index = mapFeatures.findIndex(v=>v.name==item.county)
// if(index>-1){
// obj.value = mapFeatures[index].value
// }
// this.geoVal.push(obj)
// })
this.warehouseEquipmentNum = response.data.warehouseEquipmentNum
this.outCityEquipmentNum = response.data.outCityEquipmentNum
if (response.data.proList.length > 0) {
this.geoVal = response.data.proList.map(item=>{
return {
...item,
value: [item.lon, item.lat]
}
})
}
this.getInitData()
});
},
getInitData() {
this.mapEcharts = echarts.init(document.getElementById('mapEcharts'),)
echarts.registerMap('dishi', this.mapJson)
this.setMapOption()
},
setMapOption() {
this.mapEcharts.clear()
console.log(this.geoVal)
let that = this
let imgUrl = require('../../../assets/cityScreen/mapBg2.png')
let echartOption = {
geo: [
{
show: true,
map: 'dishi',
type: 'map',
aspectScale: 1,
zoom: this.zoom,
roam: false, // 是否允许缩放
animationDurationUpdate: 0,
layoutSize: '80%',
layoutCenter: ['50%', '56%'],
itemStyle: {
normal: {
label: {
show: false,
},
areaColor: this.sendMapColor, //地图颜色
opacity: 0.7,
borderColor: '#38EAF6', //地图边框颜色
borderWidth: 1, //地图边框宽度
shadowColor: 'none',
shadowBlur: 10,
color: '#fff',
// 设置扇形的阴影
},
emphasis: {
//选中省份的颜色
areaColor: '#061E3D',
label: {
show: true,
},
},
},
label: {
normal: {
show: false,
fontSize: 12,
fontWeight: 500,
color: 'rgba(255,255,255,0.5)',
},
emphasis: {
show: true,
areaColor: '#061E3D',
color: '#fff',
},
},
zlevel: 1,
regions: null,
tooltip: {
show:false,
},
},
{
map: 'dishi',
aspectScale: 1,
roam: false, // 是否允许缩放
animationDurationUpdate: 0,
zoom: this.zoom,
layoutSize: '80%',
layoutCenter: ['50%', '58%'],
itemStyle: {
areaColor: '#5785AE',
borderColor: '#5785AE',
borderWidth: 1,
opacity: 0.3,
color: '#fff',
},
zlevel: -1,
silent: true,
tooltip: {
show: false,
},
},
],
visualMap: {
show: false,
top: 'top',
min: 0,
max: 2,
seriesIndex: 0,
calculable: true,
inRange: {
color: [
'#998f74',
'#04a4f6',
'#00943e',
'#dae07b',
'#b62022',
],
},
},
tooltip: {
},
series: [
{
type: 'scatter',
coordinateSystem: 'geo',
zlevel: 10,
symbol: 'circle',
symbolSize: 15,
colorBy: null,
itemStyle: {
color: '#409EFF',
},
label: {
show: true,
position: 'top',
formatter: function (params) {
// 第一行装备数量,第二行工程名称
return `{equip|${params.data.useNum}}\n{proj|${params.data.projectName}}`
},
rich: {
equip: {
color: '#fff',
fontSize: 14,
fontWeight: 'bold',
align: 'center',
verticalAlign: 'middle',
backgroundColor: '#409EFF', // 蓝色背景
borderRadius: 10, // 圆角(如果宽高相等就是圆形)
padding: [2, 6], // 内边距控制大小
lineHeight: 20, // 高度
},
proj: {
color: '#fff',
fontSize: 12,
lineHeight: 16
}
}
},
data: this.geoVal
}
],
}
this.mapEcharts.setOption(echartOption)
this.mapEcharts.on('click', function (params) {
if (params.componentSubType === 'scatter') {
// console.log(params)
let option = that.mapEcharts.getOption() //获得option对象
// 点击变黄
option.series[0].data.forEach((item) => {
if (params.data.name !== item.name) {
if (item.isActive) {
item.isActive = false
}
} else {
item.isActive = true
}
})
that.mapEcharts.setOption(option)
that.$emit('closeMap', { value: params.data })
}
})
},
},
}
</script>
<style lang="scss" scoped>
.centerTopPage {
width: 100%;
//height: var(--send-height);
height: 100%;
// background:palegoldenrod;
margin-bottom: 2%;
padding: 0 10px;
position: relative;
box-sizing: border-box;
.iconMap {
display: block !important;
visibility: visible !important;
opacity: 1;
}
.buttonTop {
width: 100%;
display: flex;
justify-content: flex-start;
}
.buttom1 {
width: 110px;
height: 32px;
text-align: center;
line-height: 32px;
border-radius: 4px;
color: #55f3fb;
// background: url(../../assets/img/checked.png) no-repeat center;
background-size: 110px 32px;
margin-right: 12px;
cursor: pointer;
}
.buttom1.on {
color: #0095ff;
// background: url(../../assets/img/checked_on.png) no-repeat center;
background-size: 110px 32px;
}
.mapBox {
margin-top: -70px;
width: 100%;
height: 97%;
display: flex;
position: relative;
#mapEcharts {
width: 100%;
height: 100%;
}
#mapEcharts2 {
width: 100%;
height: 100%;
}
z-index: 1000;
}
.label-box {
position: absolute;
bottom: 0px;
left: 40px;
// background: url('../../assets/img/home/labelBg.png') no-repeat;
background-size: 100% 100%;
padding: 10px 15px;
.item {
font-size: 14px;
line-height: 22px;
color: #fff;
position: relative;
padding-left: 15px;
font-size: 16px;
}
.item:before {
content: '';
width: 10px;
height: 10px;
background: #06bbf2;
position: absolute;
top: 6px;
left: 0px;
}
.itemColor1:before {
background: #06bbf2;
}
.itemColor2:before {
background: #2df0fe;
}
.itemColor3:before {
background: #10e0a5;
}
.itemColor4:before {
background: #dcef4e;
}
.itemColor5:before {
background: #f48413;
}
.itemColor6:before {
background: #fc5403;
}
}
}
</style>
<style lang="scss" scoped>
.top-btns {
margin-top: 60px;
display: flex;
justify-content: center;
/* position: absolute;
top: 10px; */
.btn:not(:last-child) {
margin-right: 80px;
}
.btn {
font-size: 15px;
text-align: center;
padding: 6px 15px;
font-family: DS-TITLE;
color: #ccc;
background-image: url('../../screen/wsScreen/img/btn.png');
background-size: 100% 100%;
cursor: pointer;
}
.active {
background-image: url('../../screen/wsScreen/img/btn-active.png');
background-size: 100% 100%;
}
}
.store-equip {
position: absolute;
top: 30px;
left: 50px;
width: 116px;
height: 75px;
color: #ccc;
font-size: 11px;
padding-top: 4px;
background: url('../../../assets/cityScreen/mapBg1.png');
background-size: 100% 100%;
text-align: center;
.cont {
color: #fff;
font-size: 16px;
}
}
.out-city-equip {
position: absolute;
top: 366px;
right: 95px;
width: 40px;
height: 52px;
color: #fff;
font-size: 16px;
background: url('../../../assets/cityScreen/position.png');
background-size: 100% 100%;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
}
.scrollTooltip::-webkit-scrollbar {
width: 10px;
height: 10px;
}
.scrollTooltip::-webkit-scrollbar-thumb {
background-color: #1653a6;
border-radius: 10px;
-webkit-box-shadow: inset 1px 1px 0 #1653a6;
}
.itemColor {
position: relative;
padding-left: 15px;
line-height: 22px;
}
.itemColor:before {
content: '';
width: 10px;
height: 10px;
background: #06bbf2;
position: absolute;
top: 6px;
left: 0px;
}
.itemColor1:before {
background: #06bbf2;
}
.itemColor2:before {
background: #2df0fe;
}
.itemColor3:before {
background: #10e0a5;
}
.itemColor4:before {
background: #dcef4e;
}
.itemColor5:before {
background: #f48413;
}
.itemColor6:before {
background: #fc5403;
}
</style>