详解vue中使用echarts地图实现上钻下钻的可视化 三级下钻 省>市>县
简述功能概要最近有需求做一个数据可视化的功能 会具体显示全国各地区的买家分布情况鼠标放置在地图上会显示当前城市的分布人数 点击当前省份会下钻到城市地图 会显示当前省市下各个城市的买家数和分布情况如果遇到没有下一级再次点击会进行返回到国家地图(目前该示例图是两级下钻 省>区市 )(还可以实现点击按钮返回到上一级)右侧数据表会跟随城市的切换而进行动态切换(无视数据的准确性)准备工作首先需要所有城
简述功能概要
最近有需求做一个数据可视化的功能 会具体显示全国各地区的买家分布情况
鼠标放置在地图上会显示当前城市的分布人数 点击当前省份会下钻到城市地图 会显示当前省市下各个城市的买家数和分布情况
如果遇到没有下一级再次点击会进行返回到国家地图(目前该示例图是两级下钻 省>区市 )(还可以实现点击按钮返回到上一级)
右侧数据表会跟随城市的切换而进行动态切换(无视数据的准确性)
准备工作
首先需要所有城市地图的json文件和一个城市行政区域划代码的js文件(本文件请求使用)(如有需要可跟与我联系)
获取到当前json和js文件之后需要把json文件放置在服务器中 进行请求回去当前某个城市的json地图文件,亦可放置在static中进行axios请求获取,js文件放置在本地的assets中进行获取
准备好这两项工作后 我们可以开始进行书写代码 生成echarts地图图表
生成地图图表
import cityMap from "../../../assets/map/china-main-city-map.js";
import echarts from "echarts";
首先在vue文件中引入echarts和区域代码js文件.
//中国地图(第一级地图)的ID、Name、Json数据
var chinaId = 100000;
var chinaName = "china";
var chinaJson = null;
//Echarts地图全局变量,主要是在返回上级地图的方法中会用到
var myChart = null;
var cityId = null;
定义变量使用
具体实现代码(以及实现步骤)
<div id="mapChart" class="chart"></div>
mapChart(divid) {
this.mapData = [];
var that = this;
//chinaId 为上边定义的变量 值为100000
Vue.axios({
url:
"https://gdsoft-/echart/map/" +
chinaId +
".json",
withCredentials: false,
}).then((response) => {
//进入页面后 传递的参数为全国的id 然后向json文件发起请求 找到文件名为100000的json文件
//获取到全国的地图文件 渲染出来
const mapJson = response.data;
//调用数据获取省份数据
let data = {
from: this.allStartDate,
to: this.allEndDate,
areaCode: chinaId,
};
Vue.axios({
method: "POST",
serviceId: "mall",
url: "123456789",
data,
}).then((res) => {
//这里为右侧的table数据展示
//发起请求 获取到全国的省市的json数据
this.mapChinaOptions = res.result;
for (var i = 0; i < mapJson.features.length; i++) {
//mapData为定义的变量 获取到当前所以省份地图json文件中的省份名和区域划代码
this.mapData.push({
name: mapJson.features[i].properties.name,
id: mapJson.features[i].id,
value: 0,
});
}
//让json地图文件中的区域划代码和请求返回的行政编码作比较 如果相等
// 进获取数据进行赋值
this.mapData.forEach((item) => {
this.mapChinaOptions.forEach((item1) => {
if (item.id == item1.areaCode) {
item.value = item1.buyerCount;
}
});
});
});
//省份的json数据赋值
chinaJson = mapJson;
//生成图表
myChart = echarts.init(document.getElementById(divid));
//把上边的数据 都当做参数传递给 函数中
this.registerAndsetOption(myChart, chinaName, mapJson);
this.mapChartOption.series[0].data = this.mapData;
//这里为当点击某个省份或城市的时候的点击事件
myChart.on("click", function (param) {
that.show = 0;
that.mapData2 = [];
cityId = cityMap[param.name];
// 获取到当前点击的这个城市的 code
//如果有这个城市的id 就可以请求json 获取子级地图信息
if (cityId) {
//代表有下级地图
Vue.axios({
url:
"https://gds/echart/map/" +
cityId +
".json",
withCredentials: false,
}).then((response) => {
// 获取到城市新的json数据
const mapJson = response.data || response;
this.getCityData = response.data || response;
let data = {
from: that.allStartDate,
to: that.allEndDate,
areaCode: cityId,
};
Vue.axios({
method: "POST",
serviceId: "mall",
url: "123456789",
data,
})
.then((res) => {
if (res.success) {
that.mapData2 = [];
this.mapCityOptions = res.result;
that.payDataList = res.result;
//重新获取相同的数据 给 that.mapData2赋值
for (var i = 0; i < this.getCityData.features.length; i++) {
that.mapData2.push({
name: this.getCityData.features[i].properties.name,
id: this.getCityData.features[i].id,
value: 0,
});
}
that.mapData2.forEach((item) => {
this.mapCityOptions.forEach((item1) => {
if (item.id == item1.areaCode) {
item.value = item1.buyerCount;
}
});
});
//重新调用 生成新的地图
that.registerAndsetOption(myChart, param.name, mapJson);
//把数据传递给图表data
that.mapChartOption.series[0].data = that.mapData2;
} else {
Message.error("获取买家地域分布数据失败,请稍后重试!");
}
})
.catch((err) => {
Message.error("获取买家地域分布数据失败,请稍后重试!");
});
});
} else {
that.show = 1;
// 如果没有就在最后一级 再次点击返回中国地图
//把上边的数据 都当做参数传递给 函数中
that.registerAndsetOption(myChart, chinaName, mapJson);
//返回中国地图 并且把数据重新赋值 给data 防止返回的时候 data数据为空了
that.mapChartOption.series[0].data = that.mapData;
}
});
});
},
registerAndsetOption(myChart, name, mapJson) {
//把获取到的城市name和 城市地图json 用来注册地图
echarts.registerMap(name, mapJson);
//图表的配置文件
this.mapChartOption = {
//鼠标放置在地图上的显示
tooltip: {
trigger: "item",
formatter: (p) => {
//这里p可以获取到所有的数据
let val = p.value;
if (window.isNaN(val)) {
val = 0;
}
let txtCon =
"<div style='text-align:center'>" +
p.name +
":<br />地域分布数:" +
val +
"</div>";
return txtCon;
},
},
series: [
{
type: "map",
map: name,
itemStyle: {
normal: {
//未选中样式
//背景颜色
areaColor: "#e8effd",
//边框颜色
borderColor: "#fbfdfe",
//边框宽度
borderWidth: 1,
},
emphasis: {
// 选中样式
borderWidth: 1,
//高亮颜色
areaColor: "#2062e6",
label: {
//显示文字
show: false,
textStyle: {
//鼠标移入的字体颜色
color: "black",
},
},
},
},
data: [],
},
],
};
myChart.setOption(this.mapChartOption, true);
},
图表宽度自适应
mounted() {
this.mapChart("mapChart");
// 自适应
window.onresize = () => {
myChart.resize();
};
},
// 监听图表数据的变化
watch: {
mapChartOption: {
handler(newVal, oldVal) {
if (myChart) {
// 如何有变化 就获取最新的数据 并且渲染
myChart.setOption(newVal);
} else {
// 如何无变化 还是老数据
myChart.setOption(oldVal);
}
},
deep: true,
},
},
具体的实现步骤可以看代码有步骤的具体实现和业务代码
简述具体思路
当前有一个本地的行政区域划代码的js文件 和 一个地图城市信息的json文件
初始化的时候会获取全国的区域代码 然后和 json文件中的区域代码匹配 然后请求匹配的json文件
会获取到全国的地图信息 通过 echarts渲染出来
当点击具体省份的时候 会获取当前省份的 区域代码 和 json文件的区域代码匹配 然后请求匹配的json文件
会获取到省市的地图信息 通过 echarts渲染出来
三级下钻同理
如果点击没有下一级城市 会重新获取全国的地图文件 相当于返回
具体有问题可以与我联系 新人一个 勿喷
因为文章别其他人和平台转载抄袭 所以需要打赏发地图JSON文件哦
谢谢 写文章不易 谢谢打赏
更多推荐
所有评论(0)