Vue使用echarts地图进阶1(实现单次下钻功能)

echarts地图实现单次下钻功能

由于涉及的JSON文件不多,所以结合axios,按需动态请求本地JSON文件

效果图:
在这里插入图片描述
先来小看一下(也可以不用看,只是帮助一下加深理解),多级下钻和单次下钻跳转json文件的区别:

1、如果要实现多级下钻并且展示子区域的话,下钻点击事件请求的JSON必须是该点击区域的全面父级JSON(即没有自己,只有孩子们组成)
在这里插入图片描述

2、如果要实现地图只下钻一次,并且不展示目标下钻区域的子区域。如第一层地图是中国,实现点击某个省下钻到该省,但是不展示该省的子区域,那么下钻点击事件请求的JSON必须是该点击区域的确切json(即只有自己,没有孩子们)
在这里插入图片描述

1、该页面涉及到的关键函数有三个:getGeoJson()、initChart()、initEcharts()
2、该页面结合了axios动态请求json文件数据
3、封装了axios请求,这里是动态请求本地json,故而url是本地路径,Vue3.x以上静态资源一般存在public中,我这里是在public下新建js文件夹,将所有json文件放于其中,路径不用加上public(如目标文件名称是440800.json,url就是“/js/440800.json”),如图所示:
在这里插入图片描述
在这里插入图片描述
4、api路径代理设置(这一步也可以不用写,看自己所需)
默认路径相对路径都是写为’/api/xxx’,旧版本下会在vue.config.js下配置proxy属性,但Vue新版本这个js文件已经不在目录下了,需要我们手动新建一个JS文件,内容如下
在这里插入图片描述

直接上代码

<!--实现湛江市的简单下钻,只有一层下钻,采用结合axios请求,本地引入JSON方式-->
<template>
	<div>
		<div class="areaRanking1" ref="areaRanking1" :style="{width: '600px', height: '500px',}">
		</div>
		<div>
			<button type="button" @click="cancel">返回父级地图</button>
		</div>
	</div>
</template>

<script>
	import axios from 'axios'
	var echarts = require('echarts')
	export default {
		name: "areaRanking1",
		mounted() {
			// this.testData("440881");
			this.initChart();//最先展示全部-最大的那个
		},
		data(){
			return{
				//由于是单次下钻,所以没必要请求全部json区域编码信息
				allCode:[
					{name:"廉江市",adcode:"440881"},
					{name:"吴川市",adcode:"440883"},
					{name:"遂溪县",adcode:"440823"},
					{name:"赤坎区",adcode:"440802"},
					{name:"坡头区",adcode:"440804"},
					{name:"霞山区",adcode:"440803"},
					{name:"麻章区",adcode:"440811"},
					{name:"雷州市",adcode:"440882"},
					{name:"徐闻县",adcode:"440825"},
				]
			}
		},
		methods: {
			cancel(){
				this.initChart();
			},
			getLocalJson(jsonName){
				//封装了axios请求,这里是动态请求本地json,故而url是本地路径,Vue3.x以上静态资源一般存在public中,我这里是在public下新建js文件夹,将所有json文件放于其中
				return axios.get(`/js/${jsonName}.json`)
			},
			initEcharts(geoJson, name, chart) {
				let self = this;
				echarts.registerMap(name, geoJson);
				let option = {
					title: {
						text: name,
					},
					tooltip: {
						trigger: 'item',
						//这是自定义弹框内容
						formatter: parms => {
							var str = parms.marker + "" + parms.data.name + "</br>" +
								"数量:" + parms.data.value + "</br>"
							return str;
						}
					},
					visualMap: {
						min: 10,
						max: 1000,
						text: ['High', 'Low'],
						realtime: false,
						calculable: true,
						inRange: {
							color: ['lightskyblue', 'yellow', 'orangered']
						}
					},
					series: [{
						type: 'map',
						map: name,
						label: {
							show: true
						},
						data: [
							{ name: '廉江市', value: 21 },
							{ name: '遂溪县', value: 111 },
							{ name: '吴川市', value: 311 },
							{ name: '坡头区', value: 631 },
							{ name: '赤坎区', value: 791 },
							{ name: '霞山区', value: 411 },
							{ name: '麻章区', value: 31 },
							{ name: '雷州市', value: 421 },
							{ name: '徐闻县', value: 911 }
						],
					}]
				}
				chart.setOption(option);
				chart.off("click");
				chart.on('click',params=>{
					//根据点击区域名称去获取点击区域的行政区域编码
					let clickCode = self.allCode.filter(areaJson => areaJson.name === params.name)[0].adcode;
					this.getLocalJson(clickCode).then(res => {
						self.initEcharts(res.data, params.name, chart)
					}).catch(err => {
						console.log(err,"err")
						this.getLocalJson("440800").then(zhangJiangJson => {
							self.initEcharts(zhangJiangJson.data, params.name, chart)
						})
					})
					console.log(params);
				})
			},
			initChart(){
				let chart = echarts.init(this.$refs.areaRanking1);
				this.getLocalJson("440800").then(zhangJiangJson => {
					this.initEcharts(zhangJiangJson.data, '湛江', chart)
				})
			}
		}
	}
</script>

<style scoped>

</style>

另:若地图需要实现多级下钻,参考这篇Vue使用echarts地图进阶2(实现多级下钻功能)


版权声明:本文为weixin_44582077原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。