Vue+Vuex+Axios+ECharts 畫一個動態(tài)更新的中國地圖

一揖膜、生成項目及安裝插件

# 安裝 Vue Cli
npm install vue-cli -g

# 初始化項目
vue init webpack vue-china-map

# 切到目錄下
cd vue-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 模塊

三砾脑、引入中國地圖并繪制基本的圖表

3.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')

3.2 引入中國地圖 JavaScript 文件瓣俯,會自動注冊地圖;也可以通過 Axios 方式引入 JSON 文件莫秆,需要手動注冊 echarts.registerMap('china', chinaJson.data)崔拥。

// 中國地圖 JavaScript 文件
require('echarts/map/js/china')

3.3 準備一個有固定寬高的 DOM 容器并在 mounted 里面初始化一個 ECharts 實例。

DOM 容器:

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

初始化 ECharts 實例:

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

3.4 設置初始化的空白地圖群发,這里需要設置很多 ECharts 參數(shù)晰韵,參考 ECharts 配置項手冊


chinaMap.setOption({
  backgroundColor: '#272D3A',
  // 標題
  title: {
    text: '中國地圖閃閃發(fā)光',
    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: ['地區(qū)熱度', 'top5'],
    textStyle: {
      color: '#fff'
    }
  },
  // 地理坐標系組件
  geo: {
    map: 'china',
    label: {
      // `true` 會顯示城市名
      emphasis: {
        show: false
      }
    },
    itemStyle: {
      // 地圖背景色
      normal: {
        areaColor: '#465471',
        borderColor: '#282F3C'
      },
      // 懸浮時
      emphasis: {
        areaColor: '#8796B4'
      }
    }
  },
  // 系列列表
  series: [
    {
      name: '地區(qū)熱度',
      // 表的類型雪猪,這里是散點
      type: 'scatter',
      // 使用地理坐標系,通過 `geoIndex` 指定相應的地理坐標系組件
      coordinateSystem: 'geo',
      data: [],
      // 標記的大小
      symbolSize: 12,
      // 鼠標懸浮的時候在圓點上顯示數(shù)值
      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 管理和分發(fā)數(shù)據(jù)

4.1 在 ChinaMap.js 中引入 Vuex 和 Axios抬虽。

import axios from 'axios'

4.2 設置必要的變量官觅。

const state = {
  geoCoordMap: {'香港特別行政區(qū)': [114.08, 22.2], '澳門特別行政區(qū)': [113.33, 22.13], '臺北': [121.5, 25.03]/*等等*/},
  // 發(fā)光的城市
  showCityNumber: 5,
  showCount: 0,
  // 是否需要 Loading
  isLoading: true
}

4.3 在 actions 中抓取后臺數(shù)據(jù)并更新地圖。

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: '地區(qū)熱度',
                data: paleData
              },
              {
                name: 'top5',
                data: lightData
              }
            ]
          })
        }
      )
  }
}

此時 npm run dev 已經可以看到中國地圖上閃閃的黃色小點點斥赋。

若想改變她使動態(tài)展示缰猴,可以在 index.vuemounted 下面加上:

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

ChinaMap.jsactionsmutationsfetchHeatChinaRealData 修改:

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')
}

五、其它

5.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)

5.2 案例代碼

GitHub:https://github.com/mazeyqian/vue-china-map

版權聲明

本博客所有的原創(chuàng)文章滑绒,作者皆保留版權。轉載必須包含本聲明隘膘,保持本文完整疑故,并以超鏈接形式注明作者后除和本文原始地址:https://blog.mazey.net/794.html

(完)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弯菊,隨后出現(xiàn)的幾起案子纵势,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钦铁,死亡現(xiàn)場離奇詭異软舌,居然都是意外死亡,警方通過查閱死者的電腦和手機牛曹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門佛点,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黎比,你說我怎么就攤上這事超营。” “怎么了阅虫?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵演闭,是天一觀的道長。 經常有香客問我颓帝,道長米碰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任购城,我火速辦了婚禮见间,結果婚禮上,老公的妹妹穿的比我還像新娘工猜。我一直安慰自己,他們只是感情好菱蔬,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布篷帅。 她就那樣靜靜地躺著,像睡著了一般拴泌。 火紅的嫁衣襯著肌膚如雪魏身。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天蚪腐,我揣著相機與錄音箭昵,去河邊找鬼。 笑死回季,一個胖子當著我的面吹牛家制,可吹牛的內容都是我干的。 我是一名探鬼主播泡一,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼颤殴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鼻忠?” 一聲冷哼從身側響起涵但,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后矮瘟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞳脓,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年澈侠,在試婚紗的時候發(fā)現(xiàn)自己被綠了劫侧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡埋涧,死狀恐怖板辽,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情棘催,我是刑警寧澤劲弦,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站醇坝,受9級特大地震影響邑跪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜呼猪,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一画畅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宋距,春花似錦轴踱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壶唤,卻和暖如春雳灵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闸盔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工悯辙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迎吵。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓躲撰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親击费。 傳聞我的和親對象是個殘疾皇子茴肥,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 前言 公司的項目中需要對數(shù)據(jù)做可視化處理,高級點的D3.js目前還沒接觸到荡灾,因此選用了大眾化的Echarts, 在...
    Mr_Treasure閱讀 165,383評論 8 44
  • 鼓山瓤狐,生活在這個城市的每個人再熟悉不過了瞬铸,鼓山上所能看到的風景大家也一定都看到過〈∪瘢可是那是登山的路嗓节,坐纜車上去卻又...
    余麗輝閱讀 283評論 0 0
  • 清晨,如往常一樣騎車上班. 騎至一個十字路口的時候.看到一個女士,在路當中彎腰忙碌,身邊是兩個箱子和一地的蔬菜. ...
    橋上的Jeff閱讀 250評論 0 1
  • 常用的導出方式有四種module.exports,exports,export,export default和兩種...
    rangel閱讀 2,364評論 0 2