vue中使用echarts 制作某市某区各个街道镇的地图

项目中需要显示杭州余杭区地图,并且需要区分街道乡镇的行政边界;

效果如下:

  

 

实现步骤:

1. 引入echarts (简单,不知道的自行百度)

  相关options配置说明,mapOption 是主要配置seriesData 方法是用来组装散点图数据的,代码如下:

 

export const mapOption = {
  title: {
    text: '余杭区',
    show: false
  },
  tooltip: {
    trigger: 'item',
    confine:true,
    position: 'top',
    formatter: (params) => {
      return `<div style="padding:5px;"><span style="color:#FFF;font-size: 14px;">${params.data.name}</span><br /><span style="font-size: 12px;color:#7FC8EF;line-height:16px">物业公司 : ${params.data.companyName}<br />联系信息 : ${params.data.connectMsg}</span></div>`;
    },
  },
  geo: {
    map: 'yuhang',
    aspectScale: 1,   // 地图宽高比
    width: '100%',
    left: '0',
    // roam: true,
    itemStyle: {
      areaColor: '#1B417D', // 地图颜色
      borderColor: '#326DDD', // 边框颜色
      borderWidth: 2, // 地图描边线宽
      shadowBlur: 10, // 设置阴影宽度
      shadowColor: 'rgba(255, 255, 255, .2)' // 设置阴影颜色
    },
    label: {
      show: true, // 高亮时不显示标题
      color: '#0074B3'
    },
    emphasis: {
      label: {
        show: false // 高亮时不显示标题
      },
      itemStyle: {
        areaColor: '#0074B3', // 高亮时颜色
        borderColor: '#0074B3' // 高亮时颜色
      }
    }
  },
  color: [/* 动态 */],
  legend: {
    right: 0,
    bottom: 30,
    show: false,
    data: [/* 动态 */],
    type: 'scroll',
    orient: 'vertical',
    textStyle: {
      color: '#fff'
    },
    formatter: function (name) {
      return name.split('&')[0].toString();
    }
  },
  series: [/* 动态 */]
};

export function seriesData() {
  return {
    type: 'effectScatter',
    name: '', /* 动态 */
    coordinateSystem: 'geo',
    legendHoverLink: true,
    data: [
      /* 动态 */
      { name: '1', value: [120.224326, 30.441409] }
    ],
    encode: {},
    // 点的大小
    symbolSize: function () {
      return 10;
    },
    // 何时显示动效
    showEffectOn: 'render',
    // 设置动效效果
    rippleEffect: {
      brushType: 'fill',
      scale: 4
    },

    // 高亮的标签和图形样式
    emphasis: {
      label: {

        show: false,
        formatter: (params) => {
          console.log(params);
          /*
          * "{a|这段文本采用样式a}{b|这段文本采用样式b}这段用默认样式{x|这段用样式x}"
          * */
          return `{a|${params.data.name}\n}{b|物业公司 : ${params.data.companyName}\n}{b|联系信息 : ${params.data.connectMsg}\n}`;
        },
        rich: {
          a: {
            // backgroundColor: 'rgba(0,0,0,.5)',
            lineHeight: 24,
            color: '#FFF',
            fontSize: 14,
            padding: [10, 15],
          },
          b: {
            // backgroundColor: 'rgba(0,0,0,.5)',
            lineHeight: 20,
            // color: '#7FC8EF',
            color: '#FFF',
            padding: [10, 15],
          }
        }
      }
    },
    label: {
      formatter: '{b}',
      position: 'top',
      distance: 5, // 与图形元素的距离
      show: false
    },

    itemStyle: {
      color: 'red', /* 动态 */
      shadowColor: 'red', /* 动态 */
      shadowBlur: 8
    }
  };
}
View Code

 

2. vue 文件中初始化echarts并调用配置方法:


....
// mapoption 文件保存了第一步中的设置
import { mapOption, seriesData } from '../ecahrtsDataSet/mapOption';
.....

mounted() {
// 这里把按需加载的echarts放到了Vue原型上,yuhangMapJson 是自定义的地图数据,registerMap方法的第一个参数'yuhang' 要和第一步option中geo.map 属性相对应 this.$echarts.registerMap('yuhang', yuhangMapJson); this.chartInstance = this.$echarts.init(document.getElementById('conteiner')); // 初始化实例并保存,为数据请求完成后显示散点图
   this.setMapOption() // 调用第三步中methods中方法渲染地图
},

3.设置散点图数据,渲染地图:

// 设置地图及打点参数
    setMapOption() {
      mapOption.color = this.pointColor; // pointData 是散点图数据结构 [{name:'xxx',value:'xxx'}]
      mapOption.series = this.pointData.reduce((res, cur, index) => {
        const itemData = seriesData();
        itemData.name = cur.name;
        itemData.data = [cur];
        itemData.itemStyle.color = this.pointColor[index];
        itemData.itemStyle.shadowColor = this.pointColor[index];
        res.push(itemData);
        return res;
      }, []);
      this.echartsOption = mapOption;
   
this.chartInstance.setOption(mapOption);
},

至此地图就出现在屏幕上了!!

在这个过程中最麻烦的就是获取自定义的地图 json 数据了,大致过程如下:

1.通过这个地址拿到杭州余杭区地图轮廓数据 http://datav.aliyun.com/tools/atlas/#&lat=30.332329214580188&lng=106.72278672066881&zoom=3.5 

2. 通过 bigMap 软件拿到下级街道及乡镇的地图轮廓数据,软件下载地址: http://www.bigemap.com/reader/download/detail201802016.html

3.在这个网站上拼接乡镇街道json数据数据 : http://geojson.io/#map=10/30.3628/120.0127 

!!! 也有简单的方法,淘宝上有卖的,三十块钱,我是出于一个不是很菜的前端的倔强没有买,毕竟是工作,自己出钱觉得亏,报销吧 30 不值得。

希望能帮助到个位小伙伴!

可私信交流,或者微信 wl1004516 :

 

posted @ 2020-12-24 12:12  lence  阅读(955)  评论(0)    收藏  举报