echarts分裂地图与线性动画

2023-11-14

前言

      如果没有geoJSON数据,可以去 datav官网 导出

定义数据结构

const pointsDataArr = [
     {
          name: '鄂州', // 展示的名称
          routeName: [
            {
              region: '黄冈',
              lable: '黄冈线',
              value: 10
            }
          ], // 路线
          value: [114.89, 30.34], // title显示的经纬度
          id: 'ez', // geo对应id
          fileName: '420700_ez', // geoJSON 文件名
        position:{
          left: '10%',
          top: 0
        },
          markerArr: [{ sectionName: '鄂州电厂', value: [114.60, 30.16] }] // marker
        },
        {
          name: '黄冈',
          routeName: [
            {
              region: '黄石',
              lable: '黄石线',
              value: 10
            },
            {
              region: '鄂州',
              lable: '鄂州线',
              value: 10
            }
          ],
        position:{
          left: '10%',
          top: 0
        },
          value: [115.4, 30.8],
          id: 'hg',
          fileName: '421100_hg',
          markerArr: []
        },
        {
          name: '黄石',
          routeName: [
            {
              region: '鄂州',
              lable: '鄂州线',
              value: 10
            }
          ],
        position:{
          left: '10%',
          top: 0
        },
          value: [115.03, 30],
          id: 'hs',
          fileName: '420200_hs',
          markerArr: [{ sectionName: '西塞山电厂', value: [115.10, 29.76] }]
        }
      ]

一、初始化在echarts中导入地图数据

this.myCharts = echarts.init(this.$refs.map); // 初始化
/*
   引入geoJSON
  @params(id,geoJSON地图数据)
*/
pointsDataArr.forEach(item => {
   this.myCharts.registerMap(
      item.id, { geoJSON:require(`@/assets/geoJson/${item.fileName}.json`
    ) 
})

 echarts.registerMap('hg', { geoJSON: require(`@/assets/geoJson/${item.fileName}.json`) });
 echarts.registerMap('wh', { geoJSON: require(`@/assets/geoJson/${item.fileName}.json`) });

// 处理geo数据
const geo = []
pointsDataArr.forEach((item,index) => {
    geo.push({
        id:item.id, // 这里的id与echarts.registerMap方法中的id对应
        name: item.id,
        zlevel: index, // 防止都在一层 卡顿
        map: item.id, 
        roam: false, // 禁止拖拽和放大
        geoIndex: index, // 地图索引
        zoom: 0.7, // 级别
        ...item.position, // 避免几个地图都在一起
        label: {
          normal: { // 静态的时候展示样式
            show: false // 是否显示地图省份得名称
          },
          emphasis: {
            show: false // 隐藏悬浮显示地区文字
          }
        },
        itemStyle: {
          normal: {
            color: '#386935', // 地图背景色
            borderColor: '#5D8646', // 省市边界线00fcff 516a89
            areaColor: '#386935', // 地图背景色
            borderWidth: 1,
            shadowBlur: 1,
            shadowColor: '#386935',
            shadowOffsetX: 5,
            shadowOffsetY: 10
          },
          emphasis: {
            color: '#386935' // 悬浮背景
          }
        }
    })
})

2、由于地图都是分开的,会导致经纬度不准确,这里做一个经纬度与px的转换

// 注意 要首先 myCharts.setOption(option) 才能获取 convertFromPixel api

// 经纬度转像素 像素在转经纬度
 lonLatCutpixel(lonLat, pixelInfo) {
  // 坐标转换为像素坐标 geoIndex 对应这geo
   const pixel = this.myCharts.convertToPixel(
     pixelInfo,
     lonLat
   );
    // 统一根据第一个geo来换算  geoIndex 对应这上面定义的
    const point = this.myCharts.convertFromPixel({ geoIndex: 0 }, pixel);
    return point;
 },

3、画线段性动画

 const linesData = {
        type: 'lines',
        zlevel: 99,
        effect: {
          show: true,
          period: 3, // 箭头指向速度,值越小速度越快
          trailLength: 0, // 特效尾迹长度[0,1]值越大,尾迹越长重
          symbol: 'triangle', // 箭头图标
          symbolSize: 14, // 图标大小
          color: '#fff'
        },
        selectedMode: 'single', // 开启单机点中
        select: { // 选中后的样式
          lineStyle: {
            color: 'red',
            width: 3
          }
        },
        label: { // 线中间的数据 title
          show: true,
          formatter: (params) => `${params.data.lable}\n{a|${params.data.value}}`,
          rich: {
            a: {
              align: 'left',
              color: 'rgb(207, 78, 178)',
              padding: [4, 10, 0, 10],
              lineHeight: 30,
              height: 18,
              backgroundColor: 'rgb(32, 66, 17)',
              fontSize: 16,
              borderRadius: 4
            }
          },
          opacity: 1,
          verticalAlign: 'middle', // 是否在线的中间
          position: 'middle', // 在线的中间 可以旋转
          textStyle: {
            color: '#fff',
            fontSize: 20
          }
        },
        lineStyle: {
          normal: {
            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
              {
                offset: 0,
                color: '#61CB34'
              },
              {
                offset: 0.9,
                color: '#61CB3410'
              },
              {
                offset: 1,
                color: '#61CB34'
              }
            ]),
            width: 2, // 线条宽度
            curveness: 0.2 // 尾迹线条曲直度
          },
          emphasis: {
            color: 'yellow' // 悬浮背景
          }
        },
        data: this.convertData() // 此方法在下面定义 处理多个地图连接 坐标问题
      };
    // 处理经纬度偏移  lonLatCutpixel 方法在 2 中定义过了
    convertData() {
      const res = [];
      this.pointsDataArr.forEach((item, index) => {
        // 坐标转换为像素坐标 geoIndex 对应这geo 开始
        const startingPoint = this.lonLatCutpixel(item.value, { geoIndex: index });

        item.routeName.forEach((val) => {
          let originaLonlat = null;
          let originaIndex = 0;
          let info = {};
          // 得到结束线的经纬度
          this.pointsDataArr.forEach((key, i) => {
            if (key.name === val.region) {
              originaLonlat = key.value;
              originaIndex = i;
              info = val;
            }
          });
          // 坐标转换为像素坐标 geoIndex 对应这geo (结束)
          const endingPoint = this.lonLatCutpixel(originaLonlat, { geoIndex: originaIndex         
           });
          res.push({
            coords: [startingPoint, endingPoint],
            ...info
          });
        });
      });
      return res;
    },

 4、画闪动圆点

       const arr = [];
       this.pointsDataArr.forEach((val, index) => {
        // 换算经纬度
        const lonLat = this.lonLatCutpixel(val.value, { geoIndex: index });
        arr.push({
          name: val.name,
          value: lonLat
        });
      });
      const pointsData = {
        type: 'effectScatter',
        coordinateSystem: 'geo',
        zlevel: 10,
        showEffectOn: 'render',
        rippleEffect: { // 设置圆点动画
          color: '#61CB34',
          number: 1,
          period: 1,
          scale: 2,
          brushType: 'fill'
        },
        hoverAnimation: true, // 启动动画
        label: { // 圆点上面的标题
          normal: {
            formatter: '{b}',
            position: 'top',
            offset: [0, 0],
            color: '#fff',
            show: true,
            fontSize: 26
          }
        },
        symbol: 'circle',
        symbolSize: 30,
        itemStyle: {
          normal: {
            color: '#61CB34',
            shadowBlur: 10,
            shadowColor: '#61CB34'
          }
        },
        data: arr
      };

5、引入每个模块 setOption

   setOption() {
      if (this.myCharts) {
        this.myCharts.clear();
        this.myCharts = null;
      }
      this.myCharts = echarts.init(this.$refs.map);
      // @params (与geo里面的id对应,{geoJSON数据})
      this.pointsDataArr.forEach((item) => {
        // eslint-disable-next-line import/no-dynamic-require
        echarts.registerMap(item.id, { geoJSON: require(`@/assets/geoJson/${item.fileName}.json`) });
      });
      const option = {
        backgroundColor: 'rgba(0,0,0,0)',
        tooltip: {
          show: false
          // trigger: 'item',
          // backgroundColor: 'rgba(120, 147, 222, 0.5)',
          // borderColor: '#fff',
          // formatter: (params) => {
          //   if (params.name) {
          //     return params.name;
          //   }
          //   return params.value;
          // },
          // enterable: true,
          // padding: [0, 10],
          // textStyle: { color: '#fff' }
        },
        xAxis: {
          show: false
        },
        yAxis: {
          show: false
        },
        // visualMap: {
        //   type: 'continuous',
        //   realtime: false,
        //   calculable: true
        // },
        geo: geo,
        series: []
      };
      // 先注册一遍 这样才能使用 echarts转换经纬度的api
      this.myCharts.setOption(option);
      option.series = [
        linesData,
        pointsData
      ];
      this.myCharts.setOption(option);
      // 添加点击事件
      this.myCharts.on('click', (e) => {
        console.log(e);
      });
      // 默认选中第一条线
      this.myCharts.dispatchAction({
        type: 'select',
        dataIndex: 0
      });
      this.myCharts.on('selectchanged', (params) => {
        // 不让取消选中
        if (params.fromAction === 'unselect') {
          this.myCharts.dispatchAction({
            type: 'select',
            dataIndex: params.fromActionPayload.dataIndexInside
          });
        }
      });
    }

效果图如下


 

 

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

echarts分裂地图与线性动画 的相关文章

随机推荐

  • 应用程序体系结构

    应用程序体系结构 在 web 应用程序中 有两个互相通信的不同的程序 一个是运行在用户主机上的浏览器程序 另一个是运行在 web 服务器主机上的 web 服务器程序 应用程序体系结构 由应用程序研发者设计 规定了如何在各种端系统上组织该应用
  • 为什么闹钟设置了却不响_手机闹钟不响是怎么回事

    手机由之前的老款式手机发展到了现在的4G大屏手机 这就是时代进步的见证 手机有很多的功能 但是今天小编给大家介绍的这个功能虽说不是什么高科技的功能 但是它确实最实用的 尤其是对于我们这些每天工作或者学习的人来说 这款软件就是闹钟了 大家一定
  • 京东姚霆:推理能力,正是多模态技术未来亟需突破的瓶颈!

    受访者 姚霆 京东 AI 研究院算法科学家 记者 夕颜 来源 CSDN ID CSDNnews 21 世纪 没有谁不知道电商 工资可以不发 但是每个月不网购几单 那是不可能的 打开熟悉的购物 App 在搜索栏输入想要买的东西 有时候你会发现
  • Python3.7+ Django2安装数据库(MySQL)依赖

    Django连接MySQL需要依赖以下库 pymysql mysqlclient 安装方法如下 pip install pymysql pip install mysqlclient 如果执行失败就参考后面的解决方法 注意 在安装mysql
  • 结构图的3D渲染,从COMSOL到Solidworks

    2022 02 23 在COMSOL 中 1 确认COMSOL中模型尺寸的单位是 mm 2 确认 几何 窗口的长度单位是 mm 3 右键 几何 下拉后选择 导出 选择文件类型 STEP文件 选择 导出所选对象 确认输出路径后 点击 导出 在
  • License授权方案

    源码地址 https github com sixj0 license 解决的问题 将项目卖给其他公司 需要将jar包在客户的服务器上部署 为了避免客户将项目jar包进行二次售卖 或者我们需要控制项目的使用期限 比如控制项目只能运行一年 这
  • Windows中PostgreSQL数据库的备份和还原

    1 备份 通过cmd命令窗口进入到PostgreSQL安装目录下的bin目录下 然后 输入以下命令 2 还原 也是通过cmd命令窗口进入到PostgreSQL安装目录下的bin目录下 然后输入以下命令即可 但在还原数据库之前 需要提前建立一
  • 系统架构设计高级技能 · 系统质量属性与架构评估

    系列文章目录 系统架构设计高级技能 软件架构概念 架构风格 ABSD 架构复用 DSSA 一 系统架构设计师 系统架构设计高级技能 系统质量属性与架构评估 二 系统架构设计师 系统架构设计高级技能 软件可靠性分析与设计 三 系统架构设计师
  • Spring @Async:SpringBoot 自定义线程池,修改springboot的默认线程池

    1 自定义线程池 1 1 修改application properties task pool corePoolSize 20 task pool maxPoolSize 40 task pool keepAliveSeconds 300
  • AD17铺铜时颜色偏暗

    AD17铺铜是颜色很暗 刚开始接触AD17时 使用起来很不熟练 铺铜是遇到了这个问题 正确的样子是如图一所示 偏暗的样子是如图二所示 图一 图二 如何解决这个问题呢 只需要简单一步就可以 将工具栏上的Altium transparent 2
  • MATLAB 学习资料整理

    MATLAB学习资料集合 https www ilovematlab cn thread 265500 1 1 html MATLAB官网文档 https ww2 mathworks cn help matlab index html MA
  • VBA第二种方法实现对比

    Sub check Click Dim ws1 As Worksheet ws2 As Worksheet Dim r1 As Range r2 As Range Dim cell1 As Range cell2 As Range Dim
  • opencv只能用python2不能用python3

    问题如图 感觉可以修改某个环境变量来调整 但是我不会 只好用笨办法了 下载了python3支持的opencv版本
  • 426 将二叉搜索树转化为排序的双向链表

    题目描述 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 对于双向循环列表 你可以将左右孩子指针作为双向循环链表的前驱和后继指针 第一个节点的前驱是最后一个节点 最后一个节点的后继是第一个节点 特别地 我们希望可以 就地 完成转换
  • windows下写入文本换行符\r\n修改为linux下换行符\n

    最近一段时间经常使用python向文本写入数据 但是windows下换行符默认为 r n 而linux下换行符为 n 写入的文本要在linux下调用 这就很坑人了 代码前行的路上怎么能被小小石头绊倒 于是乎搜索了一通 发现这个事情仅需要几行
  • Latex 带圈数字

    我们写作大论文等中文文档 一般都会调用ctex类库 可能描述不准确 它一般已经调用了fontspec 带圈的数字0 20 在unicode字符集中已经有了 但是只有一部分字体包含了 比如 Cambria 所以我们使用带圈文字的时候 直接调用
  • tcym4

    aHR0cHM6Ly93d3cudmVyeWJpbi5jb20vPzQzZjZiYThlYTU5NzcxZGEjeVhtbjN5em43YVVPLzlKYUVrK3JWdWE3SXA2ck9HWHlock5BbkFzL2hyaz0 复制下方
  • CTFHub-WEB-文件上传

    目录 1 无限制 2 前端验证 编辑 3 htaccess 4 MIME验证 5 文件头检查 6 00截断 7 双写后缀 1 无限制 进入靶场环境中看到有上传文件的选项 本关写明无限制所以我们直接上传php后门文件 上传成功后用蚁剑连接 这
  • JVM深入理解内部类

    原文链接 https blog csdn net Hacker ZhiDian article details 82193100 原文链接 https blog csdn net coder what article details 893
  • echarts分裂地图与线性动画

    前言 如果没有geoJSON数据 可以去 datav官网 导出 定义数据结构 const pointsDataArr name 鄂州 展示的名称 routeName region 黄冈 lable 黄冈线 value 10 路线 value