首页 > 其他分享 >vue+echarts实现地图及飞线图

vue+echarts实现地图及飞线图

时间:2024-08-28 10:26:47浏览次数:4  
标签:及飞 vue const name color child echarts coordiante

参考文章:https://www.cnblogs.com/linjiangxian/p/18168242
在文章的基础上加了一些注释并修改缩放时下层有地图重叠的问题
效果:

china.json文件来源于datav官网下载:https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json

<template>
  <div class="mapFlyLine" ref="mapFlyLine"></div>
</template>

<script>
// const echarts = require('echarts');
import * as echarts from "echarts";
const chinaData = require('./china.json');

export default {
  data() {
    return {
      chart: null,
      centerCitys: [], // 总公司
      aroundCitys: [], // 子公司
      linesArr: [], // 飞线
    };
  },
  mounted() {
    this.load();
  },
  methods: {
    load() {
      this.centerCitys = [];
      this.aroundCitys = [];
      this.linesArr = [];
      // 中心点颜色,长度要与返回数据的总公司数一致
      const colorArr = ['#aaaaaa', '#F87B8F', '#7D82FD'];
      // 模拟数据
      const mockData = [
        {
          companyName: '公司A',
          provinceName: '内蒙古自治区',
          child: [
            {
              name: '子公司A1',
              coordiante: [113.625351, 34.746303],
            },
            {
              name: '子公司A2',
              coordiante: [103.834228, 36.060798],
            },
          ],
          coordiante: [113.186291, 42.646075],
        },
        {
          companyName: '公司B',
          provinceName: '新疆维吾尔自治区',
          child: [
            {
              name: '子公司B1',
              coordiante: [102.771252, 30.159369],
            },
          ],
          coordiante: [87.628579, 43.793301],
        },
        {
          companyName: '公司C',
          provinceName: '云南省',
          child: [
            {
              name: '子公司C1',
              coordiante: [93.762463, 30.102358],
            },
            {
              name: '子公司C2',
              coordiante: [109.494885, 24.081566],
            },
          ],

          coordiante: [101.716564, 24.761788],
        },
      ];

      mockData.forEach((center, index) => {
        this.centerCitys.push({
          name: center.companyName,
          value: center.coordiante,
          provinceName: center.provinceName,
          itemStyle: {
            color: colorArr[index],
            border: '1px solid #FFFFFF',
          },
          label: {
            show: true,
            formatter: center.companyName,
            position: 'top',
            padding: [0, 10],
            height: 30,
            lineHeight: 30,
            borderRadius: 5,
            textStyle: {
              fontSize: 14,
              fontWeight: 600,
              color: '#ffffff',
            },
            backgroundColor: colorArr[index],
          },
        });
        center.child.forEach(child => {
          this.aroundCitys.push({
            name: child.name,
            value: child.coordiante,
            itemStyle: {
              color: colorArr[index],
            },
          });

          this.linesArr.push({
            name: `${child.name}-${center.companyName}`,
            coords: [center.coordiante, child.coordiante],
            // 线特效的配置
            effect: {
              color: colorArr[index],
            },
            lineStyle: {
              normal: {
                width: 1.2,
                curveness: 0.3,
                color: colorArr[index],
              },
              opacity: 0.3,
            },
          });
        });
      });
      this.chart = echarts.init(this.$refs.mapFlyLine);
      echarts.registerMap('china', chinaData);
      this.chart.setOption(this.getOption());
    },
    getOption() {
      const regions = chinaData.features.map(item => {
        const { name } = item.properties;
        // let areaColor = '#1C1E57';
        let areaColor = 'rgba(0, 0, 255, 0.1)';
        // 中心点所在省份设置特殊背景色
        const centerCityNameArr = this.centerCitys.map(item => {
          return item.provinceName;
        });
        if (centerCityNameArr.includes(name)) {
          areaColor = 'rgba(0, 0, 255, 0.6)';
        }
        return {
          name: name,
          itemStyle: {
            normal: {
              areaColor: areaColor,
              borderColor: '#ffffff',
            },
          },
        };
      });
      const option = {
        grid: {
          left: '0',
          right: '0',
          bottom: '0',
          top: '0',
          containLabel: true,
        },
        // 地理坐标系组件
        geo: {
          map: 'china',
          zlevel: 13,
          show: true,
          layoutCenter: ['50%', '50%'],
          roam: true, // 是否开启鼠标缩放和平移漫游,只开启单个时,设置'scale' 或者 'move'
          layoutSize: '90%',
          zoom: 1.4, // 当前视角的缩放比例
          // 在地图中对特定的区域配置样式
          regions: regions,
          itemStyle: {
            normal: {
              color: 'rgba(28, 30, 87, 1)',
              borderWidth: 2,
              borderColor: 'rgba(125, 130, 253, 1)',
            },
            emphasis: {
              borderWidth: 2, // 悬停时边框宽度
              areaColor: 'lightblue', // 悬停时背景颜色
            },
          },
          label: {
            emphasis: {
              color: 'blue', // 悬停时字体颜色
            },
          },
          emphasis: {
            // disabled: true,//控制鼠标悬浮高亮,true为禁止显示
          },
        },
        series: [
          // 总公司
          {
            type: 'effectScatter',
            coordinateSystem: 'geo',
            zlevel: 15,
            symbolSize: 16,//发出点的大小
            // 涟漪特效相关配置
            rippleEffect: {
              period: 6, // 动画的周期,秒数
              num: 3, // 波纹的数量
              brushType: 'fill', // 波纹的绘制方式,可选 'stroke' 和 'fill'
              scale: 3, // 动画中波纹的最大缩放比例
            },
            data: this.centerCitys,
          },
          // 子公司
          {
            type: 'effectScatter',
            coordinateSystem: 'geo',
            zlevel: 15,
            symbolSize: 4,
            label: {
              show: true,
              formatter: params => params.name,
              position: 'bottom',
              textStyle: {
                fontSize: 12,
                color: '#43D0D6',
              },
            },
            data: this.aroundCitys,
          },
          // 飞线
          {
            type: 'lines',
            coordinateSystem: 'geo',
            zlevel: 15,
            // 线特效的配置
            effect: {
              show: true,
              period: 2, // 控制流星的速度,数字越小越快
              trailLength: 0.2, // 控制流星尾巴的长度,范围为0-1
              symbol: 'pin', // 尾巴形状,也可以设置成其他符号
              symbolSize: 7, // 尾巴大小
            },
            data: this.linesArr,
          },

          //下面一层不能移动缩放的底图,可以选择区域高亮
          // {
          //   type: 'map',
          //   mapType: 'china',
          //   zlevel: 12,
          //   layoutCenter: ['50%', '50%'],
          //   roam: false, // 'scale' 或者 'move'
          //   layoutSize: '90%',
          //   zoom: 1.4,
          //   data: [], // 空数据,不显示其他区域,只显示中国轮廓
          //   itemStyle: {
          //     normal: {
          //       borderColor: 'rgba(125, 130, 253, 1)', // 高亮边框颜色
          //       borderWidth: 2, // 高亮边框宽度
          //     },
          //   },
          // },
        ],
      };
      return option;
    },
  },
};
</script>
<style scoped>
.mapFlyLine {
  height: 584px;
}
</style>

标签:及飞,vue,const,name,color,child,echarts,coordiante
From: https://www.cnblogs.com/ziziju/p/18384091

相关文章

  • Vue2中的事件修饰符 用于处理DOM事件的触发方式
    一、.stop1.功能:阻止事件冒泡,即停止事件向上传播到父元素。2.代码演示:<div@click="parentClick"> <[email protected]="childClick">Clickme</button></div>二、.prevent1.功能:阻止默认行为,例如阻止表单提交或链接跳转。2.代码演示:<[email protected]="su......
  • vue全局指令按钮权限控制
    方法一:指令.js//注册一个全局自定义指令`v-has-permission`Vue.directive('has-permission',{bind(el,binding,vnode){//获取绑定的权限值constpermission=binding.value;//检查用户是否拥有该权限consthasPermission=checkUserPermissio......
  • vue:父子组件的通信
    上一篇:vue组件化开发在上一篇文章中,我们申明了一点,那就是组件之间是独立的,除非构建了通信。组件间为什么要构建通信?在单一文件中写上整个网站的代码逻辑,这无疑使得维护成本巨大。所以我们选择了组件化开发,把组件间独立起来,这样谁也不干涉谁,是谁的逻辑就在谁的文件中实现......
  • 基于ssm+vue党员管理系统设计与实现【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息化技术的飞速发展,传统的手工党员管理模式已难以满足当前复杂多变的党务工作需求。党员作为党组织的基石,其信息的准确性、管理的效率性直接关......
  • 基于ssm+vue法律知识咨询普及系统【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,随着法治建设的不断推进和公民法律意识的日益增强,法律知识咨询与普及成为了社会发展的重要需求。然而,面对纷繁复杂的法律条文与不断更新的......
  • 基于ssm+vue的校园心理咨询室系统【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的快速发展与竞争的日益激烈,大学生面临着学业压力、人际关系、职业规划等多重挑战,心理健康问题日益凸显。传统的心理咨询方式受限于时间、地......
  • 基于ssm+vue的宠物领养系统【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代社会生活节奏的加快与人际关系的日益复杂,宠物逐渐成为许多人生活中不可或缺的伙伴,它们不仅能够提供情感慰藉,还能在孤独时给予陪伴。然而,宠物......
  • 基于ssm+vue房屋租赁系统的设计与实现【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人口流动性的增强,房屋租赁市场日益繁荣,成为现代都市生活中不可或缺的一部分。然而,传统的房屋租赁方式往往存在信息不对称、流......
  • 基于ssm+vue废品回收管理系统设计与实现【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人们生活水平的不断提升,垃圾产生量急剧增加,垃圾分类与回收已成为环境保护和可持续发展的关键议题。然而,当前废品回收领域仍面临......
  • 基于ssm+vue宠物店管理系统【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着宠物经济的蓬勃发展,宠物已成为许多家庭不可或缺的一员,其地位逐渐提升,宠物市场的需求也随之日益增长。宠物店作为宠物产业链中的重要一环,不仅提供......