若依框架Ruoyi-vue整合图表Echarts中国地图标注动态数据

news2025/5/9 15:46:52

若依框架Ruoyi-vue整合图表Echarts中国地图

  • 概述
  • 创作灵感
  • 预期效果
  • 整合教程
    • 前期准备
    • 整合若依框架
      • 1、引入china.json
      • 2、方法
      • 3、data演示数据
      • 4、核心代码
    • 完整代码[毫无保留]
    • 组件调用
  • 总结

概述

首先,我需要回忆之前给出的回答,确保这次的内容不重复,但又能补充关键注意事项。之前已经提到了版本兼容性、跨域问题、性能优化和权限控制,这些可能需要进一步细化。

接下来,用户的需求可能包括如何正确引入地图数据、处理注册问题、地图显示不出来的常见原因,数据格式是否正确,以及如何优化性能等。另外,用户可能还关心地图的更新策略,比如动态数据加载时的注意事项,以及如何保持代码的可维护性。

需要考虑到用户可能在使用Vue时的特殊问题,比如组件销毁时如何正确释放ECharts实例以避免内存泄漏,响应式布局的处理,还有地图JSON文件的正确引入方式。另外,中国地图的JSON文件可能需要从官方渠道获取,避免使用过时或错误的版本,这点也很重要。

还要注意ECharts的地图注册方法,确保在Vue组件中正确注册,可能需要使用echarts.registerMap。同时,用户可能遇到的地图显示空白的问题,可能和容器大小有关,或者没有在mounted钩子中初始化图表,这些都需要提到。

另外,数据格式方面,需要确保传给ECharts的数据是符合要求的数组结构,每个数据项包含name和value,这也是常见的问题点。动态数据更新时,是否需要销毁旧实例或重用实例,避免内存泄漏。

创作灵感

工程项目管理系统少不了动态图表显示,若依框架Ruoyi-vue整合图表Echarts中国地图来自开源项目的功能扩展:
开源地址:https://gitee.com/xnqysabout/ry-vue-flowable-xg

开源不易,您的 star 将是我们动力的源泉!

预期效果

在这里插入图片描述

整合教程

前期准备

在Echart demo集网址:https://www.isqqw.com选择适合自己的地图图表 demo,主要是用到 option,通过GeoJSON资源在线查询、下载工具下载 china.json 文件
在这里插入图片描述

const option = {
   backgroundColor: '#101c5e',
   tooltip: {
      trigger: "item",
      formatter: function (params, ticket, callback) {
         if (params.seriesType == "scatter") {
            return "线路:" + params.data.name + "" + params.data.value[2];
         } else if (params.seriesType == "lines") {
            return (
               params.data.fromName +
               ">" +
               params.data.toName +
               "<br />" +
               params.data.value
            );
         }
      }
   },
   visualMap: {
      show: false,
      min: 0,
      max: 100,
      left: 'left',
      top: 'bottom',
      text: ['高', '低'], // 文本,默认为数值文本
      calculable: true,
      seriesIndex: [1],
      inRange: {
         color: ['#004693'] // 蓝绿
      }
   },
   geo: [
      {
         map: 'china',
         zoom: 1.25,
         z: 70,
         top: '100px',
         selected: false,
         label: {
            show: true,
            padding: 4,
            color: '#ddd',
            fontFamily: 'pf-zh'
         },
         itemStyle: {
            areaColor: '#0c4c91',
            borderColor: 'rgba(147,234,245,.5)',
            borderWidth: 1
         },
         emphasis: {
            disabled: true
         },
         regions: [
            {
               name: '南海诸岛',
               emphasis: {
                  disabled: true
               },
               itemStyle: {
                  borderWidth: 1
               }
            }
         ]
      }
   ],
   series: [
      {
         type: 'map',
         map: 'china',
         geoIndex: 0,
         roam: true,
         aspectScale: 0.75, //长宽比
         showLegendSymbol: false, // 存在legend时显示
         label: {
            normal: {
               show: true
            },
            emphasis: {
               show: false,
               textStyle: {
                  color: '#fff'
               }
            }
         },
         itemStyle: {
            normal: {
               areaColor: '#031525',
               borderColor: '#3B5077'
            },
            emphasis: {
               areaColor: '#2B91B7'
            }
         },
         animation: false,
         data: data
      },
      // 散点
      {
         name: '散点',
         type: 'scatter',
         coordinateSystem: 'geo',
         symbolSize: 5,
         label: {
            normal: {
               show: false,
               position: 'right'
            }
         },
         itemStyle: {
            normal: {
               color: 'red'
            }
         },
         zlevel: 10,
         data: data
      },
      {
         name: '点',
         type: 'scatter',
         coordinateSystem: 'geo',
         symbol: 'pin', //气泡
         symbolSize: function (val) {
            return 40
         },
         label: {
            show: true,
            formatter: function (parm) {
               return parm.value[4]
            },
            textStyle: {
               color: '#fff'
            }
         },
         itemStyle: {
            color: '#F62157' //标志颜色
         },
         zlevel: 6,
         data: data
      },
   ]
}

我们需要将 option 塞到若依已有的 echarts this.chart.setOption(option)

整合若依框架

思路:结合若依框架自带的 echarts 图表组件,我们直接复制一个 demo,将上面的 option 替换掉模板里的 option

1、引入china.json

首先引入 china.json

import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '../mixins/resize'
// GeoJSON资源在线查询、下载工具
import chinaJson from '../mixins/china.json'

2、方法

initChart() {
  const option = {
   //复制上面的 option
   ...
}
}

3、data演示数据

// 放到 initChart()
let data = [
   {
      name: "北京",
      value: [116.405285, 39.904989, 116.405285, 39.904989, 49]
   },
   {
      name: "天津",
      value: [117.190182, 39.125596, 117.190182, 39.125596, 18]
   },
   {
      name: "河北",
      value: [114.502461, 38.045474, 114.502461, 38.045474, 97]
   },
   {
      name: "山西",
      value: [112.549248, 37.857014, 112.549248, 37.857014, 85]
   },
   {
      name: "内蒙古",
      value: [111.670801, 40.818311, 111.670801, 40.818311, 83]
   },

]

4、核心代码

// 防止重复初始化
      if (this.isChartInitialized) return
      this.isChartInitialized = true

      if (!this.$el) return

      // this.chart = echarts.init(this.$el, 'macarons')
      // this.chart.showLoading()

      // 校验地理数据
      if (!this.geoJsonData) {
        this.geoJsonData = chinaJson
      }

      if (!this.geoJsonData || !this.geoJsonData.features) {
        throw new Error('Invalid or missing geoJson data')
      }

      // 注册地图
      if (!echarts.getMap(MAP_NAME)) {
        echarts.registerMap(MAP_NAME, this.geoJsonData)
      }

      this.chart.setOption(option)

完整代码[毫无保留]

十年磨一剑!🌹🌹🌹🌹
冰冻三尺非一日之寒!🤣🤣🤣🤣🤣🤣
最好的内容是产品,最好的产品是体验、服务、信用!👍
授之以渔不入授之鱼🤣🤣🤣🤣🤣🤣
更多开源请登录网址 www.xnqys.com

<template>
  <div :class="className" :style="{ height: height, width: width }"/>
</template>

<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
import resize from '../mixins/resize'
import chinaJson from '../json/china.json'

const MAP_NAME = 'china'

export default {
  mixins: [resize],
  props: {
    className: {
      type: String,
      default: 'chart'
    },
    width: {
      type: String,
      default: '100%'
    },
    height: {
      type: String,
      default: '500px'
    }
  },
  data() {
    return {
      chart: null,
      _initChartPending: false
    }
  },
  mounted() {
    this._initChartPending = true
    this.$nextTick(() => {
      if (this._initChartPending) {
        this.initChart()
      }
    })
  },
  beforeDestroy() {
    this._initChartPending = false
    if (!this.chart) {
      return
    }
    this.chart.dispose()
    this.chart = null
  },
  methods: {
    initChart() {
      this.chart = echarts.init(this.$el, 'macarons')

      const data = [
        {
          name: "北京",
          value: [116.405285, 39.904989, 454]
        },
        {
          name: "内蒙古",
          value: [111.670801, 40.818311, 399]
        },
        {
          name: "青海",
          value: [96.778916, 36.123178, 59]
        },
        {
          name: "新疆",
          value: [85.617733, 41.792818, 19]
        },
        {
          name: "云南",
          value: [101.712251, 24.040609, 19]
        }
      ]

      const option = {
        title: {
          text: '工程项目全国分布图',
          subtext: 'Data from Wikipedia'
        },
        tooltip: {
          trigger: "item",
          formatter: function (params) {
            if (!params || !params.data) return '0'
            if (params.seriesType === "scatter") {
              return params.data.name + "项目数量:" + (params.data.value?.[2] || '') + '个'
            } else if (params.seriesType === "lines") {
              return (
                (params.data.fromName || '') +
                ">" +
                (params.data.toName || '') +
                "<br />" +
                (params.data.value || '')
              )
            }
            return ''
          }
        },
        visualMap: {
          show: true,
          min: 0,
          max: 500,
          left: 'right',
          top: 'top',
          text: ['高', '低'],
          realtime: false,
          calculable: true,
          seriesIndex: [0],
          inRange: {
            color: ['lightskyblue', 'yellow', 'orangered']
          }

        },
        geo: [
          {
            map: 'china',
            zoom: 1,
            z: 70,
            top: '10px',
            selected: false,
            label: {
              show: true,
              padding: 4,
              color: '#000',
              fontFamily: 'pf-zh'
            },
            itemStyle: {
              areaColor: '#DCDFE6',
              borderColor: '#fff',
              borderWidth: 1
            },
            emphasis: {
              disabled: true
            },
            regions: [
              {
                name: '南海诸岛',
                emphasis: {
                  disabled: true
                },
                itemStyle: {
                  borderWidth: 1
                }
              }
            ]
          }
        ],
        series: [
          {
            type: 'map',
            map: 'china',
            geoIndex: 0,
            roam: true,
            aspectScale: 0.75,
            showLegendSymbol: false,
            label: {
              normal: {
                show: true
              },
              emphasis: {
                show: false,
                textStyle: {
                  color: '#2b2b2b'
                }
              }
            },
            itemStyle: {
              normal: {
                areaColor: '#031525',
                borderColor: '#3B5077'
              },
              emphasis: {
                areaColor: '#2B91B7'
              }
            },
            animation: false,
            data: JSON.parse(JSON.stringify(data))
          },
          {
            name: '散点',
            type: 'scatter',
            coordinateSystem: 'geo',
            symbolSize: 5,
            label: {
              normal: {
                show: false,
                position: 'right'
              }
            },
            itemStyle: {
              normal: {
                color: '#f00'
              }
            },
            zlevel: 10,
            data: JSON.parse(JSON.stringify(data))
          },
          {
            name: '点',
            type: 'scatter',
            coordinateSystem: 'geo',
            symbol: 'pin',
            symbolSize: () => 40,
            label: {
              show: true,
              formatter: function (parm) {
                return parm.value[2]
              },
              textStyle: {
                color: '#ff0'
              }
            },
            itemStyle: {
              color: '#F62157' //标志颜色
            },
            zlevel: 1,
            data: JSON.parse(JSON.stringify(data))
          }
        ]
      }

      // 防止重复初始化
      if (this.isChartInitialized) return
      this.isChartInitialized = true

      if (!this.$el) return

      // this.chart = echarts.init(this.$el, 'macarons')
      // this.chart.showLoading()

      // 校验地理数据
      if (!this.geoJsonData) {
        this.geoJsonData = chinaJson
      }

      if (!this.geoJsonData || !this.geoJsonData.features) {
        throw new Error('Invalid or missing geoJson data')
      }

      // 注册地图
      if (!echarts.getMap(MAP_NAME)) {
        echarts.registerMap(MAP_NAME, this.geoJsonData)
      }

      this.chart.setOption(option)
    }
  }
}
</script>

组件调用

参考若依框架index图表调用方法!

总结

整合过程中需注意版本兼容性、异步加载时序问题及图表性能优化,最终实现高效、灵活的数据可视化功能,满足企业级应用复杂需求。

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

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

相关文章

算法中的数学:约数

1.求一个整数的所有约数 对于一个整数x&#xff0c;他的其中一个约数若为i&#xff0c;那么x/i也是x的一个约数。而其中一个约数的大小一定小于等于根号x&#xff08;完全平方数则两个约数都为根号x&#xff09;&#xff0c;所以我们只需要遍历到根号x&#xff0c;然后计算出另…

[监控看板]Grafana+Prometheus+Exporter监控疑难排查

采用GrafanaPrometheusExporter监控MySQL时发现经常数据不即时同步&#xff0c;本示例也是本地搭建采用。 Prometheus面板 1&#xff0c;Detected a time difference of 11h 47m 22.337s between your browser and the server. You may see unexpected time-shifted query res…

LaTeX印刷体 字符与数学符号的总结

1. 希腊字母&#xff08;Greek Letters&#xff09; 名称小写 LaTeX大写 LaTeX显示效果Alpha\alphaAαα, AABeta\betaBββ, BBGamma\gamma\Gammaγγ, ΓΓDelta\delta\Deltaδδ, ΔΔTheta\theta\Thetaθθ, ΘΘPi\pi\Piππ, ΠΠSigma\sigma\Sigmaσσ, ΣΣOmega\omeg…

剥开 MP4 的 千层 “数字洋葱”:从外到内拆解通用媒体容器的核心

在当今数字化时代&#xff0c;MP4 格式随处可见&#xff0c;无论是在线视频、手机拍摄的短片&#xff0c;还是从各种渠道获取的音频视频文件&#xff0c;MP4 都占据着主流地位。它就像一个万能的 “数字媒体集装箱”&#xff0c;高效地整合和传输着各种视听内容。接下来&#x…

从彼得·蒂尔四象限看 Crypto「情绪变迁」:从密码朋克转向「标准化追求者」

作者&#xff1a;Techub 精选编译 撰文&#xff1a;Matti&#xff0c;Zee Prime Capital 编译&#xff1a;Yangz&#xff0c;Techub News 我又带着一篇受彼得蒂尔&#xff08;Peter Thiel&#xff09;启发的思想杂烩回来了。作为自封的「蒂尔学派」信徒&#xff0c;我常透过他…

Java线程安全问题深度解析与解决方案

一、线程安全问题的本质 并发编程的核心挑战&#xff1a;当多个线程同时访问共享资源时&#xff0c;由于操作系统的抢占式调度特性&#xff0c;可能导致不可预期的结果。这种因非原子操作和竞态条件引发的数据不一致问题&#xff0c;称为线程安全问题。 二、经典线程安全问题案…

Mybatis解决以某个字段存在,批量更新,不存在批量插入(高效)(一)

背景 在开发企业级应用时&#xff0c;我们经常需要处理批量数据的插入和更新操作。传统的逐条处理方式性能低下&#xff0c;而简单的REPLACE INTO或INSERT ... ON DUPLICATE KEY UPDATE在某些场景下又不够灵活。本文将介绍一种基于临时表的高效批量插入/更新方案&#xff0c;解…

【时时三省】(C语言基础)怎样定义和引用二维数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 有的问题需要用二维数组来处理。例如&#xff0c;有3个小分队&#xff0c;每队有6名队员&#xff0c;要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组&#xff0c;如下图&…

杨校老师竞赛课之C++备战蓝桥杯初级组省赛

目录 1. 灯塔 题目描述 输入描述 输出描述 输入样例1 输出样例1 输入样例2 输出样例2 数据说明 2. 子区间 题目描述 输入描述 输出描述 输入样例 输出样例 数据说明 3. 染色 题目描述 输入描述 输出描述 输入样例1 输出样例1 输入样例2 输出样例2 数据…

Matlab 基于Hough变换的人眼虹膜定位方法

1、内容简介 Matlab220-基于Hough变换的人眼虹膜定位方法 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

vfrom表单设计器使用事件机制控制字段显示隐藏

1. 使用表单设计器进行debug调试 依据 vform3.0开发者文档 https://www.ganweicloud.com/docs/6.1.0/pages/d3e6d9/ 对switch组件设置事件逻辑 调试中

【Redis篇】linux 7.6安装单机Redis7.0(参数优化详解)

&#x1f4ab;《博主主页》&#xff1a; &#x1f50e; CSDN主页 &#x1f50e; IF Club社区主页 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了…

信号的概念及产生

信号的概念 信号&#xff08;signal&#xff09;是一种软件中断机制&#xff0c;用于通知进程发生了特定的事件。信号可以由系统、其他进程或进程自身发送。 在现实生活中&#xff0c;也有许多的信号&#xff0c;比如说&#xff1a;红绿灯、闹钟、上课铃、父母喊你回家吃饭等等…

巧用python之--模仿PLC(PLC模拟器)

工作中用到了VM(VisionMaster4.3)有时候需要和PLC打交道,但是PLC毕竟是别人的,不方便修改别人的程序,这时候需要一个灵活的PLC模拟器是多么好呀! 先说背景: PLC型号 汇川Easy521: Modbus TCP 192.168.1.10:502 在汇川Easy521中Modbus保持寄存器D寄存器 ,在modbus协议中 0-4区…

【计算机网络】用户从输入网址到网页显示,期间发生了什么?

1.URL解析 浏览器分解URL&#xff1a;https://www.example.com/page 协议&#xff1a;https域名&#xff1a;www.example.com路径&#xff1a;/page 2.DNS查询&#xff1a; 浏览器向DNS服务器发送查询请求&#xff0c;将域名解析为对应的IP地址。 3.CDN检查(如果有)&#…

C++ 算法学习之旅:从入门到精通的秘籍

在编程的浩瀚宇宙中&#xff0c;C 算法宛如璀璨的星辰&#xff0c;照亮我们前行的道路。作为一名 C 算法小白&#xff0c;或许你和我一样&#xff0c;怀揣着对算法的好奇与憧憬&#xff0c;却又在学习的道路上感到迷茫。别担心&#xff0c;今天我就和大家分享一下如何学习各种基…

计算机网络常识:缓存、长短连接 网络初探、URL、客户端与服务端、域名操作 tcp 三次握手 四次挥手

缓存&#xff1a; 缓存是对cpu&#xff0c;内存的一个节约&#xff1a;节约的是网络带宽资源 节约服务器的性能 资源的每次下载和请求都会造成服务器的一个压力 减少网络对资源拉取的延迟 这个就是浏览器缓存的一个好处 表示这个html页面的返回是不要缓存的 忽略缓存 需要每次…

软件逆向工程核心技术:脱壳原理与实战分析

目录 一、脱壳技术概述&#xff1a;从保护到还原的逆向之旅 1.1 脱壳技术的本质与核心价值 1.2 壳的分类与核心技术解析 1.3 学习路径&#xff1a;从压缩壳到加密壳的渐进式突破 二、脱壳三步法&#xff1a;系统化逆向工程框架 2.1 核心流程总览 2.2 实战案例&#xff1…

华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式&#xff1b; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析&#xff1b; 本文收录于专栏&#xff1a;《2025华为OD真题目录…

【CTFer成长之路】举足轻重的信息搜集

举足轻重的信息搜集 信息搜集 常见的搜集 题目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{info_…