Vue+ECharts实现中国地图的绘制及各省份自动轮播高亮显示

作者:前端小马 时间:2024-04-27 16:12:40 

实现效果

Vue+ECharts实现中国地图的绘制及各省份自动轮播高亮显示

完整代码+详细注释


<template>
 <div class="echart">
   <div class="content">
     <div id="map_cn"></div>
   </div>
 </div>
</template>

<script>
 import echarts from "echarts";
 import 'echarts/map/js/china.js' //这一步必须引入

export default {
   data() {
     return {
       //地图中的数据
       dataList: [
         {
           name: "南海诸岛",
           value: 25,
         },
         {
           name: "北京",
           value: 71,
         },
         {
           name: "天津",
           value: 52,
         },
         {
           name: "上海",
           value: 14,
         },
         {
           name: "重庆",
           value: 50,
         },
         {
           name: "河北",
           value: 20,
         },
         {
           name: "河南",
           value: 30,
         },
         {
           name: "云南",
           value: 55,
         },
         {
           name: "辽宁",
           value: 50,
         },
         {
           name: "黑龙江",
           value: 40,
         },
         {
           name: "湖南",
           value: 6,
         },
         {
           name: "安徽",
           value: 96,
         },
         {
           name: "山东",
           value: 75,
         },
         {
           name: "新疆",
           value: 45,
         },
         {
           name: "江苏",
           value: 15,
         },
         {
           name: "浙江",
           value: 8,
         },
         {
           name: "江西",
           value: 78,
         },
         {
           name: "湖北",
           value: 78,
         },
         {
           name: "广西",
           value: 36,
         },
         {
           name: "甘肃",
           value: 25,
         },
         {
           name: "山西",
           value: 140,
         },
         {
           name: "内蒙古",
           value: 85,
         },
         {
           name: "陕西",
           value: 85,
         },
         {
           name: "吉林",
           value: 74,
         },
         {
           name: "福建",
           value: 20,
         },
         {
           name: "贵州",
           value: 74,
         },
         {
           name: "广东",
           value: 47,
         },
         {
           name: "青海",
           value: 45,
         },
         {
           name: "西藏",
           value: 41,
         },
         {
           name: "四川",
           value: 3,
         },
         {
           name: "宁夏",
           value: 7,
         },
         {
           name: "海南",
           value: 7,
         },
         {
           name: "台湾",
           value: 200,
         },
         {
           name: "香港",
           value: 2,
         },
         {
           name: "澳门",
           value: 5,
         }
       ],
       //指定图表的配置项和数据
       option: {
         //标题组件
         title: {
           show: true,
           text: '全国各省份旅游景点(已评级)数量',
           subtext: '截至到2021年12月',
           left: "center",
           top: 16,
         },
         //提示框组件
         tooltip: {
           show: true,
           //触发类型:数据项图形触发
           trigger: 'item',
           padding: 10,
           borderWidth: 1,
           borderColor: '#409eff',
           backgroundColor: 'rgba(255,255,255,0.4)',
           textStyle: {
             color: '#000000',
             fontSize: 12
           },
           //提示框内容格式器
           formatter: (e) => {
             let data = e.data;
             //此处将各等级景点数量表示为0-10内的随机整数
             data.five = Math.random() * 10 | 0;
             data.four = Math.random() * 10 | 0;
             data.three = Math.random() * 10 | 0;
             data.two = Math.random() * 10 | 0;
             data.one = Math.random() * 10 | 0;
             //景点数量 - 五个等级之和
             data.number = data.five + data.four + data.three + data.two + data.one;
             //字符串模板
             let context = `
              <div>
                  <p style="line-height: 30px; font-weight: 600">${data.name}</p>
                  <p><span>景点数量 : </span><span>${data.number}处</span></p>
                  <p><span>5A级 : </span><span>${data.five}处</span></p>
                  <p><span>4A级 : </span><span>${data.four}处</span></p>
                  <p><span>3A级 : </span><span>${data.three}处</span></p>
                  <p><span>2A级 : </span><span>${data.two}处</span></p>
                  <p><span>1A级 : </span><span>${data.one}处</span></p>
              </div>
           `;
             return context;
           }
         },
         //视觉映射组件(左下角)
         visualMap: {
           show: true,
           left: 26,
           bottom: 40,
           showLabel: true,
           // 是否显示拖拽用的手柄(手柄能拖拽调整选中范围)
           calculable: false,
           // 拖拽时,是否实时更新
           realtime: true,
           align: 'left',
           //各颜色代表的区域
           pieces: [
             {
               gte: 100,
               label: "> 100",
               color: "#FDB669"
             },
             {
               gte: 50,
               lt: 99,
               label: "50 - 99",
               color: "#FECA7B"
             },
             {
               gte: 30,
               lt: 49,
               label: "30 - 49",
               color: "#FEE191"
             },
             {
               gte: 10,
               lt: 29,
               label: "10 - 29",
               color: "#FFF0A8"
             },
             {
               lt: 9,
               label: '< 10',
               color: "#FFFFBF"
             }
           ]
         },
         //地理坐标系组件
         geo: {
           //使用 registerMap 注册的地图名称
           map: "china",
           //是否开启鼠标缩放和平移漫游
           roam: true,
           //当前视角缩放比例
           zoom: 1,
           //滚轮缩放的极限控制
           scaleLimit: {
             min: 1, //最小1倍
             max: 3 //最大3倍
           },
           //地图组件离容器的距离
           top: 90,
           left: 'center',
           //图形上的文本标签
           label: {
             show: true,
             fontSize: "11"
           },
           //地图区域的多边形 图形样式
           itemStyle: {
             borderColor: "rgba(0, 0, 0, 0.2)",
             shadowColor: 'rgba(0, 0, 0, 0.2)',
             shadowBlur: 10,
             // 高亮状态(鼠标移入后)的多边形和标签样式
             emphasis: {
               areaColor: "#f98333",
               shadowOffsetX: 2,
               shadowOffsetY: 2,
             },
           }
         },
         series: [
           {
             type: "map",
             roam: true,
             geoIndex: 0,
             data: '',
             label: {
               show: true,
             }
           }
         ]
       },
     };
   },

methods: {
     //定义方法 draw_map 绘制中国地图
     draw_map() {
       let myChart = this.$echarts.init(document.getElementById('map_cn'));
       //高亮轮播展示
       var hourIndex = 0;
       var carouselTime = null;
       //setInterval() 可在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除

//使用setInterval方法后,必须使用箭头函数而不能写function,否则后续在该方法中无法调用data中的数据
       //carouselTime =setInterval(function(){ //错误写法

carouselTime = setInterval(() => {
         //dispatchAction echarts的API:触发图表行为
         myChart.dispatchAction({
           type: "downplay", //downplay 取消高亮指定的数据图形
           seriesIndex: 0
         });
         myChart.dispatchAction({
           type: "highlight", //highLight 高亮指定的数据图形
           seriesIndex: 0, //系列index
           dataIndex: hourIndex //数据index
         });
         myChart.dispatchAction({
           type: "showTip", //showTip 显示提示框
           seriesIndex: 0,
           dataIndex: hourIndex
         });
         hourIndex++;
         //当循环到数组当中的最后一条数据后,重新进行循环
         if (hourIndex > this.dataList.length) {
           hourIndex = 0;
         }
       }, 3000);
       //鼠标移入组件时停止轮播
       myChart.on("mousemove", (e) => {
         clearInterval(carouselTime); //清除循环
         myChart.dispatchAction({
           type: "downplay",
           seriesIndex: 0,
         });
         myChart.dispatchAction({
           type: "highlight",
           seriesIndex: 0,
           dataIndex: e.dataIndex
         });
         myChart.dispatchAction({
           type: "showTip",
           seriesIndex: 0,
           dataIndex: e.dataIndex
         });
       });
       //鼠标移出组件时恢复轮播
       myChart.on("mouseout", () => {
         carouselTime = setInterval(() => {
           myChart.dispatchAction({
             type: "downplay",
             seriesIndex: 0,

});
           myChart.dispatchAction({
             type: "highlight",
             seriesIndex: 0,
             dataIndex: hourIndex
           });
           myChart.dispatchAction({
             type: "showTip",
             seriesIndex: 0,
             dataIndex: hourIndex
           });
           hourIndex++;
           if (hourIndex > this.dataList.length) {
             hourIndex = 0;
           }
         }, 3000);
       });

//显示地图
       myChart.setOption(this.option);
     },

//修改echart配制
     setEchartOption() {
       this.option.series[0].data = this.dataList;
     },
   },
   created() {
     this.setEchartOption();
   },
   mounted() {
     this.$nextTick(() => {
       this.draw_map();
     });
   }
 };
</script>

<style scoped lang="less">
 .echart {
   width: 100%;

.content {
     width: 95.8%;
     height: 100px;
     margin: auto;

#map_cn {
       width: 65%;
       height: 7rem;
       background-color: #eaeaea;
       margin: auto;
     }
   }
 }
</style>

要点小结

1.setTimeout() 与 setInterval() 的区别

setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,只执行一次;

setInterval() 可在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除,多次调用。

2.使用 setInterval() 方法后,必须使用箭头函数形式而不能用 function

如果使用 function,后续在该方法中调用 data 中的数据如 console.log(this.dataList.length);会报如下错误(其实就是找不到该数据);

Vue+ECharts实现中国地图的绘制及各省份自动轮播高亮显示

这是因为 fun()、(function(){ ... })() 或回调函数中的 this 默认都指向 window,而 window 中是找不到你所要用的 data 中的数据的,我们应该改为箭头函数形式。

Vue+ECharts实现中国地图的绘制及各省份自动轮播高亮显示

来源:https://blog.csdn.net/weixin_53072519/article/details/121823421

标签:Vue,ECharts,中国地图
0
投稿

猜你喜欢

  • pandas-resample按时间聚合实例

    2023-05-26 19:07:50
  • Python求矩阵的范数和行列式

    2023-05-01 19:54:49
  • 详解selenium + chromedriver 被反爬的解决方法

    2022-03-20 18:40:46
  • 微信小程序利用Canvas绘制图片和竖排文字详解

    2023-08-20 02:35:43
  • 搭建 Selenium+Python开发环境详细步骤

    2022-10-12 17:34:02
  • 详解golang 模板(template)的常用基本语法

    2024-04-23 09:45:48
  • Python原始字符串(raw strings)用法实例

    2021-05-04 18:29:27
  • 20分钟成功编写bootstrap响应式页面 就这么简单

    2023-08-12 06:12:13
  • 详解Python Selenium如何获取鼠标指向的元素

    2021-12-03 10:45:39
  • MySQL 选择合适的存储引擎

    2024-01-21 08:55:24
  • 如何检测Oracle的ODBC是否连接成功?

    2009-11-24 20:31:00
  • 获取SqlServer存储过程定义的三种方法

    2024-01-24 06:03:38
  • 比较详细的完美解决安装sql2000时出现以前的某个程序安装已在安装计算机上创建挂起的文件操作。 <font color=red>原创</font>

    2024-01-27 03:48:54
  • golang获取网卡信息操作

    2024-02-22 01:57:17
  • PyTorch实现多维度特征输入逻辑回归

    2022-08-08 02:56:41
  • Python连接数据库使用matplotlib画柱形图

    2024-01-21 19:02:49
  • 在python3.64中安装pyinstaller库的方法步骤

    2022-08-12 10:27:05
  • MySQL中UNION与UNION ALL的基本使用方法

    2024-01-25 21:34:03
  • python 实现判断ip连通性的方法总结

    2023-06-24 22:36:53
  • Maui Blazor 使用摄像头实现代码

    2023-12-06 11:44:37
  • asp之家 网络编程 m.aspxhome.com