【echarts 中国地图射线版本】vue实现中国地图航线动画效果,地图上添加散点效果【详细注释,通俗易懂】

先上效果图

在这里插入图片描述

前置条件,必看

首先你需要安装echarts并引入
然后你需要下载china.json文件并注册引入,不然不生效

当然很多新手可能不知道china.json在哪里下载,因为官方已经没有了,停止下载了。
我再另一个帖子中有放china.json的文件,只要过去复制就行了。这里不重复写了,因为很多很大,有点卡。
可以直接点:https://blog.csdn.net/seeeeeeeeeee/article/details/121495485
或者点我头像进去看,名字叫:【echarts 中国地图】vue实现中国地图,省份居中china.json文件下载

上代码

这里代码是你上面的步骤好了后直接复制到vue组件内用就生效的。

<template>
  <div class="managingPatientSize">
    <el-row>
      <el-col :span="6">1</el-col>
      <el-col :span="12">
        <div id="china-map"></div>
      </el-col>
      <el-col :span="6">1</el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  data() {
    return {
    };
  },
  mounted() {
    this.china_map();
  },
  methods: {
    /*
    和后台联动思路:后台传数据给你,也就是我这边模拟的lineData这个数组的数据格式一样就行。如果字段名字变动,自己前台更改一下就可以了。
    lineData这个结构解释一下:
    val:数据,也就是你想展示的数据可以放里面。鼠标移动上去后可以看到
    blat:发射点,也就是你要从哪里发射一个射线出去,就给个这个地方的坐标就行了。后台的坐标你可以直接发送这个chinaGeoCoordMap数组的给他,让他用这个坐标来
    elon:接收点,就是你发射出去的射线哪个省接收这个射线,写一个接收省的坐标
    bcitysim:发射省的名字
    ecitysim:接收省的名字
    */
    china_map() {
      let mapChart = this.$echarts.init(document.getElementById("china-map"));//图表初始化,china-map是绑定的元素
      window.onresize = mapChart.resize;//如果容器变大小,自适应从新构图
      let series = [];//存放循环配置项
      let res = [];//存放射线的起始点和结束点位置
      let province = [];//存放有射线的省的名字,以此来拿到对应省份的坐标
      //提前存好的所有省份坐标,用于后面根据名字拿到对应的左边
      let chinaGeoCoordMap = {
        新疆: [86.9023, 41.148],
        西藏: [87.8695, 31.6846],
        内蒙古: [110.5977, 41.3408],
        青海: [95.2402, 35.4199],
        四川: [102.9199, 30.1904],
        黑龙江: [128.1445, 46.7156],
        甘肃: [102.7129, 38.166],
        云南: [101.0652, 24.6807],
        广西: [108.7813, 23.6426],
        湖南: [111.5332, 27.3779],
        陕西: [108.5996, 33.7396],
        广东: [113.8668, 22.8076],
        吉林: [126.1746, 43.5938],
        河北: [115.4004, 38.1688],
        湖北: [112.2363, 30.8572],
        贵州: [106.6113, 26.6385],
        山东: [118.2402, 36.2307],
        江西: [115.7156, 27.99],
        河南: [113.0668, 33.8818],
        辽宁: [123.0438, 41.0889],
        山西: [112.4121, 36.6611],
        安徽: [117.2461, 31.0361],
        福建: [118.3008, 25.9277],
        浙江: [120.498, 29.0918],
        江苏: [119.8586, 32.915],
        重庆: [107.7539, 29.8904],
        宁夏: [105.9961, 37.1096],
        海南: [109.9512, 19.2041],
        台湾: [120.8254, 23.5986],
        北京: [116.4551, 40.2539],
        天津: [117.4219, 39.4189],
        上海: [121.4648, 31.2891],
        香港: [114.6178, 22.3242],
        澳门: [113.5547, 21.6484],
      };
      //后台给的数据
      let lineData = [
        {
          val: 32, //数据
          blat: [86.9023, 41.148], //发射点
          elon: [87.8695, 31.6846], //接收点
          bcitysim: "新疆",//发射省的名字
          ecitysim: "西藏",//接收省的名字
        },
        {
          val: 32,
          blat: [87.8695, 31.6846],
          elon: [95.2402, 35.4199],
          bcitysim: "西藏",
          ecitysim: "青海",
        },
        {
          val: 32,
          blat: [86.9023, 41.148],
          elon: [95.2402, 35.4199],
          bcitysim: "新疆",
          ecitysim: "青海",
        },
      ];
      //循环拿到处理好的数据
      for (var i = 0; i < lineData.length; i++) {
        province.push(lineData[i].bcitysim);//存进去每个省的名字
        province.push(lineData[i].ecitysim);//存进去每个省的名字
        res.push({
          fromName: lineData[i].bcitysim, //发射的省名,保存用于弹框显示
          toName: lineData[i].ecitysim, //接收的省名,保存用于弹框显示
          coords: [
            lineData[i].blat, //发射
            lineData[i].elon, //接收
          ],
          count: lineData[i].val, //数据
        });
      }
      let index_data = new Set(province);//把省的名字去重
      let data_res = [];//定义一个新的变量存放省的坐标

      //注意这里一定要用name和value的形式。不是这个格式的散点图显示不出来
      index_data.forEach((item) => {
        data_res.push({
          name: item,//每个省的名字
          value: chinaGeoCoordMap[item],//每个省的坐标
        });
      });
      //循环往series内添加配置项
      series.push(
        {
          //射线效果图层
          type: "lines", //类型:射线
          zlevel: 1, //类似图层效果
          effect: {
            show: true,//是否显示图标
            symbol: "arrow",//箭头图标
            symbolSize: 5,//图标大小
            trailLength: 0.02,//特效尾迹长度[0,1]值越大,尾迹越长重
          },
          label: {
            show: true,
          },
          lineStyle: {
            color: "#fff",
            normal: {
              color: "#fff",
              width: 1,//尾迹线条宽度
              opacity: 0.5,//尾迹线条透明度
              curveness: 0.1,//尾迹线条曲直度
            },
          },
          //提示框信息
          tooltip: {
            formatter: function (param) {
              return (
                param.data.fromName +
                ">" +
                param.data.toName +
                "<br>数量:" +
                param.data.count
              );
            },
          },
          data: res, //拿到射线的起始点和结束点
        },
        //散点图
        {
          type: "effectScatter",//散点图
          coordinateSystem: "geo",//这个不能删,删了不显示
          zlevel: 1,
          rippleEffect: {
            //涟漪特效
            period: 4, //动画时间,值越小速度越快
            brushType: "stroke", //波纹绘制方式 stroke, fill
            scale: 4, //波纹圆环最大限制,值越大波纹越大
          },
          //设置文字部分
          label: {
            normal: {
              show: true, //省份名显示隐藏
              position: "right", //省份名显示位置
              offset: [5, 0], //省份名偏移设置
              formatter: function (params) {
                //圆环显示省份名
                return params.name;  //这个名字是根据data中的name来显示的
              },
              fontSize: 12,//文字大小
            },
            emphasis: {
              show: true,
            },
          },
          symbol: "circle",//散点图
          symbolSize: 5,//散点大小
          itemStyle: {//散点样式
            normal: {
              show: true,
              color: "#fff",
            },
          },
          data: data_res, //处理好后的散点图坐标数组
        },
        //点击高亮
        {
          type: "map",
          mapType: "china",
          zlevel: 1,
          roam: true,
          geoIndex: 0,
          tooltip: {
            show: true,
          },
          itemStyle: {
            areaColor: "#00196d",
            borderColor: "#0a53e9",
          },
          emphasis: {
            show: true,
            label: {
              normal: {
                show: true, // 是否显示对应地名
                textStyle: {
                  color: "#fff",
                },
              },
            },
            itemStyle: {
              areaColor: "#00196d",
              borderColor: "#0a53e9",
            },
          },
        }
      );
      //配置
      let option = {
        //title可要可不要

        // title: {
        //   text: "查查的地图",
        //   textStyle: {
        //     color: "#ffffff",
        //   },
        // },
        legend: {
          show: true,
          selected: {},
          x: "left",
          orient: "vertical",
          textStyle: {
            color: "white",
          },
          data: [],
        },
        //鼠标移上去的弹框
        tooltip: {
          trigger: "item",
          show: true,
        },
        //geo:这是重点
        geo: {
          map: "china", //中国地图
          zoom: 1.2, //缩放倍数
          roam: true, //是否允许缩放和拖拽地图
          label: {
            normal: {
              show: false, // 是否显示省份名字,现在是隐藏的状态,因为和散点图的名字重叠了。如果需要就true
              textStyle: {//名字的样式
                color: "#fff",
              },
            },
            emphasis: {
              show: true,
            },
          },
          //地图样式
          itemStyle: {
            normal: {
              borderColor: "#293171", //地图边框颜色
              borderWidth: "2", //地图边框粗细
              areaColor: "#0A0F33", //地图背景色
            },
            //省份地图阴影
            emphasis: {
              areaColor: null,
              shadowOffsetX: 0,
              shadowOffsetY: 0,
              shadowBlur: 20,
              borderWidth: 0,
              shadowColor: "#fff",
            },
          },
        },
        series: series,//图表配置
      };
      mapChart.setOption(option);//生成图表
    },
  },
};
</script>

<style lang="scss" scoped>
.managingPatientSize {
  height: 100%;
  background-color: #111b41;
  color: #fff;
  .el-row {
    height: 100%;
    .el-col {
      height: 100%;
      position: relative;
      #china-map {
        height: 100%;
      }
    }
  }
}
</style>

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
1. 安装 EChartsVue-ECharts ```bash npm install echarts vue-echarts ``` 2. 在 Vue 组件中使用 ECharts ```vue <template> <div ref="map" style="height: 500px"></div> </template> <script> import ECharts from 'vue-echarts/components/ECharts' import 'echarts/map/js/china' export default { components: { 'v-chart': ECharts }, mounted() { const chart = this.$refs.map.echarts chart.setOption({ tooltip: { trigger: 'item' }, visualMap: { min: 0, max: 2500, left: 'left', top: 'bottom', text: ['High', 'Low'], calculable: true }, series: [ { name: '地图', type: 'map', mapType: 'china', roam: false, itemStyle: { normal: { label: { show: true } }, emphasis: { label: { show: true } } }, data: [ { name: '北京', value: 500 }, { name: '上海', value: 700 }, { name: '广州', value: 1000 }, { name: '重庆', value: 1500 }, { name: '成都', value: 2500 } ] } ] }) } } </script> ``` 3. 在地图添加定点 ```vue <template> <div ref="map" style="height: 500px"></div> </template> <script> import ECharts from 'vue-echarts/components/ECharts' import 'echarts/map/js/china' export default { components: { 'v-chart': ECharts }, mounted() { const chart = this.$refs.map.echarts chart.setOption({ tooltip: { trigger: 'item' }, visualMap: { min: 0, max: 2500, left: 'left', top: 'bottom', text: ['High', 'Low'], calculable: true }, series: [ { name: '地图', type: 'map', mapType: 'china', roam: false, itemStyle: { normal: { label: { show: true } }, emphasis: { label: { show: true } } }, data: [ { name: '北京', value: 500 }, { name: '上海', value: 700 }, { name: '广州', value: 1000 }, { name: '重庆', value: 1500 }, { name: '成都', value: 2500 } ] }, { name: '定点', type: 'scatter', coordinateSystem: 'geo', data: [ { name: '北京', value: [116.46, 39.92] }, { name: '上海', value: [121.48, 31.22] }, { name: '广州', value: [113.23, 23.16] }, { name: '重庆', value: [106.54, 29.59] }, { name: '成都', value: [104.06, 30.67] } ], symbolSize: 10, label: { normal: { formatter: '{b}', position: 'right', show: true } } } ] }) } } </script> ``` 以上代码中,我们通过添加一个新的 `series` 来实现地图添加定点。`type` 属性设置为 `scatter`,表示散点图。`coordinateSystem` 属性设置为 `geo`,表示使用地理坐标系。`data` 属性设置为一个数组,每个元素表示一个定点,包括名字、经纬度等信息。`symbolSize` 属性表示定点的大小,`label` 属性表示在定点旁边显示名字。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

接口写好了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值