(echarts)vue中使用echarts实现中国地图多线路多配色

(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]
    }
}    

解决参考:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值