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

vue+echarts实现地图及飞线图

时间:2024-04-30 16:22:05浏览次数:27  
标签:index 及飞 vue const name child echarts coordiante center

参考:

1.Echarts画区域飞线地图  https://blog.csdn.net/Daylighte/article/details/122502754?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-122502754-blog-122918939.235^v43^control&spm=1001.2101.3001.4242.2&utm_relevant_index=4

2.高德地图和Echarts共同实现飞线图  https://blog.csdn.net/m0_58293192/article/details/128723528

 

 

效果:

 

map.vue

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

<script>
const echarts = require('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 = ['#9BE6FF', '#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: '2px 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: '#05092C',
            },
            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';
        // 中心点所在省份设置特殊背景色
        const centerCityNameArr = this.centerCitys.map(item => {
          return item.provinceName;
        });
        if (centerCityNameArr.includes(name)) {
          areaColor = '#242874';
        }
        return {
          name: name,
          itemStyle: {
            normal: {
              areaColor: areaColor,
              borderColor: '#0E1037',
            },
          },
        };
      });
      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: {
            disabled: 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: 10, // 尾巴大小
            },
            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: 5, // 高亮边框宽度
              },
            },
          },
        ],
      };
      return option;
    },
  },
};
</script>
<style lang="less" scoped>
.mapFlyLine {
  height: 584px;
}
</style>

 

 china.json文件,可以去datav官网下载:https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json

 

标签:index,及飞,vue,const,name,child,echarts,coordiante,center
From: https://www.cnblogs.com/linjiangxian/p/18168242

相关文章

  • PHP框架Laravel+Vue3+前后端分离开发模式+实战项目
    1、本实战项目采用前后端分离的开发模式,前端框架vue3,后端框架laravel10。所谓的前后端分离的开发,就是有别于利用cookie,session的基于会话机制的开发模式;前后端分离的开发模式是基于jwt的开发模式,也就是说后端的接口数据不仅可以支持web页面,也可以支持微信小程序,公众号,app等移动端......
  • Vue3中Mock数据的简单方案
    因为Vue3项目开发中需要用到Mock数据,所以这里记录一种快速Mock数据的方法。一、安装首先,你需要安装axios和axios-mock-adapter。npminstallaxiosaxios-mock-adapter--save二、编写mock数据为了保证项目的整洁,我们在项目根目录下的src目录下新建一个名为mock的文件夹......
  • vue3 vant4 h5图片上传时压缩
    代码如下upload组件的afterRead方法:constafterRead=asyncfile=>{file.status="uploading";file.message="上传中...";const{data}=awaitupLoaderImg(file.file);//使用上传的方法。file.fileif(data){file.status="done&q......
  • 38.Vue路由的简单学习整理
    关于vue路由这是关于前端的知识我大致就理解为其为跳转规则html中跳转想一下jsp跳转或者直接a标签跳转这个为人家规范的跳转这是vscode用到一些小插件{图标和idea键盘操作挺不错的}当然你需要vue插件否则无法识别vue还有就是node.js的安装就不说了首先分为前......
  • vue-property-decorator基础教程
    vue-property-decorator基础教程为什么要使用vue-property-decorator如何使用vue-property-decorator1.基本写法2.data中定义数据3.生命周期钩子函数4.方法5.@Component()6.@Prop()7.@PropSync()8.@Emit()9.计算属性10.@Watch()为什么要使用vue-property-decoratorvue-......
  • yarn + vue3 + vite 创建项目
      yarncreatevite//通过yarn+vite创建项目填写的创建的项目名称,默认名称vite-project 选择框架,我们点击上下键,回车选择,我们这里选择vue 选择语言,我们点击上下键,回车选择,我们这里选择TypeScript,即ts,然后回车 创建成功,如下 按照提示,执行命令cdvite-pr......
  • react diff算法和vue的区别
    区别相同点都是两组虚拟dom的对比(react16.8之后是fiber与虚拟dom的对比)只对同级节点进行对比,简化了算法复杂度都用key做为唯一标识,进行查找,只有key和标签类型相同时才会复用老节点遍历前都会根据老的节点构建一个map,方便根据key快速查找不同点react在diff遍历的时候,......
  • Vue3+Ts i18n实现国际化
    1、下载依赖npminstallvue-i18n@nex2、在src目录下创建文件夹创建文件index.ts、zh/index.ts、en/index.ts //index.tsimport{createI18n}from'vue-i18n'importzhfrom'./zh/index'importenfrom'./en/index'constmessages={en,zh,}......
  • vue.js 3 初学经验:开发环境搭建,Windows,nginx
    Windows11nginx-1.20.0"vue":"^3.4.21"--- 序章vue3开发,不需要后端服务业是可以的。在需要后端服务时,使用nginx来转发请求是很好的(个人开发者)。 注,还有什么其它方式吗?注,本文的后端服务是使用Java开发的HTTP接口。注,参考资料#2介绍了多个vue.js3.0项目......
  • 在vue2中,什么是双向绑定,为什么vue3要进行优化?
    一、什么是双向绑定我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定举个栗子 当用户填写表单时,View......