vue大屏开发系列—使用echart开发省市地图数据,并点击省获取市地图数据

news2024/11/25 16:41:19

1. 本文在基础上进行改进,后端使用若依后端

IofTV-Screen: 🔥一个基于 vue、datav、Echart 框架的物联网可视化(大屏展示)模板,提供数据动态刷新渲染、屏幕适应、数据滚动配置,内部图表自由替换、Mixins注入等功能,持续更新.... - Gitee.com

2.效果:将系统大屏显示地图

3. 使用开源项目IofTV-Screen中的Echart组件

<template>
  <div class="centermap">
    <div class="maptitle">
      <div class="zuo"></div>
      <span class="titletext">{{ maptitle }}</span>
      <div class="you"></div>
    </div>
    <div class="mapwrap">
      <dv-border-box-13>
        <div class="quanguo" @click="getData('china')" v-if="code !== 'china'">
          中国
        </div>
        <Echart id="CenterMap" :options="options" ref="CenterMap"/>
      </dv-border-box-13>
    </div>
  </div>
</template>

4. 安装并导入编码转文本组件

(1)安装

npm install element-china-area-data -S

(2)导入编码转文本组件,实现“610000” 转换为“陕西省”

import { CodeToText } from 'element-china-area-data'

5. 获取数据修改如下,前端代码其他代码不做变动

地图所需数据格式为

[{"name":"内蒙古自治区","value":25},

{"name":"河北省","value":6},

{"name":"陕西省","value":2}]

本文从后台获取的数据为{"msg":"操作成功","code":200,"list":[{"name":"内蒙古自治区","value":25},{"name":"河北省","value":6},{"name":"陕西省","value":2}]}

数据是数组对象,其中name为省市名称,value是数值


  methods: {
    getData(code) {
     
      let codeText=code
       if(code!='china')
         codeText = CodeToText[code];
      getProblemsByProvinceCity(codeText).then(res => {
        if (res.code == 200) {
          this.getGeojson(code, res.list);
          this.mapclick();
        } else {
          this.$Message.warning(res.msg)
        }

        }
      )
    },

6. 使用定时器轮询刷新

      //轮询
      switper() {
        if (this.timer) {
          return
        }
        let looper = (a) => {
           this.getData()
        };
        this.timer = setInterval(looper, this.$store.state.settings.echartsAutoTime);
      }

其中this.$store.state.settings.echartsAutoTime可替换成3000

7. provincecity.js增加api

// 查询用户数
export function getProvinceCityCount(code) {
  return request({
    url: '/system/provinceCity/getProvinceCityCount/' + code,
    method: 'get'
  })
}

8. 增加controller后端方法

/**
 * 统计省市问题数量
 */
@GetMapping("/getProvinceCityCount/{code}")
public AjaxResult getProblemsByProvinceCity(@PathVariable("code") String code) {

    AjaxResult ajax = AjaxResult.success();
    List<FProvinceCityCount> list=fProblemsService.countProblemsByProvinceCity(code);
    ajax.put("list", list);
    return ajax;
}

9. center-map前端最终代码

<template>
  <div class="centermap">
    <div class="maptitle">
      <div class="zuo"></div>
      <span class="titletext">{{ maptitle }}</span>
      <div class="you"></div>
    </div>
    <div class="mapwrap">
      <dv-border-box-13>
        <div class="quanguo" @click="getData('china')" v-if="code !== 'china'">
          中国
        </div>
        <Echart id="CenterMap" :options="options" ref="CenterMap"/>
      </dv-border-box-13>
    </div>
  </div>
</template>

<script>
import xzqCode from "../../../utils/bigScreen/map/xzqCode";
import {currentGET} from '@/api/bigScreen/modules'
import * as echarts from "echarts";
import { CodeToText } from 'element-china-area-data'

import {GETNOBASE} from '@/api/bigScreen/api'
import {getProblemsByProvinceCity} from "@/api/feedback/problems";

export default {
  data() {
    return {
      maptitle: "现场分布图",
      options: {},
      timer: null,
      code: "china", //china 代表中国 其他地市是行政编码
      echartBindClick: false,
      isSouthChinaSea: false, //是否要展示南海群岛  修改此值请刷新页面
    };
  },

  created() {
  },

  mounted() {
    // console.log(xzqCode);
    this.getData("china")
  },
  methods: {
    getData(code) {

      let codeText=code
       if(code!='china')
         codeText = CodeToText[code];
          console.log(code, codeText);
      getProblemsByProvinceCity(codeText).then(res => {
        if (res.code == 200) {
          console.log('设备分布2', res);
          this.getGeojson(code, res.list);
          this.mapclick();
        } else {
          this.$Message.warning(res.msg)
        }

        }
      )
    },
    //轮询
    switper() {
      if (this.timer) {
        return
      }
      let looper = (a) => {
        this.getData()
      };
      this.timer = setInterval(looper, this.$store.state.settings.echartsAutoTime);
    },
    async getGeojson(name, mydata) {
      this.code = name;
      //如果要展示南海群岛并且展示的是中国的话
      let geoname = name
      if (this.isSouthChinaSea && name == "china") {
        geoname = "chinaNanhai";
      }
      //如果有注册地图的话就不用再注册 了
      let mapjson = echarts.getMap(name);
      if (mapjson) {
        mapjson = mapjson.geoJSON;
      } else {
        mapjson = await GETNOBASE(`./map-geojson/${geoname}.json`).then((res) => {
          return res;
        });
        echarts.registerMap(name, mapjson);
      }
      let cityCenter = {};
      let arr = mapjson.features;
      //根据geojson获取省份中心点
      arr.map((item) => {
        cityCenter[item.properties.name] =
          item.properties.centroid || item.properties.center;
      });
      let newData = [];
      mydata.map((item) => {
        if (cityCenter[item.name]) {
          newData.push({
            name: item.name,
            value: cityCenter[item.name].concat(item.value),
          });
        }
      });
      this.init(name, mydata, newData);
    },
    init(name, data, data2) {
      let top = 45;
      let zoom = 1.05;
      if (name == "china") {
        top = 40;
        zoom = 1.05;
      }

      let option = {
        backgroundColor: "rgba(0,0,0,0)",
        tooltip: {
          show: false,
        },
        legend: {
          show: false,
        },
        visualMap: {
          left: 20,
          bottom: 20,
          pieces: [
            {gte: 1000, label: "1000个以上"}, // 不指定 max,表示 max 为无限大(Infinity)。
            {gte: 600, lte: 999, label: "600-999个"},
            {gte: 200, lte: 599, label: "200-599个"},
            {gte: 50, lte: 199, label: "49-199个"},
            {gte: 10, lte: 49, label: "10-49个"},
            {lte: 9, label: "1-9个"}, // 不指定 min,表示 min 为无限大(-Infinity)。
          ],
          inRange: {
            // 渐变颜色,从小到大
            color: [
              "#c3d7df",
              "#5cb3cc",
              "#8abcd1",
              "#66a9c9",
              "#2f90b9",
              "#1781b5",
            ],
          },
          textStyle: {
            color: "#fff",
          },
        },
        geo: {
          map: name,
          roam: false,
          selectedMode: false, //是否允许选中多个区域
          zoom: zoom,
          top: top,
          aspectScale: 0.78,
          tooltip: {
            show: false,
          },
          label: {
            show: false,
          }, //地图中文字内容及样式控制
          itemStyle: {
            areaColor: "rgba(0,0,0,0)",
            borderColor: "rgba(0,0,0,0)",
          },
          emphasis: {
            disabled: true,
          },
        },
        series: [
          {
            name: "MAP",
            type: "map",
            mapType: name,
            aspectScale: 0.78,
            data: data,
            // data: [1,100],

            selectedMode: false, //是否允许选中多个区域
            zoom: zoom,
            geoIndex: 1,
            top: top,
            tooltip: {
              show: true,
              formatter: function (params) {
                if (params.data) {
                  return params.name + ":" + params.data["value"];
                } else {
                  return params.name;
                }
              },
              backgroundColor: "rgba(0,0,0,.6)",
              borderColor: "rgba(147, 235, 248, .8)",
              textStyle: {
                color: "#FFF",
              },
            },
            label: {
              show: false,
              color: "#000",
              // position: [-10, 0],
              formatter: function (val) {
                // console.log(val)
                if (val.data !== undefined) {
                  return val.name.slice(0, 2);
                } else {
                  return "";
                }
              },
              rich: {},
              emphasis: {show: false},
            },
            itemStyle: {
              borderColor: "rgba(147, 235, 248, .8)",
              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, .3)",
              shadowOffsetX: -2,
              shadowOffsetY: 2,
              shadowBlur: 10,
              emphasis: {
                areaColor: "#389BB7",
                borderWidth: 1,
              },
            },
          },
          {
            data: data2,
            type: "effectScatter",
            coordinateSystem: "geo",
            symbolSize: function (val) {
              return 4;
              // return val[2] / 50;
            },
            legendHoverLink: true,
            showEffectOn: "render",
            rippleEffect: {
              // period: 4,
              scale: 6,
              color: "rgba(255,255,255, 1)",
              brushType: "fill",
            },
            tooltip: {
              show: true,
              formatter: function (params) {
                if (params.data) {
                  return params.name + ":" + params.data["value"][2];
                } else {
                  return params.name;
                }
              },
              backgroundColor: "rgba(0,0,0,.6)",
              borderColor: "rgba(147, 235, 248, .8)",
              textStyle: {
                color: "#FFF",
              },
            },
            label: {
              formatter: (param) => {
                return param.name.slice(0, 2);
              },

              fontSize: 11,
              offset: [0, 2],
              position: "bottom",
              textBorderColor: "#fff",
              textShadowColor: "#000",
              textShadowBlur: 10,
              textBorderWidth: 0,
              color: "#FFF",
              show: true,
            },
            // colorBy: "data",
            itemStyle: {
              color: "rgba(255,255,255,1)",
              borderColor: "rgba(2255,255,255,2)",
              borderWidth: 4,
              shadowColor: "#000",
              shadowBlur: 10,
            },
          },
        ],
      };
      this.options = option;
    },
    message(text) {
      this.$Message({
        text: text,
        type: 'warning'
      })
    },
    mapclick() {
      if (this.echartBindClick) return;
      //单击切换到级地图,当mapCode有值,说明可以切换到下级地图
      this.$refs.CenterMap.chart.on("click", (params) => {
        console.log("mapclick");
         console.log(params);
        let xzqData = xzqCode[params.name];
        console.log(xzqData);
        if (xzqData) {
          this.getData(xzqData.adcode);
        } else {
          this.message("暂无下级地市!");
        }
      });
      this.echartBindClick = true
    },
  },
};
</script>
<style lang='scss' scoped>
.centermap {
  margin-bottom: 30px;

  .maptitle {
    height: 60px;
    display: flex;
    justify-content: center;
    padding-top: 10px;
    box-sizing: border-box;

    .titletext {
      font-size: 28px;
      font-weight: 900;
      letter-spacing: 6px;
      background: linear-gradient(92deg,
        #0072ff 0%,
        #00eaff 48.8525390625%,
        #01aaff 100%);
      -webkit-background-clip: text;
      -webkit-text-fill-color: transparent;
      margin: 0 10px;
    }

    .zuo,
    .you {
      background-size: 100% 100%;
      width: 29px;
      height: 20px;
      margin-top: 8px;
    }

    .zuo {
      background: url("../../../assets/bigScreen/img/xiezuo.png") no-repeat;
    }

    .you {
      background: url("../../../assets/bigScreen/img/xieyou.png") no-repeat;
    }
  }

  .mapwrap {

    height: 548px;
    width: 100%;
    // padding: 0 0 10px 0;
    box-sizing: border-box;
    position: relative;

    .quanguo {
      position: absolute;
      right: 20px;
      top: -46px;
      width: 80px;
      height: 28px;
      border: 1px solid #00eded;
      border-radius: 10px;
      color: #00f7f6;
      text-align: center;
      line-height: 26px;
      letter-spacing: 6px;
      cursor: pointer;
      box-shadow: 0 2px 4px rgba(0, 237, 237, 0.5),
      0 0 6px rgba(0, 237, 237, 0.4);
    }
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS Array数组常用方法(附上相应的用法及示例)

会改变原数组的方法 1、array.push(需要在末尾添加的数据)【给数组末尾添加一个元素】 2、array.unshift(需要在首位添加的数据)【给数组首位添加一个元素】 3、array.pop()【从数组末尾删除元素,不需要传参】 4、array.shift()【从数组首位开始删除元素,不需要传参】 5、arra…

【算法与数据结构】5 常见的时间复杂度,你知道吗?

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越 时间复杂度与空间复杂度 一、前情回顾二、常见的时间复杂度1.常见的…

Day954.以增量演进为手段 -遗留系统现代化实战

以增量演进为手段 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于以增量演进为手段的内容。 遗留系统现代化中的 HOW&#xff0c;也就是第三个原则&#xff0c;以增量演进为手段。 很多团队在一阵大张旗鼓的遗留系统改造后&#xff0c;终于迎来了最终的“梭哈”时…

【线程同步】

一个大佬的笔记&#xff0c;比较详细 一、线程概述 1.线程概述 与进程&#xff08;process&#xff09;类似&#xff0c;线程&#xff08;thread&#xff09;是允许应用程序并发执行多个任务的一种机 制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同…

supervisor安装

说明 Supervisor翻译过来是监管人&#xff0c;在Linux中Supervisor是一个进程管理工具&#xff0c;当进程中断的时候Supervisor能自动重新启动它。可以运行在各种类Linux/unix的机器上&#xff0c;supervisor就是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通…

【别再困扰于LeetCode接雨水问题了 | 从暴力法=>动态规划=>单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Spring使用总结

Spring框架使用 前言处理事务管理声明式事务&#xff1a;编程式事务&#xff1a; 框架核心常见注解 AOP&#xff08; 面向切面编程&#xff09;切面和通知有哪些类型&#xff1f;切面的类型通知类型AOP实现使用场景 IOC(管理所有的JavaBean)依赖注入&#xff08;DI&#xff09;…

道氏转02,水羊转债,超达转债,晓鸣转债,中旗转债上市价格预测

道氏转02 基本信息 转债名称&#xff1a;道氏转02&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;26.0亿元。 正股名称&#xff1a;道氏技术&#xff0c;今日收盘价&#xff1a;13.41元&#xff0c;转股价格&#xff1a;15.46元。 当前转股价值 转债面值 / …

大数据三驾马车与hadoop起源

背景介绍 Google成立于1998年是全球最大的搜索引擎公司&#xff0c;主要业务为搜索、云计算、广告技术等&#xff0c;主要利润来自于广告等服务。在21世纪初互联网刚刚兴起&#xff0c;每个企业保存和生产的数据量并不大&#xff0c;已有的技术对数据的保存和处理完全满足业务…

RabbitMQ支持消息的模式

一、简单模式 Simple 二、工作模式 Work 类型&#xff1a;无特点&#xff1a;分发机制 解释&#xff1a;当有多个消费者时&#xff0c;我们的消息会被哪个消费者消费呢&#xff0c;我们又该如何均衡消费者消费信息的多少呢? 主要有两种模式&#xff1a; 2.1 轮询分发&#xf…

2023年江苏专转本成绩查询步骤

2023年江苏专转本成绩查询时间 2023年江苏专转本成绩查询时间预计在5月初&#xff0c;参加考试的考生&#xff0c;可以关注考试院发布的消息。江苏专转本考生可在规定时间内在省教育考试院网&#xff0c;在查询中心页面中输入准考证号和身份证号进行查询&#xff0c;或者拨…

IDEA的BitoAI插件的简单使用指南(包括安装和注册)

注&#xff1a;插件声称使用的是GPT-4模型算法&#xff0c;并且多平台支持&#xff0c;包括vscode、pycharm等&#xff0c;这里只演示idea的安装和使用 1.安装 直接在idea的插件商城中搜索即可 2.注册 使用bito插件需要使用邮箱注册&#xff0c;注册非常简单&#xff0c;只需要…

【一起撸个DL框架】2 节点与计算图的搭建

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 2 节点与计算图的搭建 &#x1f352;2.1 简介2.2 设计节点类2.3 节点类的具体实现2.4 搭建计算图进行计算2.5 小结2.6 题外话——节点存储的值 2 节点与计算图的搭建 &#x1f352; …

数据湖Iceberg-存储结构(2)

文章目录 存储结构数据文件 data files表快照 Snapshot清单列表 Manifest list清单文件 Manifest file 数据湖Iceberg-简介(1) 数据湖Iceberg-存储结构(2) 数据湖Iceberg-Hive集成Iceberg(3) 数据湖Iceberg-SparkSQL集成(4) 数据湖Iceberg-FlinkSQL集成(5) 数据湖Iceberg-Flink…

Redis入门到入土(day01)

NoSQL概述 为什么用NoSQL 1、单机MySQL的美好年代 在90年代&#xff0c;一个网站的访问量一般不大&#xff0c;用单个数据库完全可以轻松应付&#xff01; 在那个时候&#xff0c;更多的都是静态网页&#xff0c;动态交互类型的网站不多。 上述架构下&#xff0c;我们来看看…

一文详细介绍查看和启用nginx日志(access.log和error.log),nginx错误日志的安全级别,自定义访问日志中的格式

文章目录 1. 文章引言2. Nginx访问日志(access.log)2.1 简述访问日志2.2 启用Nginx访问日志2.3 自定义访问日志中的格式 3. Nginx错误日志(error.log)3.1 简述错误日志3.2 启用错误日志3.3 Nginx错误日志的安全级别 4. 文末总结 1. 文章引言 我们在实际工作中&#xff0c;经常使…

vue3中如何引入element-icon并使用

简单来说&#xff0c;步骤就是&#xff1a; 安装——注册——按需引入——使用 安装 # NPM $ npm install element-plus/icons-vue # Yarn $ yarn add element-plus/icons-vue # pnpm $ pnpm install element-plus/icons-vue注册 您需要从 element-plus/icons-vue 中导入所有…

【BI软件】零编程构建财务分析模型(行计算模型)

上一讲和大家讲到&#xff0c;自定义SQL是用个性化的开发去满足个性化的需求&#xff0c;而分析模型则是用共性的开发去满足个性化的需求。而分析模型的好处显而易见&#xff0c;通过分析模型来开发报表&#xff0c;更灵活、更高效&#xff0c;而且开发及运维的成本非常低。同时…

C++中引用的基本内容

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】 引用&#xff0c;其实没啥特别的&#xff0c;就是起外号&#xff0c;或者说起小名。就比如说孙悟空就有很多外号&#xff0c;如…

基于Python实现个人手机定位分析

TransBigData是一个为交通时空大数据处理、分析和可视化而开发的Python包。本文就来用它实现个人手机定位分析&#xff0c;感兴趣的小伙伴可以了解一下 但其实交通时空大数据并不仅仅局限于交通工具产生的数据&#xff0c;我们的日常生活中也会产生大量的数据。比如我们的手机…