详解vue中使用echarts地图实现上钻下钻的可视化 三级下钻 省>市>县

2023-11-16

简述功能概要

最近有需求做一个数据可视化的功能 会具体显示全国各地区的买家分布情况 

鼠标放置在地图上会显示当前城市的分布人数 点击当前省份会下钻到城市地图 会显示当前省市下各个城市的买家数和分布情况

如果遇到没有下一级再次点击会进行返回到国家地图(目前该示例图是两级下钻 省>区市 )(还可以实现点击按钮返回到上一级)

右侧数据表会跟随城市的切换而进行动态切换(无视数据的准确性) 

准备工作

首先需要所有城市地图的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渲染出来

三级下钻同理

如果点击没有下一级城市 会重新获取全国的地图文件 相当于返回 

具体有问题可以与我联系 新人一个 勿喷

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解vue中使用echarts地图实现上钻下钻的可视化 三级下钻 省>市>县 的相关文章

  • vue项目中使用echarts5

    前言 echarts中升级到版本5以后 使用方法发生了改变 注意不兼容ie8了 还有引入方法改变了 使用步骤 1 安装 cnpm install echarts save 2 引入 去除 default exports 的支持 v4 及其之
  • echarts使用API查看新增商品数量

    echarts使用API查看新增商品数量 echarts官网 http echarts baidu com index html 帮助文档 http echarts baidu com api html echarts 下载地址 http
  • echarts地图的tooltip自定义样式显示图表

    echarts地图的tooltip自定义样式显示图表 最近遇到一个需求 需要在地图中实现鼠标点击或者停留在地图中某一片区域时 该区域显示亮高和显示tooltip提示框信息 但是难点在于需要在tooltip提示框中再绘制一层图表 按以往我们做
  • Vue2 Echarts刷新页面图形会消失

    如果data是写死的数据 刷新页面是不会出现图形消失的问题 之所以图形消失 是因为数据来自后台服务器 我个人在做项目的时候 这个Echarts表是单独封装了一个组件 后在vue页面引入 在vue页面的mounted生命周期dispatch对
  • 测试开发1

    基本概念 一 测试开发基本概念 1 什么是软件测试 2 软件测试和软件开发的区别 3 你为什么选择软件测试 4 什么是需求 二 测试开发基础 1 需求是软件测试的依据 2 用户名和密码登陆测试用例 2 1 功能角度 2 2 非功能需求维度
  • 水球图 及各种参数设置

    水球图 Liquid Fill Chart 是Echarts的一个插件 在官方文档中没有 可以用来优雅的展示百分比数据 水球图 gif 安装 HTML中引入水球图
  • UE4 通过Echarts实现各种统计图

    主要内容 本文主要讲解UE4 UMG向网页发送数据 通过WebBrowser插件将用Echarts定制好的统计图在UE4内展现出来 达到数据可视化的效果 本文主要演示柱形图的效果 其它类型的统计图可以结合Echarts官方案列以及文档自行修
  • echarts 配置问题

    饼图标签重叠 超出 series type pie name 数据来源 radius 40 60 avoidLabelOverlap true 是否启用防止标签重叠策略 minAngle 20 最小的扇区角度 0 360 用于防止某个值过小
  • VUE之Echarts图表x轴y轴提示文字过长处理为省略号

    只需对显示文字格式修改即可 yAxis type category axisLine show false 轴线 axisTick show false 去除刻度 axisLabel formatter function params co
  • 调整echarts中图与legend的距离

    1 正常调整legend的位置 通过X改变横坐标位置 通过Y改变纵轴位置 x 可设定图例在左 右 居中 y 可设定图例在上 下 居中 legend y bottom data 阳性转阴性 阴性转阳性 阳性无症状转有症状 未检测 2 如果觉得
  • 在Echarts中的tooltip上添加点击按钮

    需求 在Echarts的tooltips中添加点击按钮并可以鼠标悬停点击该按钮 功能实现 在option中的tooltip添加enterable true的属性 表示鼠标可以移入tooltip中 再在formatter中添加
  • 自变化折线图(两周数据)

  • @vitejsplugin-vue requires vue (>=3.2.13) or @vuecompiler-sfc to be present in the dependency tree

    运行项目的时候 首先会提示要安装 vue compiler sfc 但是安装后运行项目成功但是页面是空白并且报错 VUE HMR RUNTIME is not defined 摸索了半天 查看到package json依赖文件 没有vue
  • echarts雷达图自定义射线颜色、边框效果和背景样式

    目录 1 在官网找样例 2 初步改造示例 有个雏形 3 细节改造和优化 4 全部代码 5 原始效果和完成效果对比 1 在官网找样例 样例地址 Examples Apache ECharts 2 初步改造示例 有个雏形 对应的代码 为了说明问
  • echarts中的地图展示所有省份以及悬浮上去展示具体的信息

  • Echarts:绘制信号的方差

    我想在图表中绘制多个信号的方差 或者基本上填充上部信号和下部信号之间的空间 是否可以创建这样的图表 我看到了置信带示例 https echarts apache org examples en editor html c confidenc
  • echarts漏斗图自定义漏斗颜色、粗细、大小、间隔缝隙

    echarts漏斗图自定义漏斗颜色 粗细 大小 间隔缝隙
  • 如何最大限度地减少百度 echarts 周围的空白

    我正在尝试合并百度的echarts 看起来非常好 然而 当人们不设置标题也不使用工具栏时 实际图表周围会有很多空白 有没有办法让图形 图表使用更多的画布 我当前的解决方案是在容器内部添加一个额外的内容 然后将其宽度和高度设置为更大我想要删除
  • Echarts3(百度)工具提示中的彩色圆形

    Echarts3 百度 工具提示中的彩色圆形 默认情况下 工具提示具有与图形相同颜色的圆形 如下所示 http echarts baidu com gallery editor html c candlestick brush http e
  • javascript - eCharts - 多个 y 轴彼此重叠

    I use eCharts JavaScript 插件 https ecomfe github io echarts doc public en index html创建折线图 正如您在下面所附的图片中看到的 y 轴彼此重叠 这是我使用的选

随机推荐