【Echarts地图开发全流程加全套代码】

news2024/12/27 15:57:05

前言

本篇分享近期做的项目echarts相关地图开发的相关细节和避坑细节!!

一、地图Json文件

echarts地图采用官网的type类型map进行配置开发

Apache EChartsApache ECharts,一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。icon-default.png?t=O83Ahttps://echarts.apache.org/zh/index.html

渲染地图需要通过Json文件来渲染,那么JSON文件可以参考我的上一篇文章内容

二、地图开发过程

初始化

通过echarts配置项开发,首先我们需要一个容器来接收

    <div ref="mapRef" class="map"></div>

class类名可以设置这个容器的宽高比例等等

ref属性值用于我们初始化函数init地图,具体如下:

this.$nextTick(() => {
 this.chartRef = this.$echarts.init(this.$refs.mapRef)
        this.chartRef.setOption(option)
        window.addEventListener('resize', () => {
          this.chartRef.resize()
        })
}

在组件挂载时进行上面的操作,同时在组件销毁前进行相同的注销操作,特别是addEventListener

  beforeDestroy() {
    this.chartRef = this.$echarts.init(this.$refs.mapRef)
    window.removeEventListener('resize', () => {
      this.chartRef.resize()
    })
    this.chartRef.dispose()
    this.chartRef = null
  },

基础配置Options

在不同的业务场景会有不同的业务需求,基本的地图配置即可渲染出一个地图。相关渲染字段不明白的可以去官网配置项文档查看详细内容

const options = {
backgroundColor: 'transparent', // 背景色
        // 提示浮窗配置
        tooltip: {
          //提示框组件
          show: true,
          trigger: 'item',
          triggerOn: 'mousemove', // 触发条件
          appendToBody: true,
          position: function (pos, params, dom, rect, size) {
            // 固定在鼠标位置
            return [pos[0], pos[1]]
          },
          backgroundColor: 'transparent', // 提示框浮层背景颜色
          borderWidth: 0,
          padding: [0], // 提示框浮层内边距
          // 提示框浮层的文本样式
          textStyle: {
            color: '#fff'
          }
        },
geo:[
          {
            type: 'map',
            map: 'china',
            zlevel: 4,
            aspectScale: 0.9,
            zoom: 1.45,
            layoutCenter: ['47%', '50%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            regions: [
              {
                name: '南海诸岛',
                value: 0,
                itemStyle: {
                  opacity: 0
                },
                label: {
                  show: false
                }
              }
            ],
            label: {
              show: true,
              formatter: (params) => {
                if (this.areaCode == 100000) {
                  const LevelOne = this.mapIconData?.find((item) => item.name === params.name)
                  if (LevelOne) {
                    return `{area_name|${LevelOne?.name}}\n {area_bg|${LevelOne?.showValue} 亿}`
                  } else {
                    return ''
                  }
                } else {
                  return `{area_name|${params?.name}}`
                }
              },
              rich: {
                area_name: {
                  color: '#FFF',
                  fontSize: '9px',
                  fontWeight: 'bold',
                  fontStyle: 'italic',
                  align: 'center',
                  textBorderWidth: 3,
                  textBorderColor: '#110070',
                  lineHeight: 10
                },
                area_bg: {
                  color: '#FFF',
                  fontWeight: 'bold',
                  fontStyle: 'italic',
                  fontSize: '11px',
                  align: 'center',
                  width: 47,
                  height: 20,
                  lineHeight: 20,
                  backgroundColor: {
                    image: indexImg
                  }
                },
                area_gif: {
                  width: 50,
                  height: 50,
                  lineHeight: 30,
                  align: 'center',
                  backgroundColor: {
                    image: arrowImg
                  }
                }
              }
            },
            itemStyle: {
              normal: {
                // 地图样式
                areaColor: 'transparent', // 区域颜色
                borderColor: 'transparent', // 边框颜色
                borderWidth: 0
              }
            }
          },
    ],
series:[
{
          type: 'map',
          map: 'china',
          roam: false,
          zlevel: 2,
          layoutSize: '100%',
          layoutCenter: ['47%', '50%'],
          animation: false,
          zoom: 1.45, // 缩放比
          aspectScale: 0.9, //长宽比
          showLegendSymbol: false, // 存在legend时显示
          itemStyle: {
            normal: {
              // 地图样式
              areaColor: {
                type: 'pattern',
                image: firstImg, //配置图片
                repeat: 'repeat' //可选值repeat、no-repeat、repeat-x、repeat-y
              },
              borderColor: '#0bc6f2',
              borderWidth: 1
            }
          },
          emphasis: {
            itemStyle: {
              areaColor: {
                type: 'pattern',
                image: activeImg,
                repeat: 'repeat'
              },
              borderColor: '#fff',
              borderWidth: 2
            },
            label: {
              show: false
            }
          },
          select: {
            label: {
              show: false
            },
            itemStyle: {
              areaColor: {
                type: 'pattern',
                image: activeImg,
                repeat: 'repeat'
              },
              borderColor: '#fff',
              borderWidth: 2
            }
          },
          data: this.mapGeoData
        },
    ]
 }

个性化地图配置—多图层

根据我目前所需的业务需求提供相关个性化配置以供参考~

首先就是地图的多图层问题

多图层问题为了样式美观,需要在geo数组下建造多个对象,通过zlevel属性去控制层级,并且只有第一层地图有相关业务功能所以其他图层地图设置silent属性沉默属性,不响应操作

        geo: [
          {
            type: 'map',
            map: 'china',
            zlevel: 4,
            aspectScale: 0.9,
            zoom: 1.45,
            layoutCenter: ['47%', '50%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            regions: [
              {
                name: '南海诸岛',
                value: 0,
                itemStyle: {
                  opacity: 0
                },
                label: {
                  show: false
                }
              }
            ],
            label: {
              show: true,
              formatter: (params) => {
                if (this.areaCode == 100000) {
                  const LevelOne = this.mapIconData?.find((item) => item.name === params.name)
                  if (LevelOne) {
                    return `{area_name|${LevelOne?.name}}\n {area_bg|${LevelOne?.showValue} 亿}`
                  } else {
                    return ''
                  }
                } else {
                  return `{area_name|${params?.name}}`
                }
              },
              rich: {
                area_name: {
                  color: '#FFF',
                  fontSize: '9px',
                  fontWeight: 'bold',
                  fontStyle: 'italic',
                  align: 'center',
                  textBorderWidth: 3,
                  textBorderColor: '#110070',
                  lineHeight: 10
                },
                area_bg: {
                  color: '#FFF',
                  fontWeight: 'bold',
                  fontStyle: 'italic',
                  fontSize: '11px',
                  align: 'center',
                  width: 47,
                  height: 20,
                  lineHeight: 20,
                  backgroundColor: {
                    image: indexImg
                  }
                },
                area_gif: {
                  width: 50,
                  height: 50,
                  lineHeight: 30,
                  align: 'center',
                  backgroundColor: {
                    image: arrowImg
                  }
                }
              }
            },
            itemStyle: {
              normal: {
                // 地图样式
                areaColor: 'transparent', // 区域颜色
                borderColor: 'transparent', // 边框颜色
                borderWidth: 0
              }
            }
          },
          {
            type: 'map',
            map: 'china',
            roam: false,
            zlevel: 2,
            layoutSize: '100%' /* 地图的大小 */,
            layoutCenter: ['47%', '50%'] /* 把地图放到盒子的正中间 */,
            zoom: 1.45,
            aspectScale: 0.9,
            regions: [
              {
                name: '南海诸岛',
                value: 0,
                itemStyle: {
                  opacity: 0
                },
                label: {
                  show: false
                }
              }
            ],
            label: {
              show: false
            },
            // 当前第一层地图的初始样式
            itemStyle: {
              normal: {
                // 地图样式
                areaColor: {
                  type: 'pattern',
                  image: firstImg, //配置图片
                  repeat: 'repeat' //可选值repeat、no-repeat、repeat-x、repeat-y
                },
                borderColor: '#0bc6f2',
                borderWidth: 1
              }
            },
            emphasis: {
              itemStyle: {
                areaColor: {
                  type: 'pattern',
                  image: activeImg,
                  repeat: 'repeat'
                },
                borderColor: '#fff',
                borderWidth: 2
              },
              label: {
                show: false
              }
            },
            select: {
              label: {
                show: false
              },
              itemStyle: {
                areaColor: {
                  type: 'pattern',
                  image: activeImg,
                  repeat: 'repeat'
                },
                borderColor: '#fff',
                borderWidth: 2
              }
            }
          },
          // 不包含子区域的地图
          {
            type: 'map',
            map: 'china_nochild',
            zlevel: 3,
            aspectScale: 0.9,
            zoom: 1.45,
            layoutCenter: ['47%', '50%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            regions: [
              {
                name: '南海诸岛',
                value: 0,
                itemStyle: {
                  opacity: 0
                },
                label: {
                  show: false
                }
              }
            ],
            itemStyle: {
              normal: {
                // 地图样式
                areaColor: 'transparent', // 区域颜色
                borderColor: '#c5eaff', // 边框颜色
                opacity: 1,
                shadowColor: '#fff',
                shadowBlur: 20,
                // shadowOffsetX: 0,
                shadowOffsetY: 3,
                borderWidth: 3
              }
            }
          },
          {
            type: 'map',
            map: 'china_nochild',
            zlevel: -1,
            aspectScale: 0.9,
            zoom: 1.45,
            layoutCenter: ['47%', '52%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            regions: [
              {
                name: '南海诸岛',
                value: 0,
                itemStyle: {
                  opacity: 0
                },
                label: {
                  show: false
                }
              }
            ],
            itemStyle: {
              normal: {
                // 地图样式
                areaColor: {
                  type: 'pattern',
                  image: secondImg, //配置图片
                  repeat: 'repeat' //可选值repeat、no-repeat、repeat-x、repeat-y
                },
                borderColor: '#35b5ff', // 边框颜色
                borderWidth: 1
              }
            }
          },
          {
            type: 'map',
            map: 'china_nochild',
            zlevel: -2,
            aspectScale: 0.9,
            zoom: 1.45,
            layoutCenter: ['47%', '54%'],
            layoutSize: '100%',
            roam: false,
            silent: true,
            regions: [
              {
                name: '南海诸岛',
                value: 0,
                itemStyle: {
                  opacity: 0
                },
                label: {
                  show: false
                }
              }
            ],
            itemStyle: {
              normal: {
                // 地图样式
                areaColor: '#2770ca', // 区域颜色
                borderColor: '#35b5ff', // 边框颜色
                shadowColor: '#00d2ff',
                shadowBlur: 18,
                shadowOffsetY: -10,
                borderWidth: 1,
                opacity: 1
              }
            }
          }
        ],

其中地图为了实现中国地图边缘线高亮并且和地图内省界线样式冲突,添加了不包含子区域的地图对象,这个需要和后端接口提供的json对象渲染或者去Datav官网下载不包含地图子区域的json文件

个性化地图配置—迁徙线

地图上添加迁徙线的相关配置在series数组中添加

        {
          type: 'lines',
          zlevel: 2,
          silent: true,
          effect: {
            show: true,
            period: 2.6, // 箭头指向速度,值越小速度越快
            trailLength: 0.8, // 特效尾迹长度[0,1]值越大,尾迹越长重
            symbol: 'pin', // 箭头图标
            color: '#4ee0ff',
            loop: true,
            symbolSize: 8 // 图标大小
          },
          lineStyle: {
            width: 1, // 尾迹线条宽度
            // opacity: 0, // 尾迹线条透明度
            curveness: 0.4, // 尾迹线条曲直度
            color: 'transparent'
          },
          data: this.mapMigrationData
        },

其中data为迁徙线的渲染数据,其他配置或者更多请去文章开头官网寻找~

个性化地图配置—涟漪图

地图上添加涟漪图的相关配置在series数组中添加

 {
          type: 'effectScatter',
          coordinateSystem: 'geo',
          geoIndex: 0,
          zlevel: 2,
          silent: true,
          showEffectOn: 'render', // 绘制完成后显示特效
          hoverAnimation: true,
          large: true, // 是否开启大数据量优化
          rippleEffect: {
            // 涟漪特效
            period: 3, // 动画时间-秒数
            brushType: 'stroke', // 波纹绘制方式 stroke, fill
            scale: 2 // 波纹圆环最大限制,值越大波纹越大
          },
          symbol: 'circle',
          symbolSize: function (value, params) {
            if (params?.name === '北京市') {
              return 9
            } else {
              return 5
            }
          },
          label: {
            show: false
          },
          itemStyle: {
            normal: {
              show: false,
              color: '#4DFEEC'
            }
          },
          data: this.mapRipplesData
        }

个性化地图配置—自定义图标

地图上添加图标的相关配置在series数组中添加

        {
          type: 'scatter',
          coordinateSystem: 'geo', // 使用地理坐标系
          geoIndex: 0,
          zlevel: 2,
          data: [],
          // data: this.mapIconData, // 要有对应的经纬度才显示,先经度再维度
          showEffectOn: 'render', // 绘制完成后显示特效
          hoverAnimation: false,
          emphasis: {
            scale: false
          },
          silent: true,
          large: true, // 是否开启大数据量优化,在数据图形特别多而出现卡顿时候可以开启。
          symbol: 'image://' + require('@/assets/icons/arrow.png'),
          symbolSize: 50
        }

注意:

  • 以上配置如果是单图层会比较简单,多图层情况需要注意层级zlevel的展现
  • geo数组和series数组,在需要进行业务操作交互的第一层图层,需要注意其层级level、roam、zoom、aspectScale均需要设置为一致

以上就是一些配置相关问题,有关于地图的其他配置问题和疑难问题都可以留言或私信我,我会第一时间关注并回复的~

今天的知识分享就到这里啦~希望大家在这能学到知识一起分享一起进步,成为更好的自己!

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

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

相关文章

Excel中查找某个值的位置,用位置取值

有 2022 年 1 月的日销售额统计表如下所示&#xff1a; 找出销售额最大的是哪一天&#xff0c;在 C2 单元格里输入&#xff1a; spl("E(?1).pmax(Sales)",A1:B32)返回结果 12 接着找出销售额最大的那天的前 5 天和后 5 天的销售额&#xff1a; spl("E(?1).…

RAR格式文件解压:适合各平台的RAR解压软件下载推荐

RAR格式是一种广泛使用的压缩格式&#xff0c;因其优秀的压缩率和多样化的功能而受到用户的喜爱。然而&#xff0c;尽管许多操作系统自带基本的压缩解压功能&#xff0c;但要处理RAR格式文件&#xff0c;通常需要借助专门的解压软件。本文将为用户推荐适合Windows、Mac、Linux和…

支付宝“碰一下”微信

“‘碰一下’风头正盛&#xff0c;他们设立了专门的项目组&#xff0c;特别卷&#xff0c;动不动搞到两点&#xff0c;有些受不了的&#xff0c;就主动活水到别的团队了。他们内部也在各种挖人&#xff0c;善攻&#xff08;支付宝副总裁李佳佳的花名&#xff09;为了这个项目拼…

RabbitMQ的高级特性-死信队列

死信(dead message) 简单理解就是因为种种原因, ⽆法被消费的信息, 就是死信. 有死信, ⾃然就有死信队列. 当消息在⼀个队列中变成死信之后&#xff0c;它能被重新被发送到另⼀个交换器 中&#xff0c;这个交换器就是DLX( Dead Letter Exchange ), 绑定DLX的队列, 就称为死信队…

9.30今日错题解析(软考)

目录 前言系统开发基础——需求分析相关概念及需求的分类面向对象技术——UML图的图示面向对象技术——面向对象的基本概念 前言 这是用来记录我备考软考设计师的错题的&#xff0c;今天知识点为需求分析相关概念及需求的分类、UML图的图示、面向对象的基本概念&#xff0c;大…

《Windows PE》3.2 PE头结构-DOS头和DOS块

正如我们在初识PE文件一节中看到的&#xff0c;PE文件头中包含几个重要的结构&#xff0c;DOS头、DOS块&#xff08;DOS Stub&#xff09;和NT头。NT头就是PE特征码文件头&#xff08;COFF 文件标头&#xff09;扩展头&#xff08;可选标头&#xff09;&#xff0c;合称为NT头。…

PostgreSQL的字段存储类型了解

PostgreSQL的字段存储类型了解 在 PostgreSQL 中&#xff0c;每个字段&#xff08;列&#xff09;都有其存储类型&#xff0c;这些存储类型决定了数据库如何存储和处理该字段的数据。了解和适当地利用这些存储类型&#xff0c;可以提高数据库的性能和存储效率。 主要的存储类…

SpringBoot日志集成-LogBack

Log4J&#xff1a;最早的Java日志框架之一&#xff0c;由Apache基金会发起&#xff0c;提供灵活而强大的日志记录机制JDK自带的日志框架&#xff1a;java.util.logging.Logg&#xff0c;是JDK1.4之后提供的日志API&#xff0c;已淘汰logback&#xff1a; logback一个开源的日志…

【高性能内存池】thread cache内存回收 6

当线程申请的内存不用了之后就可以将不用的内存还给thread cache。 1 将内存还给thread cache 下面是thread cache的结构&#xff1a; thread cache中有很多的freeList,申请内存的时候也是将freeList取出给线程&#xff0c;因此&#xff0c;释放内存的时候就是将内存还原成fr…

五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)

五&#xff0c;MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”&#xff08;详细实操&#xff09; 文章目录 五&#xff0c;MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”&#xff08;详细实操&#xff09;1. ActiveRecord 模式2. Activ…

UE5 项目缓存文件删除、版本控制说明(工程目录结构)

文章目录 前言一、项目文件示例二、缓存文件删除、版本控制说明前言 我们在拷贝项目或者使用 Git 进行版本控制,如果不对文件选择性的控制,大量缓存文件会导致传输速度变慢;或者我们的项目报错了,想要删除缓存文件又不知如何下手,哪些是可删除的,哪些又是不可删除的,本…

Ubuntu安装oh-my-zsh

Ubuntu20.04安装oh-my-zsh 安装zsh sudo apt-get updatesudo apt-get install zshcat /etc/shell出现**/bin/zsh**即为安装成功 安装oh-my-zsh git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zshcp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc更改默…

二、AI大模型(Transformer架构)

Transformer架构 Transformer架构是目前大多数AI大模型的基础&#xff0c;它通过**自注意力机制&#xff08;Self-Attention Mechanism&#xff09;**解决了序列处理中的长距离依赖问题。相比传统的递归神经网络&#xff08;RNN&#xff09;和长短期记忆网络&#xff08;LSTM&…

C Primer Plus 第7章——第二篇

你该逆袭了 第7章:重点摘录 三、逻辑运算符1、备选拼写&#xff1a;iso646.h 头文件2、优先级3、求值顺序4、范围 四、一个统计单词的程序1、针对代码&#xff0c;提出疑问&#xff0c;第8章节进行讲解2、我结合自己的理解&#xff0c;自己写的代码 五、条件运算符 &#xff1f…

公交IC卡收单管理系统 多接口SQL注入

0x01 产品描述&#xff1a; 公交IC卡系统是公交一卡通系统核心建设部分&#xff0c;是高时尚、高科技的管理系统&#xff0c;大大提升了公交行业的服务&#xff0c;能让公交企业信息化和电子化打下一个良好的硬件基础和软件基 0x02 漏洞描述&#xff1a; 公交IC卡系统在/role&…

HashMap底层原理是什么?从源码入手,沉浸式解读HashMap序列化、存储、扩容、获取等方法具体实现

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码解析-CSDN博客 目录 一、基本介绍 1.1 集合和映射 1.1.1 基本介绍 1.1.2 思考&#xff1a;Map是不是集合&#xff1f; …

当今爆火的RPA其实就是自动化测试

最近有机会看到了 RPA 在实际工作中的重度应用&#xff0c;深刻感受到了自动化的强大实力&#xff0c;以后的应用前景时完全可期的。 RPA (Robotic Process Automation) 简介 Robotic Process Automation (RPA) 是一种技术&#xff0c;使用软件机器人&#xff08;或称“机器人…

知乎信息流广告营销获客投放策略!

知乎内容营销已成为品牌吸引目标客户、提升品牌知名度的重要手段&#xff0c;吸引了众多企业的关注。为了更好地利用知乎这一平台进行品牌推广&#xff0c;越来越多的企业开始关注知乎信息流广告的投放。云衔科技通过知乎信息流广告实现高效的营销获客&#xff0c;为企业提供知…

小程序原生-数据的双向绑定

1. 通过model:实现数据的双向绑定 <input type"text" name"名称" model:value"{{name}}" /> <checkbox model:checked"{{isChecked}}"/> 是否同意该协议// pages/test/test.js Page({data: {name:wuk,isChecked:false}, }…