Echarts市县级地图下钻(纯代码)
实现工具:echarts插件、地图json文件。
江西省市区的离线json文件,已上传到github:https://github.com/Gx2019/map
vue
直接贴代码:
<template> <div class="NotiBox"> <div class="leftbox"> <!-- <a-button type="primary" style="padding:0 20px;margin:0 0 10px 0px;" @click="province">全省</a-button> --> <div id="mapBox" ref="myEchartsBox"></div> </div> <div class="right"> </div> </div> </template> <script> var echarts = require('echarts') export default { name: 'jxsEchart', components: {}, data() { return { citys: '江西省' } }, created() {}, mounted() { this.getMap() }, methods: { displayRender({labels}) { return labels[labels.length - 1]; }, onChange(value) { console.log(value.toString()) }, getMap() { let _that = this var myEchartsBox = _that.$refs.myEchartsBox var jxs = require('@/assets/jxs.json') var ganzhou = require('@/assets/ganzhou.json') var yichun = require('@/assets/yichun.json') var xinyu = require('@/assets/xinyu.json') var shangrao = require('@/assets/shangrao.json') var pingxiang = require('@/assets/pingxiang.json') var nanchang = require('@/assets/nanchang.json') var jiujiang = require('@/assets/jiujiang.json') var jingdezhen = require('@/assets/jingdezhen.json') var jian = require('@/assets/jian.json') var fuzhou = require('@/assets/fuzhou.json') var yingtan = require('@/assets/yingtan.json') echarts.extendsMap = function(id, opt) { var chart = echarts.init(myEchartsBox) var curGeoJson = {} var cityMap = { 南昌市: nanchang, 景德镇市: jingdezhen, 萍乡市: pingxiang, 九江市: jiujiang, 新余市: xinyu, 鹰潭市: yingtan, 赣州市: ganzhou, 吉安市: jian, 宜春市: yichun, 抚州市: fuzhou, 上饶市: shangrao } var geoCoordMap = { 南昌: [115.89, 28.48], 景德镇: [117.28, 29.09], 萍乡: [113.93, 27.41], 九江: [115.97, 29.51], 新余: [114.81, 27.72], 鹰潭: [117.12, 28.1], 赣州: [115.04, 25.67], 吉安: [115.05, 26.88], 宜春: [114.41, 28.03], 抚州: [116.45, 27.79], 上饶: [117.92, 28.22] } var levelColorMap = { '1': 'rgba(241, 109, 115, .8)', '2': 'rgba(255, 235, 59, .7)', '3': '#1BAF' } var defaultOpt = { mapName: 'china', // 地图展示 goDown: false, // 是否下钻 bgColor: '#1BAFAC', // 画布背景色 activeArea: [], // 区域高亮,同echarts配置项 data: [], // 下钻回调(点击的地图名、实例对象option、实例对象) callback: function(name, option, instance) {} } if (opt) opt = this.util.extend(defaultOpt, opt) // 层级索引 var name = [opt.mapName] var idx = 0 var pos = { leftPlus: 50, leftCur: 128, left: 107, top: 10 //索引的位置 } var line = [ [0, 0], [8, 11], [0, 22] ] // style var style = { font: '18px "Microsoft YaHei", sans-serif', textColor: '#eee', lineColor: 'rgba(147, 235, 248, .8)' } var handleEvents = { /** * i 实例对象 * o option * n 地图名 **/ resetOption: function(i, o, n) { var breadcrumb = this.createBreadcrumb(n) var j = name.indexOf(n) var l = o.graphic.length if (j < 0) { o.graphic.push(breadcrumb) o.graphic[0].children[0].shape.x2 = 145 o.graphic[0].children[1].shape.x2 = 145 if (o.graphic.length > 2) { for (var x = 0; x < opt.data.length; x++) { if (n === opt.data[x].name + '市') { o.series[0].data = handleEvents.initSeriesData([opt.data[x]]) break } else o.series[0].data = [] } } name.push(n) idx++ } else { o.graphic.splice(j + 2, l) if (o.graphic.length <= 2) { o.graphic[0].children[0].shape.x2 = 60 o.graphic[0].children[1].shape.x2 = 60 o.series[0].data = handleEvents.initSeriesData(opt.data) } name.splice(j + 1, l) idx = j pos.leftCur -= pos.leftPlus * (l - j - 1) } o.geo.map = n o.geo.zoom = 0.4 i.clear() i.setOption(o) this.zoomAnimation() opt.callback(n, o, i) }, /** * name 地图名 **/ createBreadcrumb: function(name) { var cityToPinyin = { 南昌市: 'nanchang', 景德镇市: 'jingdezhen', 萍乡市: 'pingxiang', 九江市: 'jiujiang', 新余市: 'xinyu', 鹰潭市: 'yingtan', 赣州市: 'ganzhou', 吉安市: 'jian', 宜春市: 'yichun', 抚州市: 'fuzhou', 上饶市: 'shangrao' } var breadcrumb = { type: 'group', id: name, left: pos.leftCur + pos.leftPlus, top: pos.top + 3, children: [ { type: 'polyline', left: -90, top: -5, shape: { points: line }, style: { stroke: '#fff', key: name // lineWidth: 2, }, onclick: function() { var name = this.style.key handleEvents.resetOption(chart, option, name) } }, { type: 'text', left: -68, top: 'middle', style: { text: name, textAlign: 'center', fill: style.textColor, font: style.font }, onclick: function() { var name = this.style.text handleEvents.resetOption(chart, option, name) } }, { type: 'text', left: -68, top: 10, style: { name: name, text: cityToPinyin[name] ? cityToPinyin[name].toUpperCase() : '', textAlign: 'center', fill: style.textColor, font: '12px "Microsoft YaHei", sans-serif' }, onclick: function() { // console.log(this.style); var name = this.style.name handleEvents.resetOption(chart, option, name) } } ] } pos.leftCur += pos.leftPlus return breadcrumb }, // 设置effectscatter initSeriesData: function(data) { var temp = [] for (var i = 0; i < data.length; i++) { var geoCoord = geoCoordMap[data[i].name] if (geoCoord) { temp.push({ name: data[i].name, value: geoCoord.concat(data[i].value, data[i].level) }) } } return temp }, zoomAnimation: function() { var count = null var zoom = function(per) { if (!count) count = per count = count + per // console.log(per,count); chart.setOption({ geo: { zoom: count } }) if (count < 1) window.requestAnimationFrame(function() { zoom(0.2) }) } window.requestAnimationFrame(function() { zoom(0.2) }) } } var option = { backgroundColor: opt.bgColor, graphic: [ { type: 'group', left: pos.left, top: pos.top - 4, children: [ { type: 'line', left: 0, top: -20, shape: { x1: 0, y1: 0, x2: 60, y2: 0 }, style: { stroke: style.lineColor } }, { type: 'line', left: 0, top: 20, shape: { x1: 0, y1: 0, x2: 60, y2: 0 }, style: { stroke: style.lineColor } } ] }, { id: name[idx], type: 'group', left: pos.left + 2, top: pos.top, children: [ { type: 'polyline', left: 90, top: -12, shape: { points: line }, style: { stroke: 'transparent', key: name[0] }, onclick: function() { var name = this.style.key handleEvents.resetOption(chart, option, name) } }, { type: 'text', left: 0, top: 'middle', style: { text: name[0] === '江西' ? '江西省' : name[0], textAlign: 'center', fill: style.textColor, font: style.font }, onclick: function() { handleEvents.resetOption(chart, option, '江西') } }, { type: 'text', left: 0, top: 10, style: { text: 'JIANGXI', textAlign: 'center', fill: style.textColor, font: '12px "STKaiti", sans-serif' }, onclick: function() { handleEvents.resetOption(chart, option, '江西') } } ] } ], geo: { map: opt.mapName, // roam: true, zoom: 1, label: { normal: { show: true, textStyle: { color: '#fff' } }, emphasis: { textStyle: { color: '#fff' } } }, itemStyle: { normal: { borderColor: 'rgba(147, 235, 248, 1)', borderWidth: 1, areaColor: { type: 'radial', x: 0.5, y: 0.5, r: 0.8, colorStops: [ { offset: 0, color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色 }, { offset: 1, color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色 } ], globalCoord: false // 缺省为 false }, shadowColor: 'rgba(128, 217, 248, 1)', // shadowColor: 'rgba(255, 255, 255, 1)', shadowOffsetX: -2, shadowOffsetY: 2, shadowBlur: 10 }, emphasis: { areaColor: '#389BB7', borderWidth: 0 } }, regions: opt.activeArea.map(function(item) { if (typeof item !== 'string') { return { name: item.name, itemStyle: { normal: { areaColor: item.areaColor || '#389BB7' } }, label: { normal: { show: item.showLabel, textStyle: { color: '#fff' } } } } } else { return { name: item, itemStyle: { normal: { borderColor: '#91e6ff', areaColor: '#1BAFAC' } } } } }) }, series: [ { type: 'effectScatter', coordinateSystem: 'geo', // symbol: 'diamond', showEffectOn: 'render', rippleEffect: { period: 15, scale: 6, brushType: 'fill' }, hoverAnimation: true, itemStyle: { normal: { color: function(params) { return levelColorMap[params.value[3]] }, shadowBlur: 10, shadowColor: '#333' } }, data: handleEvents.initSeriesData(opt.data) } ] } chart.setOption(option) // 添加事件 chart.on('click', function(params) { var _self = this if (opt.goDown && params.name !== name[idx]) { if (cityMap[params.name]) { var url = cityMap[params.name] echarts.registerMap(params.name, url) handleEvents.resetOption(_self, option, params.name) } } _that.citys = params.name console.log(_that.citys) }) chart.setMap = function(mapName) { var _self = this if (mapName.indexOf('市') < 0) mapName = mapName + '市' var citySource = cityMap[mapName] if (citySource) { var url = './map/' + citySource + '.json' echarts.registerMap(mapName, url) handleEvents.resetOption(_self, option, mapName) } // handleEvents.resetOption(this, option, mapName); } return chart } echarts.registerMap('江西', jxs) var myChart = echarts.extendsMap('chart-panel', { bgColor: '', // 画布背景色 mapName: '江西', // 地图名 goDown: true, // 是否下钻 // 下钻回调 callback: function(name, option, instance) { // console.log(name, option, instance); }, // 数据展示 data: [ { name: '南昌', value: 10, level: 1 }, { name: '景德镇', value: 12, level: 2 }, { name: '萍乡', value: 11, level: 3 }, { name: '赣州', value: 16, level: 3 }, { name: '吉安', value: 12, level: 3 }, { name: '上饶', value: 12, level: 3 }, { name: '九江', value: 12, level: 3 }, { name: '抚州', value: 12, level: 3 }, { name: '宜春', value: 12, level: 3 }, { name: '新余', value: 12, level: 3 }, { name: '鹰潭', value: 12, level: 3 } ] }) } } } </script> <style scoped> .NotiBox { width: 100%; position: relative; } .NotiBox #mapBox { width: 45%; min-height: 600px; overflow: hidden; left: -100px; position: absolute; float: left; } .leftbox { float: left; height: 600px; } .right { width: 55%; float: right; height: 600px; color: #000; overflow-y: scroll; overflow-x: hidden; } </style>
放这段代码上去修改下 县市级地图就做好了
参考:https://gallery.echartsjs.com/editor.html?c=xqxC1bMBiF