最新-vue使用echarts可视化实现省地图下钻及返回(以山西省为例)


最近在项目实际业务中为了更清晰的展示省市的数据,使用echarts实现了地图的下钻和返回。因为里面加了实际业务,所以代码有些冗余。
先来看下效果图
在这里插入图片描述

一、下载安装echarts

npm install echarts --save

1.echarts不同版本引入方式不同

//5.0以下版本: 
import echarts from 'echarts ’
//5.0以上版本: 
import * as echarts from ‘echarts’

2.初始化echarts

初始化echarts有两种方法:
html部分:

 <div id="main" ref="shanxi" class="map"></div>

js部分:

//
 let myChart = echarts.init(document.getElementById("main"));
 let.myChart = echarts.init(this.$refs.shanxi);

3.绘制图标(官方案例)

数据添加到setOption里面,有两种方式 第一种:

import * as echarts from 'echarts';
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 绘制图表 -----------第一种方式
myChart.setOption({
  title: {
    text: 'ECharts 入门示例'
  },
  tooltip: {},
  xAxis: {
    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
  },
  yAxis: {},
  series: [
    {
      name: '销量',
      type: 'bar',
      data: [5, 20, 36, 10, 10, 20]
    }
  ]
});

第二种:

import * as echarts from 'echarts';
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 绘制图表 -----------第二种方式
var option ={
  title: {
    text: 'ECharts 入门示例'
  },
  tooltip: {},
  xAxis: {
    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
  },
  yAxis: {},
  series: [
    {
      name: '销量',
      type: 'bar',
      data: [5, 20, 36, 10, 10, 20]
    }
  ]
};
myChartall.setOption(option);-------第二种方式

二、地图绘制

2.1下载地图的Json文件

第一种方法:DATAV.GeoAtlas:是阿里推出的一个用于获取全国、各省、各市以及个县级市详细地图信息的json文件。
第二种方法:最新全国省市区县geoJSON格式的地图数据,可直接用于echarts地图展示:https://github.com/lyhmyd1211/GeoMapData_CN

  • 全国地图: china
  • 全国各省地图:province
  • 全国各市地图:city
  • 全国各区县地图:county

2.2下载好的JSON文件在项目中的使用(本文以山西省为例,山西省都是14开头的JSON文件)

在项目中的使用

2.3vue页面展示省地图

2.3.1引入外部资源文件
首先将140000.json文件引入到项目当中去。我的项目当中的public文件路径配置是这样的。
在这里插入图片描述
2.3.2vue页面html部分

<template>
  <div class="main">
    <h1 style="font-weight: 600; font-size: 20px">
      山西省各市地区供电所数量分布情况
    </h1>
    <el-button type="text" @click.native="onBack">{{
      "山西省" + this.cityName + this.countyName
    }}</el-button>
    <div id="main" ref="shanxi" class="map"></div>
  </div>
</template>

2.3.3地图展示需要引入的js文件

import * as echarts from "echarts";
import shanxiJson from "../../../../public/json/140000.json";
import axios from "axios";

2.3.4省地图实现

 fn() {
      var that = this;
      //   var myChart = echarts.init(document.getElementById("main"));
      that.myChart = echarts.init(this.$refs.shanxi);
      echarts.registerMap("shanxi", shanxiJson); //
      that.mapData = shanxiJson.features.map((item, index) => {
        return {
          name: item.properties.name,
          value: Math.floor(Math.random() * 200) + 50,
          id: item.id,
          level: item.properties.level,
          cityCode: item.properties.adcode,
        };
      });
      that.myChart.setOption(
        {
          //数据映射
          visualMap: {
            type: "piecewise", //分段标签
            min: 50, //最小值
            max: 200, //最大值,不设置为无限大
            right: 0, //距离右侧位置
            bottom: 50, //距离底部位置
            orient: "vertical", //组件竖直放置
            align: "left", //色块在左
            textGap: 11, //文字主体之间的距离
            itemSymbol: "circle", //右下角映射组件使用圆点形状
            show: true,
            seriesIndex: 0, //指定取哪个系列的数据(series.data),若不设置则会影响图上标点颜色设置。
            //一以下是分段式视觉映射组件的每一段的范围
            //gt:大于、gte:大于等于、lt:小于、lte:小于等于。
            pieces: [
              {
                gt: 150,
                label: "150个以上",
                color: "#427d7a",
              },
              {
                gte: 100,
                lte: 150,
                label: "100-150个",
                color: "#4a8a87",
              },
              {
                gte: 50,
                lte: 100,
                label: "50-100个",
                color: "#59a3a0",
              },
            ],
          },
          // 提示浮窗样式
          tooltip: {
            show: true,
            trigger: "item", // 设置该属性之后,会与series中data数据对应。注意data中对象的键名为name。如果单纯的展示数据可用此属性,不与formatter同用。
            alwaysShowContent: false,
            backgroundColor: "#427d7a",
            borderColor: "rgba(0, 0, 0, 0.16);",
            hideDelay: 100,
            triggerOn: "mousemove",
            enterable: true,
            textStyle: {
              color: "#DADADA",
              fontSize: "12",
              width: 20,
              height: 30,
              overflow: "break",
            },
            formatter(params) {
              return `${params.data.name + ":"}</br>供电所数量:${
                params.data.value
              }`;
            },
            showDelay: 100,
          },
          geo: {
            map: "shanxi",
            type: "map",
            center: [104.114129, 37.550339], //当前视角的中心点
            zoom: 1, //当前视角的缩放比例
          },
          series: [
            {
              name: "shanxi",
              type: "map",
              roam: false,
              mapType: "shanxi",
              data: that.mapData,
              layoutCenter: ["50%", "50%"],
              layoutSize: "92%",
              itemStyle: {
                normal: {
                  show: true,
                  areaColor: "#59a3a0",
                },
              },
              emphasis: {
                itemStyle: {
                  show: true,
                  areaColor: "#2b6461", //鼠标滑过区域颜色
                },
                label: {
                  show: true,
                  textStyle: {
                    color: "#fff", //鼠标经过字体颜色
                  },
                },
              },
              select: {
                // 地图选中区域样式
                label: {
                  // 选中区域的label(文字)样式
                  color: "#fff",
                },
                itemStyle: {
                  // 选中区域的默认样式
                  areaColor: "#2b6461",
                },
              },
              label: {
                normal: {
                  show: true,
                  textStyle: {
                    color: "#000",
                  },
                },
              },
            },
          ],
        },
        true
      );
      //点击某市地图,加载渲染当前某城市地图
      that.myChart.on("click", function (params) {
        let cityname = params.data.name;
        that.cityName = "—" + cityname;
        localStorage.setItem("cityname", JSON.stringify(that.cityName));
        if (!cityname) {
          that.$message({
            message: "无此区域地图显示",
            type: "warning",
            duration: 1300,
          });
        } else if (that.cityList.indexOf(cityname) == -1) {
          return;
        } else {
          that.shiji(params.data.id, cityname);
        }
      });
    },

2.3.5山西省地图鼠标单击下钻和右击返回的实现方法

 async shiji(cityId, cityname) {
      var that = this;
      this.orgmap();
      axios.get("./json/" + cityId + ".json").then((response) => {
        that.myChart = echarts.init(this.$refs.shanxi);
        // 重新生成地图的Json数据
        echarts.registerMap(cityname, response);
        that.cityData = response.features.map((item, index) => {
          return {
            name: item.properties.name,
            value: Math.floor(Math.random() * 100) + 50,
            id: "1",
            level: item.properties.level,
            cityCode: item.properties.adcode,
          };
        });
        that.myChart.setOption({
          series: [
            {
              name: "cityMap",
              type: "map",
              roam: false,
              data: that.cityData,
              mapType: cityname,
              layoutCenter: ["48%", "50%"],
              layoutSize: "68%",
            },
          ],
        });
        //县级地区左键点击事件
        that.myChart.on("click", function (params) {
          if (!cityname) {
            that.$message({
              message: "无此区域地图显示",
              type: "warning",
              duration: 1300,
            });
          }
        });
        let chartBox = this.$refs.shanxi;
        chartBox.oncontextmenu = function () {
          return false;
        }; //阻止浏览器指定区域的右键默认事件
        that.myChart.on("contextmenu", (params) => {
          that.onBack();
        });
      });
    },
    // 地图返回上一级地图事件
    onBack() {
      this.cityName = "";
      setTimeout(() => {
        this.fn();
      }, 100);
    },
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vue3-datav-echarts 是一个基于 Vue 3 和 DataV 平台的可视化模板。它的主要特点包括: 1. 开箱即用:vue3-datav-echarts 提供了丰富的预设模板和组件,方便快速构建各种类型的数据可视化页面。无需从头开始编写代码,只需要按照需求选择合适的模板和组件进行配置即可。 2. 强大的图表库支持:通过引入 echarts 图表库,vue3-datav-echarts 提供了各种类型的图表组件,包括折线图、柱状图、饼图等。用户可以根据自己的需求选择合适的图表组件进行数据展示和分析。 3. 丰富的交互功能:vue3-datav-echarts 提供了多种交互功能,例如数据筛选、数据排序、图表联动等。用户可以通过这些功能与图表进行交互,实时查看和分析数据的变化,提升用户体验。 4. 可定制性:vue3-datav-echarts 具有良好的拓展性和可定制性。用户可以根据自己的需求进行定制化开发,添加自定义的图表组件或功能模块,满足特定的业务需求。 5. 数据可视化的最佳实践:vue3-datav-echarts 遵循了数据可视化的最佳实践,提供了合理的默认配置和样式,帮助用户快速搭建美观、易于理解的可视化界面。 总之,vue3-datav-echarts 是一个功能强大、易用性高的可视化模板,为用户提供了丰富的图表组件、交互功能和定制化选项,帮助用户快速构建高质量的数据可视化页面。无论是数据分析、业务报表还是仪表盘展示,都可以得到很好的支持和效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值