(echarts)vue中使用echarts实现中国地图多线路多配色
需求:
1.可展示省内所有市对应的利润及亏损
2.可展示某省下单个市的利润及亏损
难点:可能会有多个起始点对应一个抵达点,导致数值重合区分不清,
解决:在每条线上显示数值即可避免,需调整数据格式
效果:
升级版(连线中部显示对应数据)
代码:
html:
<template>
<div class="all">
<!-- 地图 -->
<div class="mapDiv">
<div id="mapEcharts"></div>
<!-- 图例 -->
<div class="mapTip">
<div class="mapTipOne">
<div class="mapTip-cir"></div>
<div>利润</div>
</div>
<div class="mapTipOne">
<div class="mapTip-cir2"></div>
<div>亏损</div>
</div>
</div>
</div>
</div>
</template>
js
<script>
import Vue from 'vue'
import * as echarts from 'echarts'
import chinaChangeMap from '@/assets/json/chinaChange.json' //绘制中国地图数据
import geoCoordMap from '@/assets/json/geoCoordMap.json' //地区经纬度
import {
GetgetDropDownListLngTradeArbitrage, //省份
GetgetLngTradeArbitrage //查询
} from '@/services/handler'
export default {
components: {},
data() {
return {
//查询
maxTagCount: 2,
headers: {},
relTenantIds: null,
qssfList: [],
qscsList: [],
ddsfList: [],
ddcsList: [],
increaseList: [],
form: {},
//地图数据
mapDataAll: []
}
},
created() {
this.relTenantIds = JSON.parse(localStorage.getItem('pro__Login_Userinfo')).value.relTenantIds
this.getProvincesList()
this.$nextTick(() => {
this.initCharts()
})
},
mounted() {},
watch: {
mapDataAll: {
deep: true,
immediate: true,
handler(newVal, oldVal) {
this.mapDataAll = newVal
this.$nextTick(() => {
this.initCharts()
})
}
}
},
methods: {
//起始/运抵省份
getProvincesList() {
GetgetDropDownListLngTradeArbitrage().then(res => {
if (res.code == 0) {
this.qssfList = res.page.qssf //起始省份
this.qscsList = res.page.qscs //起始城市
this.ddsfList = res.page.ddsf //运抵省份
this.ddcsList = res.page.ddcs //运抵省份
this.increaseList = res.page.increase //涨跌幅
} else {
this.$message.error('系统错误,稍后查询')
}
})
},
//查询时间
onChangeTime(date, dateString) {
this.form.tradeDateList = dateString
},
//查询
onSubmit() {
GetgetLngTradeArbitrage({
...this.form,
relTenantIds: this.relTenantIds
}).then(res => {
if (res.code == 0) {
this.mapDataAll = []
this.mapDataAll = res.page //接受的后端数据
} else {
this.$message.error('系统错误,稍后查询')
}
})
},
//地图
initCharts() {
//1.注册一个地图
echarts.registerMap('china', { geoJSON: chinaChangeMap })
//2.初始化echarts
var myChart = echarts.init(document.getElementById('mapEcharts'))
//3.准备数据
var SHData = [
[{ name: '成都' }, { name: '银川', value: 95 }],
...
]
var GZData = [
[{ name: '成都' }, { name: '福州', value: 90 }],
...
]
var LSData1 = [
[{ name: '拉萨' }, { name: '拉萨', value: '' }],
...
]
var LSData2 = [
[{name: '拉萨'},{name: '福州', value: 95}],
[{name: '拉萨'},{name: '太原',value: 90}],
...
]
// 4.处理线路所需要的数据格式data
var convertData = function(data) {
var res = []
for (var i = 0; i < data.length; i++) {
var dataItem = data[i]
var fromCoord = geoCoordMap.geoCoordMap[dataItem[0].name]
var toCoord = geoCoordMap.geoCoordMap[dataItem[1].name]
if (fromCoord && toCoord) {
// 方法1
// res.push([
// {
// coord: fromCoord
// },
// {
// coord: toCoord
// }
// ])
// 方法2(升级版写法 因为需在连线上显示数值)
res.push({
value: dataItem[1].value,
coords: [fromCoord, toCoord]
})
}
}
return res
}
//5.地图展示数据series
var color = ['#FF0001', '#98FA1C'] //红 绿
var series = [];
//测试数据
[
['成都', SHData],
['成都', GZData],
['拉萨', LSData1],
['拉萨', LSData2]
].forEach(function(item, i) {
// this.mapDataAll.forEach(function(item, i) { //正式数据
let iColor = i % 2 == 0 ? '#FF0001' : '#98FA1C' //配色(偶数下标为利润数据红色,奇数下标为亏损数据绿色)
series.push(
{
// 亮光发射效果
name: ' ',
type: 'lines',
zlevel: 1,
effect: {},
lineStyle: {
normal: {
// color: color[i],
color: iColor,
width: 0,
curveness: 0.2
}
},
data: convertData(item[1])
},
{
// 线路效果
name: ' ',
type: 'lines',
zlevel: 2,
effect: {
show: true,
period: 6,
trailLength: 0,
symbol: 'arrow', //标记动画图形
symbolSize: 8
},
lineStyle: {
normal: {
color: iColor,
width: 1.5,
opacity: 0.6, //透明度
curveness: 0.2 //弯曲度
}
},
label: {
normal: {
show: true,
position: 'middle',
formatter: '{@value}', //显示格式
color: iColor
}
},
data: convertData(item[1])
},
{
// 文字和地点涟漪效果
name: ' ',
type: 'effectScatter',
coordinateSystem: 'geo',
zlevel: 2,
rippleEffect: {
brushType: 'stroke'
},
label: {
//省会名称
normal: {
show: true,
position: 'inside',
formatter: '{b}' //显示格式name
// formatter: '{b}\n{@[2]}' //显示格式
}
},
symbolSize: function(val) {
return val[2] / 2 //根据数值大小计算劝大小
},
itemStyle: {
normal: {
color: iColor
}
},
data: item[1].map(function(dataItem) {
return {
name: dataItem[1].name,
value: geoCoordMap.geoCoordMap[dataItem[1].name].concat([dataItem[1].value])
}
})
}
)
})
//6.echarts配置
let option = {
backgroundColor: '#0c1c30',
title: {
text: '',
subtext: '',
left: 'center',
textStyle: {
size: '20px',
color: '#fff'
}
},
geo: {
map: 'china',
zoom: 1.3,
label: {
show: true, //省份
color: '#f2f2f2' // 文字颜色
},
roam: true,
itemStyle: {
// 地图区域的多边形 图形样式。
areaColor: '#0c1c30', // 地区默认颜色
borderWidth: 1, // 边框描绘
borderColor: '#90c5ed', //片区边框颜色
emphasis: {
// 高亮状态下的多边形和标签样式
areaColor: '#24cbff', // 高亮区域背景颜色
shadowBlur: 20,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
},
series: series //地图显示的数据
}
myChart.setOption(option)
window.addEventListener('resize', () => {
myChart.resize()
})
}
}
}
</script>
css
<style lang="less" scoped>
.all {
background: #fff;
padding-bottom: 2px;
.formMod {
padding: 20px 10px;
}
.mapDiv {
position: relative;
#mapEcharts {
width: 100%;
height: 1000px;
background-color: antiquewhite;
}
.mapTip {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 80px;
color: #fff;
background-color: rgba(37, 64, 99, 0.6);
padding: 14px 20px;
.mapTipOne {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
}
.mapTip-cir {
width: 14px;
height: 14px;
border-radius: 50%;
background: #ff0001;
}
.mapTip-cir2 {
width: 14px;
height: 14px;
border-radius: 50%;
background: #98fa1c;
}
}
}
}
</style>
经纬度:geoCoordMap.json
{
"geoCoordMap": {
"上海": [121.4648, 31.2891],
"东莞": [113.8953, 22.901],
"东营": [118.7073, 37.5513],
"中山": [113.4229, 22.478],
"临汾": [111.4783, 36.1615],
"临沂": [118.3118, 35.2936],
"丹东": [124.541, 40.4242],
"丽水": [119.5642, 28.1854],
"乌鲁木齐": [87.9236, 43.5883],
"佛山": [112.8955, 23.1097],
"保定": [115.0488, 39.0948],
"兰州": [103.5901, 36.3043],
"包头": [110.3467, 41.4899],
"北京": [116.4551, 40.2539],
"北海": [109.314, 21.6211],
"南京": [118.8062, 31.9208],
"南宁": [108.479, 23.1152],
"南昌": [116.0046, 28.6633],
"南通": [121.1023, 32.1625],
"厦门": [118.1689, 24.6478],
"台州": [121.1353, 28.6688],
"合肥": [117.29, 32.0581],
"呼和浩特": [111.4124, 40.4901],
"咸阳": [108.4131, 34.8706],
"哈尔滨": [127.9688, 45.368],
"唐山": [118.4766, 39.6826],
"嘉兴": [120.9155, 30.6354],
"大同": [113.7854, 39.8035],
"大连": [122.2229, 39.4409],
"天津": [117.4219, 39.4189],
"太原": [112.3352, 37.9413],
"威海": [121.9482, 37.1393],
"宁波": [121.5967, 29.6466],
"宝鸡": [107.1826, 34.3433],
"宿迁": [118.5535, 33.7775],
"常州": [119.4543, 31.5582],
"广州": [113.5107, 23.2196],
"廊坊": [116.521, 39.0509],
"延安": [109.1052, 36.4252],
"张家口": [115.1477, 40.8527],
"徐州": [117.5208, 34.3268],
"德州": [116.6858, 37.2107],
"惠州": [114.6204, 23.1647],
"成都": [103.9526, 30.7617],
"扬州": [119.4653, 32.8162],
"承德": [117.5757, 41.4075],
"拉萨": [91.1865, 30.1465],
"无锡": [120.3442, 31.5527],
"日照": [119.2786, 35.5023],
"昆明": [102.9199, 25.4663],
"杭州": [119.5313, 29.8773],
"枣庄": [117.323, 34.8926],
"柳州": [109.3799, 24.9774],
"株洲": [113.5327, 27.0319],
"武汉": [114.3896, 30.6628],
"汕头": [117.1692, 23.3405],
"江门": [112.6318, 22.1484],
"沈阳": [123.1238, 42.1216],
"沧州": [116.8286, 38.2104],
"河源": [114.917, 23.9722],
"泉州": [118.3228, 25.1147],
"泰安": [117.0264, 36.0516],
"泰州": [120.0586, 32.5525],
"济南": [117.1582, 36.8701],
"济宁": [116.8286, 35.3375],
"海口": [110.3893, 19.8516],
"淄博": [118.0371, 36.6064],
"淮安": [118.927, 33.4039],
"深圳": [114.5435, 22.5439],
"清远": [112.9175, 24.3292],
"温州": [120.498, 27.8119],
"渭南": [109.7864, 35.0299],
"湖州": [119.8608, 30.7782],
"湘潭": [112.5439, 27.7075],
"滨州": [117.8174, 37.4963],
"潍坊": [119.0918, 36.524],
"烟台": [120.7397, 37.5128],
"玉溪": [101.9312, 23.8898],
"珠海": [113.7305, 22.1155],
"盐城": [120.2234, 33.5577],
"盘锦": [121.9482, 41.0449],
"石家庄": [114.4995, 38.1006],
"福州": [119.4543, 25.9222],
"秦皇岛": [119.2126, 40.0232],
"绍兴": [120.564, 29.7565],
"聊城": [115.9167, 36.4032],
"肇庆": [112.1265, 23.5822],
"舟山": [122.2559, 30.2234],
"苏州": [120.6519, 31.3989],
"莱芜": [117.6526, 36.2714],
"菏泽": [115.6201, 35.2057],
"营口": [122.4316, 40.4297],
"葫芦岛": [120.1575, 40.578],
"衡水": [115.8838, 37.7161],
"衢州": [118.6853, 28.8666],
"西宁": [101.4038, 36.8207],
"西安": [109.1162, 34.2004],
"贵阳": [106.6992, 26.7682],
"连云港": [119.1248, 34.552],
"邢台": [114.8071, 37.2821],
"邯郸": [114.4775, 36.535],
"郑州": [113.4668, 34.6234],
"鄂尔多斯": [108.9734, 39.2487],
"重庆": [107.7539, 30.1904],
"金华": [120.0037, 29.1028],
"铜川": [109.0393, 35.1947],
"银川": [106.3586, 38.1775],
"镇江": [119.4763, 31.9702],
"长春": [125.8154, 44.2584],
"长沙": [113.0823, 28.2568],
"长治": [112.8625, 36.4746],
"阳泉": [113.4778, 38.0951],
"青岛": [120.4651, 36.3373],
"韶关": [113.7964, 24.7028],
"吐鲁番": [89.18596, 42.94244],
"那曲": [92.05136, 31.47614],
"吕梁": [111.15081, 37.51761],
"伊春": [128.669, 47.72582],
"呼伦贝尔": [119.73572, 49.21336],
"嘉峪关": [98.33435281250001, 39.668377553435185],
"汉中": [107.03194, 33.06784],
"晋城": [112.83, 35.52],
"荆州": [110.1511405, 29.263137]
}
}
解决参考: