VueJs - 世界地圖(根據返回國家value值的大小來展示顏色的深淺分布)


一、實現功能

1、畫出世界各國的世界地圖

2、根據返回name->國家全稱、value->數量,渲染對比世界各國成功的國家,予以值域范圍的高亮

3、滑入國家地圖,出現tooltip框,提示當前國家和訪問量

 

二、demo展示

       根據value的number大小,各國家顏色深淺不一                滑入某國,會提示當前國家和訪問量

   

三、實現思路

1、下載echarts

2、全局引入echarts(如果項目中還需要繪制其他圖表,建議引用在全局。或者分別在各個vue文件中引入echarts小模塊)

3、繪制地圖

  a、在沒有任何視覺交互的情況下,也沒有任何返回的國家和value的情況下,我們需要默認畫出所有國家。顏色統一,這就需要我們本地有一個 world.js 存放或引入世界各國的json數據,寶包括國家名稱、經緯度等信息

  b、准備一個dom,設置好寬高。

  c、初始化echarts對象並且和dom進行綁定

  d、編寫最后需注入echarts的set方法的options對象

  e、xxxxx.setOption(options) 注入完成,地圖顯示出來

三、實現方法

1、安裝echarts

npm install echarts --save

2、在main.js中引入

import Vue from 'vue'
import App from './App'
import router from './router'

// 引入echarts
import echarts from 'echarts'

//將echarts對象掛在vue實例的原型對象上
//在全局可通過this.$echarts調用echarts對象
Vue.prototype.$echarts = echarts

Vue.config.productionTip = false

/* 實例化vue對象 */
let gvm = new Vue({
    el: '#app',
    router,
    components: {
        App
    },
    template: '<App/>'
})

3、map.vue 初始化,繪制世界地圖

<template>
    <div>
        <el-container>
                        <!-- 為echarts准備的dom -->
            <div id="map"></div>
        </el-container>
    </div>
</template>
模板
 1 drawLine(data) {
 2     // 基於准備好的dom,初始化echarts實例
 3     let myChart = this.$echarts.init(document.getElementById('map'))
 4     //因后台返回的格式value是string類型,前端需要number類型的value,再此處理數據。
 5     var map1 = []
 6     for(var i = 0; i < data.data.map.length; i++) {
 7         var obj = {}
 8         obj.name = data.data.map[i].name;
 9         obj.value = [parseInt(data.data.map[i].value[0]), data.data.map[i].name]
10         map1.push(obj)
11     }
12 
13     myChart.setOption({
14         baseOption: {
15             visualMap: [{
16                 dimension: 0,
17                 left: 10,
18                 bottom: 35,
19                 orient: 'horizontal',
20                 itemWidth: 12,
21                 min: map1[0].value[0],
22                 max: map1[max1].value[0],
23                 text: ['High', 'Low'],
24                 textStyle: {
25                     color: '#4a4a4a'
26                 },
27                 inRange: {
28                     color: ['#d9e4fb', '#d8e3fa', '#88bbee', '#6ca5dc', '#6199d0', '#5d96cd', '#5890c7']
29                 }
30             }],
31             animationDurationUpdate: 1000,
32             animationEasingUpdate: 'quinticInOut',
33             timeline: {
34                 show: false
35             },
36             backgroundColor: '#ffffff',
37             title: [{
38                 text: 'Total Visits Count',
39                 left: 45,
40                 bottom: 65,
41                 textStyle: {
42                     fontSize: 12,
43                     color: 'rgba(255,255,255, 0.9)'
44                 }
45             }],
46             tooltip: {},
47             grid: {
48                 left: '10%',
49                 right: '45%',
50                 top: '70%',
51                 bottom: 20
52             },
53             xAxis: {
54                 show: false
55             },
56             yAxis: {
57                 show: false
58             },
59             series: [{
60                 id: 'map',
61                 type: 'map',
62                 mapType: 'world',
63                 right: "1%",
64                 top: "7%",
65                 bottom: "1%",
66                 left: 10,
67                 itemStyle: {
68                     normal: {
69                         areaColor: "#ecedfe", //地圖模塊未選中顏色
70                         borderColor: "#d8d8de" //地圖模塊邊框
71                     },
72                     emphasis: {
73                         label: {
74                             show: true
75                         },
76                         areaColor: "#90ed7d" //選中模塊顏色
77                     }
78                 },
79                 data: data.data.map
80             }]
81         },
82     });
83     window.onresize = () => {
84         myChart.resize();
85         myChart1.resize();
86     };
87 }
script
//貼出json格式,
"map":[
        {
            "name": "United States",
            "value": [345,"United States"]
        },{
            "name": "China",
            "value": [200,"China"]
        }
]

 

四、遇到的問題

在此特別強調一下。因為這部分在做項目的時候報錯,找不到原因,也沒有想到是這部分原因,廢了好大的功夫才找到。貼出錯誤:

原因:

1、返回數據的name的值和value數組的第二項一定要對應並且這里name的要求是國家全稱,要和本地渲染地圖的world.js對應上,否則會報錯。

2、value的第一項一定是number類型,否則也會報錯。

  a、在此聲明一下,echarts map在series里的data的要求返回格式沒有那么嚴格。只有值域縮放控件(baseOption)的value第一項必須是number類型。

 

解決方案:

1、請把node_modules/echarts/map/js/ 下面找找world.json給他,讓他按照這個name返回。否則v8 console會報錯。

2、value的第一項的類型挺簡單,后台如果不返回number類型的話自己使用如下代碼處理一下。以下是處理方法:

var map1 = []
for(var i = 0; i < data.data.map.length; i++) {
  var obj = {}
  obj.name
= data.data.map[i].name;   obj.value = [parseInt(data.data.map[i].value[0]), data.data.map[i].name]   map1.push(obj) }

data.data.map是上面json對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM