echarts中的地图如何添加小树(自定义图标)

这个就是最终效果

代码如下

<template>
  <ECharts ref="echartRef"
           :options="getMapOptions"
           :map="mapJSON"
           :showVisualMap="showVisualMap"
           @click="mapClick" />
</template>
<script>
import ECharts from '@/components/ECharts/ECharts.vue';

export default {
  name: 'ChartMap',
  components: {
    ECharts,
  },
  data() {
    return {
      // 图表数据
      // 杭州市市地图数据
      mapJSON: null,
      chartOtions: {
        // 热力图
        map: this.maps,
      },
      // 地图上的背景图
      hzImg: require('@/assets/archivelndl/others/green.jpg'),
      treeImg: require('@/assets/archivelndl/others/trees.png'),
      dldata: [
        {
          name: '中山区',
          value: '23',
        },
        {
          name: '西岗区',
          value: '2',
        },
        {
          name: '沙河口区',
          value: '63',
        },
        {
          name: '甘井子区',
          value: '64',
        },
        {
          name: '旅顺口区',
          value: '2',
        },
        {
          name: '金普新区',
          value: '64',
        },
        {
          name: '普兰店区',
          value: '8',
        },
        {
          name: '长海县',
          value: '56',
        },
        {
          name: '瓦房店市',
          value: '3',
        },
        {
          name: '庄河市',
          value: '34',
        },
      ],
    };
  },
  props: {
    maps: {
      type: Array,
      default: () => [],
    },
    option: {
      type: Object,
      default: () => {},
    },
    // 是否展示热力系数
    showVisualMap: {
      type: Boolean,
      default: false,
    },
  },
  created() {
    const { region } = process.env.PROJECT_CONFIG.common;
    // eslint-disable-next-line import/no-dynamic-require
    this.mapJSON = require(`./map/${region}`);
  },

  methods: {
    // 热力图点击
    mapClick(params) {
      this.$emit('click', params);
    },
  },
  computed: {
    getMapOptions() {
      const dlmap = {
        中山区: [121.64376, 38.921553],
        西岗区: [121.616112, 38.914266],
        沙河口区: [121.593702, 38.912859],
        甘井子区: [121.582614, 38.975148],
        旅顺口区: [121.26713, 38.812043],
        金普新区: [121.789413, 39.052745],
        普兰店区: [121.9705, 39.401555],
        长海县: [122.587824, 39.272399],
        瓦房店市: [122.002656, 39.63065],
        庄河市: [122.970612, 39.69829],
      };
      const data = this.chartOtions.map;
      const lineMaxHeight = () => {
        const maxValue = Math.max(...this.dldata.map((item) => item.value));
        return 0.00001;
      };
      const dlMapData = () =>
        this.dldata.map((item) => ({
          coords: [dlmap[item.name], [dlmap[item.name][0], dlmap[item.name][1] + item.value * lineMaxHeight()]],
        }));
      // 从返回的数据获取最大值
      const max = Math.max(...this.dldata.map((t) => t.value), 10);
      const min = Math.min(...this.dldata.map((t) => t.value), 10);
      /* eslint-disable */
      const imgDom = new Image();
      imgDom.src = this.hzImg;
      imgDom.alt = 'png';
      return {
        tooltip: {
          trigger: 'item',
          formatter: (params) => {
            // if (!Number.isNaN(params.value)) {
              return `${params.name}:扣${params.value}分`;
            // }
            // return `${params.name}`;
          },
        },
        visualMap: {
          min: 0,
          max: 100,
          show: false,
          calculable: false,
          inRange: {
            color: ['green', 'green'],
          },
        },
        series: [
          {
            type: 'map',
            map: 'MAP',
            aspectScale: 1, // 长宽比
            zoom: 1.1, // 当前视角的缩放比例。
            roam: false, // 是否开启鼠标缩放和平移漫游
            layoutSize: '82%',
            zlevel: 1, // 设置图层堆叠顺序
            layoutCenter: ['50%', '50%'],
            label: {
              normal: {
                show: true, // 默认显示地图上的label
                color: '#fff',
                fontSize: 14,
              },
            },
            itemStyle: {
              normal: {
                borderColor: '#fff', // 区域边框颜色
                borderWidth: 0.2, // 区域边框宽度
                borderType: 'solid', // 区域边框类型
                areaColor: '#30bc59',
                opacity: 0.6, // 透明度
              },
              emphasis: {
                areaColor: {
                  image: imgDom, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串 这个是背景图片
                  repeat: 'repeat',
                  colorStops: [
                    {
                      offset: 0,
                      color: '#30bc59', // 0% 处的颜色
                    },
                    {
                      offset: 1,
                      color: '#30bc59', // 50% 处的颜色
                    },
                  ],
                },
                borderWidth: 1,
                borderColor: '#30bc59',
                label: {
                  color: '#30bc59',
                },
                opacity: 1,
              },
            },
            data: this.map,
          },
          {
            type: 'lines',
            zlevel: 10,
            symbol:'image://'+ require('@/assets/archivelndl/others/tree.png'),//这个就是图标啦
            symbolRotate: 0,
            symbolKeepAspect:true,
            showAllSymbol:false,
            symbolOffset: [0, 0],
            symbolSize: [0, 50], // 图标大小,前面那个设置为0,是因为打开的话可能会出现镜像的树
            color: '#30bc59',
            effect: {
              show: false,
            },
            lineStyle: {
              width: 40, // 尾迹线条宽度
              color: '#30bc59',
              opacity: 0, // 尾迹线条透明度
              curveness: 0, // 尾迹线条曲直度
            },
            label: {
              show: 0,
              position: 'end',
              formatter: '0',
            },
            silent: true,
            data: dlMapData(),
          },
        ],
        geo: [
          {
            map: 'MAP',
            show: false,
            aspectScale: 1, //长宽比
            zoom: 1,
            layoutSize: '100%',
            layoutCenter: ['50%', '50%'],
            roam: false,
            zlevel: 0, // 设置图层堆叠顺序
            transform: {
              rotateX: 200, // 设置地图倾斜角度
            },
            itemStyle: {
              normal: {
                areaColor: '#30bc59',
                borderColor: '#30bc59',
                shadowBlur: 2,
                borderWidth: 0,
                shadowColor: '#30bc59',
                shadowOffsetX: 0,
                shadowOffsetY: 35,
              },
            },
            silent: true,
          },
        ],
      };
    },
  },
  mounted() {
  },
};
</script>
<style  rel="stylesheet/scss" lang="scss" scoped>
.map-wrp {
  width: 100%;
  height: 100%;
}
</style>

上述就是地图组件的开发

在父组件使用的代码如下

//其他代码省略哦,下述就是组件引用代码
        <DlMap :style="{width:'100%'}"
                  class="main-map"
                  :mapData="maps"
                  :showVisualMap="true"
                  :option="option"
                  @click="mapClick" />
//script部分
import DlMap from '@/components/ECharts/DlMap.vue';
//data中的部分
// 左边地区清单
      maps: [],
      
  computed: {
    // 额外配置
    option() {
      return {
      //这边也可以加一些配置,用来改变地图中的一些参数
      };
    },
  },
  //具体的点击方法
  
    // 地区点击事件
    mapClick(params) {
      // 地区加权限功能
      if (params.data.isAuth === 1) {
        // name为跳转路由页面名字
        this.$store.dispatch('openNewLabelPage', {
          name: 'SelectDeptLeader',
          id: params.data.id,
          pageName: '请勾选单位档案查看权限',
          // 当有表格的时候判断是否显示功能按钮
          tableVisibleList: false,
        });
      }
    },

以上部分为全部代码,具体使用还是需要根据项目进行修改的,欢迎大家指正和评论哦~

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值