vue+vuex+axios+echarts画一个动态更新的中国地图的方法


Posted in Javascript onDecember 19, 2017

本文介绍了vue+vuex+axios+echarts画一个动态更新的中国地图的方法,分享给大家,具体如下:

一. 生成项目及安装插件

# 安装vue-cli
npm install vue-cli -g
# 初始化项目
vue init webpack china-map
# 切到目录下
cd china-map
# 安装项目依赖
npm install
# 安装 vuex
npm install vuex --save
# 安装 axios
npm install axios --save
# 安装 ECharts
npm install echarts --save

二. 项目结构

├── index.html
├── main.js
├── components
│  └── index.vue
└── store
  ├── index.js     # 组装模块及导出store的文件
  └── modules
    └── ChinaMap.js  # 中国地图Vuex模块

三. 引入中国地图并绘制基本的图表

1.按需求引入与中国地图相关的Echarts图表和组件。

// 主模块
let echarts = require('echarts/lib/echarts')
// 散点图
require('echarts/lib/chart/scatter')
// 散点图放大
require('echarts/lib/chart/effectScatter')
// 地图
require('echarts/lib/chart/map')
// 图例
require('echarts/lib/component/legend')
// 提示框
require('echarts/lib/component/tooltip')
// 地图geo
require('echarts/lib/component/geo')

2.引入中国地图JS文件,会自动注册地图;也可以通过axios方式引入json文件,需要手动注册echarts.registerMap('china', chinaJson.data)。

// 中国地图JS文件
require('echarts/map/js/china')

3.准备一个有固定宽高的DOM容器并在mounted里面初始化一个echarts实例。

DOM容器

<template>
 <div id="china-map"></div>
</template>

初始化echarts实例

let chinaMap = echarts.init(document.getElementById('china-map'))

4.设置初始化的空白地图,这里需要设置很多echarts参数,参考ECharts配置项手册。

chinaMap.setOption({
  backgroundColor: '#272D3A',
  // 标题
  title: {
   text: '中国地图闪闪发光',
   left: 'center',
   textStyle: {
    color: '#fff'
   }
  },
  // 地图上圆点的提示
  tooltip: {
   trigger: 'item',
   formatter: function (params) {
    return params.name + ' : ' + params.value[2]
   }
  },
  // 图例按钮 点击可选择哪些不显示
  legend: {
   orient: 'vertical',
   left: 'left',
   top: 'bottom',
   data: ['地区热度', 'top5'],
   textStyle: {
    color: '#fff'
   }
  },
  // 地理坐标系组件
  geo: {
   map: 'china',
   label: {
    // true会显示城市名
    emphasis: {
     show: false
    }
   },
   itemStyle: {
    // 地图背景色
    normal: {
     areaColor: '#465471',
     borderColor: '#282F3C'
    },
    // 悬浮时
    emphasis: {
     areaColor: '#8796B4'
    }
   }
  },
  // 系列列表
  series: [
   {
    name: '地区热度',
    // 表的类型 这里是散点
    type: 'scatter',
    // 使用地理坐标系,通过 geoIndex 指定相应的地理坐标系组件
    coordinateSystem: 'geo',
    data: [],
    // 标记的大小
    symbolSize: 12,
    // 鼠标悬浮的时候在圆点上显示数值
    label: {
     normal: {
      show: false
     },
     emphasis: {
      show: false
     }
    },
    itemStyle: {
     normal: {
      color: '#ddb926'
     },
     // 鼠标悬浮的时候圆点样式变化
     emphasis: {
      borderColor: '#fff',
      borderWidth: 1
     }
    }
   },
   {
    name: 'top5',
    // 表的类型 这里是散点
    type: 'effectScatter',
    // 使用地理坐标系,通过 geoIndex 指定相应的地理坐标系组件
    coordinateSystem: 'geo',
    data: [],
    // 标记的大小
    symbolSize: 12,
    showEffectOn: 'render',
    rippleEffect: {
     brushType: 'stroke'
    },
    hoverAnimation: true,
    label: {
     normal: {
      show: false
     }
    },
    itemStyle: {
     normal: {
      color: '#f4e925',
      shadowBlur: 10,
      shadowColor: '#333'
     }
    },
    zlevel: 1
   }
  ]
 })

四. 配置Vuex管理和分发数据

1.在ChinaMap.js中引入vuex和axios。

import axios from 'axios'

2.设置必要的变量。

const state = {
 geoCoordMap: {'香港特别行政区': [114.08, 22.2], '澳门特别行政区': [113.33, 22.13], '台北': [121.5, 25.03]/*等等*/},
 // 发光的城市
 showCityNumber: 5,
 showCount: 0,
 // 是否需要loading
 isLoading: true
}

3.在actions中抓取后台数据并更新地图。

const actions = {
 fetchHeatChinaRealData ({state, commit}, chartsObj) {
  axios.get('static/data/heatChinaRealData.json')
   .then(
    (res) => {
     let data = res.data
     let paleData = ((state, data) => {
      let arr = []
      let len = data.length
      while (len--) {
       let geoCoord = state.geoCoordMap[data[len].name]
       if (geoCoord) {
        arr.push({
         name: data[len].name,
         value: geoCoord.concat(data[len].value)
        })
       }
      }
      return arr
     })(state, data)
     let lightData = paleData.sort((a, b) => {
      return b.value - a.value
     }).slice(0, state.showCityNumber)
     chartsObj.setOption({
      series: [
       {
        name: '地区热度',
        data: paleData
       },
       {
        name: 'top5',
        data: lightData
       }
      ]
     })
    }
   )
 }
}

此时npm run dev已经可以看到中国地图上闪闪的黄色小点点。

若想改变她使动态展示,可以在index.vue中mounted下面加上:

chinaMap.showLoading(showLoadingDefault)
this.$store.commit('openLoading')
this.$store.dispatch('fetchHeatChinaRealData', chinaMap)
setInterval(() => {
  this.$store.dispatch('fetchHeatChinaRealData', chinaMap)
}, 1000)

在ChinaMap.js中actions的mutations中fetchHeatChinaRealData修改:

let lightData = paleData.sort((a, b) => {
  return b.value - a.value
}).slice(0 + state.showCount, state.showCityNumber + state.showCount)
if (state.isLoading) {
  chartsObj.hideLoading()
  commit('closeLoading')
}

五. 其它

1.别忘了在main.js里面引入Vuex。

import Vue from 'vue'
import Index from './components/index.vue'
import store from './store/index'

let ChinaMap = new Vue({
 el: '#app',
 store,
 template: '<Index/>',
 components: {Index}
})

Vue.use(ChinaMap)

2.案例代码

GitHub

3.效果图

vue+vuex+axios+echarts画一个动态更新的中国地图的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的合并表格中相同文本的相邻单元格的代码
Apr 06 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
Sep 08 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
Sep 18 Javascript
Node解决简单重复问题系列之Excel内容的获取
Jan 02 Javascript
a标签调用js的方法总结
Sep 05 Javascript
TypeScript中使用getElementXXX()的示例代码
Sep 12 Javascript
VuePress 中如何增加用户登录功能
Nov 29 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 Javascript
vue3自定义dialog、modal组件的方法
Jan 04 Vue.js
常用的9个JavaScript图表库详解
Dec 19 #Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 #Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 #Javascript
Angular2实现组件交互的方法分析
Dec 19 #Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 #Javascript
jquery自定义显示消息数量
Dec 19 #jQuery
基于Vue开发数字输入框组件
Dec 19 #Javascript
You might like
php采集时被封ip的解决方法
2010/08/29 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
JavaScript 中的replace方法说明
2007/04/13 Javascript
javascript Array.sort() 跨浏览器下需要考虑的问题
2009/12/07 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
softmax及python实现过程解析
2019/09/30 Python
Series和DataFrame使用简单入门
2019/11/13 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
自我鉴定200字
2013/10/28 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
群众路线教育实践活动对照检查材料思想汇报(副处级领导)
2014/10/04 职场文书
继续教育个人总结
2015/03/03 职场文书
Python实现简繁体转换
2021/06/07 Python
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android