主要是對配置的一些說明,項目githup地址
https://github.com/shengbid/echarts-series
這個地圖做了3個層級,第一層: 中國地圖; 第二層: 省級地圖,點擊第一層進入; 第三層: 市級地圖, 點擊第二層進入
點擊空白處可以回到上一層
效果圖:
第一層
第二層


第三層

實現步驟,文末會有完整代碼,可以根據步驟來實現,會更清晰
1.下載所需要的地圖文件,需要符合echarts的數據規則.我是到這個網址下載的地圖文件:
http://datav.aliyun.com/tools/atlas/#&lat=30.316551722910077&lng=106.68898666525287&zoom=3.5
下載下來的json文件改一下文件名,默認是中文的
2.在項目中引入
import chinaJson from '@/utils/map/china.json' // json數據引入
import qinghai from '@/utils/map/qinghai.json'
import neimenggu from '@/utils/map/neimenggu.json'
import xilinguole from '@/utils/map/xilinguole.json'
3.在項目中提供一個展示DOM元素, 配置好echarts的基礎option,注冊地圖
<template> <div class="line-container"> <div> <div id="mapChart"></div> </div> </div> </template> <script> export default { name: 'mapChart', data() { return { option: { title: { text: '中國地圖', subtext: '鼠標縮放比例大於2.5展示名稱' }, tooltip: { trigger: 'item' }, }, mapChart: '', // 地圖實例 level: 1 // 當前層級 } }, created() {}, mounted() { this.getMapChart() }, methods: { // 初始化圖表 getMapChart() { this.mapChart = this.$echart.init(document.getElementById('mapChart')) this.$echart.registerMap('china', chinaJson) this.option.series = [{ type: 'map', map: 'china', zoom: 1.2, roam: true }] this.mapChart.setOption(this.option) } } } </script>
4.上一步做完就能在頁面上看到一個中國地圖了,echarts默認如果你注冊的地圖名稱是china,會展示右下角南海諸島,如果不想展示,可以換一個名稱
5.現在加入點擊事件,直接加在第三步的getMapChart方法里
getMapChart() { . . . this.mapChart.setOption(this.option) // 省級地圖 const provinceName = { '青海省': qinghai, // 自己建立的地圖數據映射 '內蒙古自治區': neimenggu } // 市級地圖 const cityName = { '錫林郭勒盟': xilinguole } // 地圖數據 const map = { 2: [{ type: 'map', map: 'province', // 省級 label: { show: true }, itemStyle: { areaColor: '#f1b290', }, zoom: 1, roam: true }], 3: [{ type: 'map', map: 'city', // 市級 label: { show: true }, zoom: 1, roam: true, } ] } // 點擊地圖 this.mapChart.on('click', (params) => { console.log(params) let mapData = qinghai if (this.level === 1) { // 省級地圖 if (provinceName[params.name]) { mapData = provinceName[params.name] } this.level = 2 this.$echart.registerMap('province', mapData) } else if (this.level === 2) { // 市級地圖 mapData = cityName['錫林郭勒盟'] this.level = 3 this.$echart.registerMap('city', mapData) } this.option.series = map[this.level] // 重置地圖數據 this.mapChart.setOption(this.option) }) }
6.上一步做完就能實現點擊地圖跳轉到下一級功能了,現在在加上點擊空白處跳轉上一級的功能
echarts沒有單獨的點擊空白處的事件,但是提供了getZr()方法,點擊圖表所有地方都可以觸發事件,返回event,可以通過判斷event.target來判斷點擊的是否是空白處
// 點擊所有地方觸發 this.mapChart.getZr().on('click', (event) => { // 該監聽器正在監聽一個`zrender 事件`。 // console.log(event.target, this.level) // 點擊空白處回到上一級 if (!event.target && this.level !== 1) { if (this.level === 2) { // 如果當前是在第二級,返回第一級 this.option.series = [{ type: 'map', map: 'china', label: { show: false }, zoom: 1.2, roam: true }] this.level = 1 } else if (this.level === 3) { // 如果當前是在第三級,返回第二級 this.option.series = map[2] this.level = 2 } this.mapChart.setOption(this.option) } })
7.以上配置就可以實現一個地圖的層級跳轉了,默認的地圖數據只有name值,如果你還需要展示其他額外數據可以設置data數據,但是要和地圖里的name對應上
const visualData = [ // 錫林郭勒盟映射數據,可以自己增加額外屬性 {name: '東烏珠穆沁旗', value: 100, level: 3}, {name: '西烏珠穆沁旗', value: 500, level: 3}, {name: '錫林浩特市', value: 1100, level: 3}, {name: '阿巴嘎旗', value: 3300, level: 3}, {name: '正藍旗', value: 900}, {name: '多倫縣', value: 350}, {name: '正鑲白旗', value: 2100}, {name: '太仆寺旗', value: 1900}, {name: '蘇尼特左旗', value: 4500}, {name: '蘇尼特右旗', value: 2800}, {name: '二連浩特市', value: 3560}, {name: '鑲黃旗', value: 789}, ] const map = { 2: [{ type: 'map', map: 'province', label: { show: true }, itemStyle: { areaColor: '#f1b290', }, zoom: 1, roam: true }], 3: [{ type: 'map', map: 'city', name: '降雨量', label: { show: true }, zoom: 1, roam: true, data: visualData // 設置數據 } ] }
8.地圖的區域顏色默認是灰色,你可以設置itemStyle改變顏色和邊框,但是這個改變是整個地圖一起改變.如果希望根據某個值,如value值大小進行顏色區分,可以添加visualMap,視覺映射
data() { return { option: { title: { text: '中國地圖', subtext: '鼠標縮放比例大於2.5展示名稱' }, tooltip: { trigger: 'item' }, visualMap: { // 設置視覺映射 min: 100, max: 5000, text: ['High', 'Low'], realtime: false, calculable: true, inRange: { color: ['lightskyblue', 'yellow', 'orangered'] } }, }, mapChart: '', level: 1 } },
9.最后說一下,我的地圖用的是series的type:'map',不是geo屬性
這兩個的區別:
geo是地理坐標系組件,可以理解為背景圖
type:'map',地圖, 主要用於地理區域數據的可視化
也就是如果你要展示的某個地區的數據可以用type:'map',因為你可以設置data來展示你需要展示的數據;如果你要做的是類似散點圖,比如GDP全國前十,你要展示的是前十這幾個數據,但是需要全國地圖做背景就用geo
完整代碼:
<template> <div class="line-container"> <p>點擊省份可以跳轉到省級地圖(省級數據只有青海和內蒙古,點擊其他省份展示重復數據)</p> <p>點擊市可以跳轉到市級地圖(市數據只有錫林郭勒)市數據有顏色塊區分</p> <p>點擊地圖空白處回到上一級地圖</p> <div> <div id="mapChart"></div> </div> </div> </template> <script> import chinaJson from '@/utils/map/china.json' // json數據引入 import qinghai from '@/utils/map/qinghai.json' import neimenggu from '@/utils/map/neimenggu.json' import xilinguole from '@/utils/map/xilinguole.json' export default { name: 'mapChart', data() { return { option: { title: { text: '中國地圖', subtext: '鼠標縮放比例大於2.5展示名稱' }, tooltip: { trigger: 'item' }, visualMap: { min: 100, max: 5000, text: ['High', 'Low'], realtime: false, calculable: true, inRange: { color: ['lightskyblue', 'yellow', 'orangered'] } }, }, mapChart: '', level: 1 } }, created() {}, mounted() { this.getMapChart() }, methods: { // echarts初始化 getMapChart() { this.mapChart = this.$echart.init(document.getElementById('mapChart')) this.$echart.registerMap('china', chinaJson); this.option.series = [{ type: 'map', map: 'china', zoom: 1.2, roam: true }] this.mapChart.setOption(this.option) // 監聽地圖縮放事件 this.mapChart.on('georoam', (params) => { // console.log(params) const moption = this.mapChart.getOption() console.log(moption) if (params.zoom) { // 縮放事件 const zoom = moption.series[0].zoom this.option.series[0].zoom = zoom if (zoom > 2.5) { this.option.series[0].label = { show: true } this.mapChart.setOption(this.option) } else { this.option.series[0].label = { show: false } this.mapChart.setOption(this.option) } } }) // geo設置可用 // this.mapChart.on('geoselectchanged', (params) => { // console.log(params) // }) // 省級地圖 const provinceName = { '青海省': qinghai, '內蒙古自治區': neimenggu } // 市級地圖 const cityName = { '錫林郭勒盟': xilinguole } // 獲取地圖數據 const map = this.getMap() // 點擊地圖省份 this.mapChart.on('click', (params) => { console.log(params) let mapData = qinghai if (this.level === 1) { if (provinceName[params.name]) { mapData = provinceName[params.name] } this.level = 2 this.$echart.registerMap('province', mapData) } else if (this.level === 2) { mapData = cityName['錫林郭勒盟'] this.level = 3 this.$echart.registerMap('city', mapData) } this.option.series = map[this.level] this.mapChart.setOption(this.option) }) // 點擊所有地方觸發 this.mapChart.getZr().on('click', (event) => { // 該監聽器正在監聽一個`zrender 事件`。 // console.log(event.target, this.level) // 點擊空白處回到上一級 if (!event.target && this.level !== 1) { if (this.level === 2) { this.option.series = [{ type: 'map', map: 'china', label: { show: false }, zoom: 1.2, roam: true }] this.level = 1 } else if (this.level === 3) { this.option.series = map[2] this.level = 2 } this.mapChart.setOption(this.option) } }); }, // 獲取地圖數據 getMap () { const visualData = [ // 錫林郭勒盟映射數據,可以自己增加額外屬性 {name: '東烏珠穆沁旗', value: 100, level: 3}, {name: '西烏珠穆沁旗', value: 500, level: 3}, {name: '錫林浩特市', value: 1100, level: 3}, {name: '阿巴嘎旗', value: 3300, level: 3}, {name: '正藍旗', value: 900}, {name: '多倫縣', value: 350}, {name: '正鑲白旗', value: 2100}, {name: '太仆寺旗', value: 1900}, {name: '蘇尼特左旗', value: 4500}, {name: '蘇尼特右旗', value: 2800}, {name: '二連浩特市', value: 3560}, {name: '鑲黃旗', value: 789}, ] const map = { 2: [{ type: 'map', map: 'province', label: { show: true }, itemStyle: { areaColor: '#f1b290', }, zoom: 1, roam: true }], 3: [{ type: 'map', map: 'city', name: '降雨量', label: { show: true }, zoom: 1, roam: true, data: visualData // 設置視覺映射數據 } ] } return map } } } </script> <style> #mapChart { width: 800px; height: 500px; } </style>