vue+echarts绘制省份地图并添加自定义标注方式

echarts绘制省份地图并添加自定义标注

效果图

-1

在main.js中引入地图

  1. import echarts from ‘echarts’
  2. vue.prototype.$echarts = echarts;

省份是动态引入的,在.vue文件中

html部分

  1. <div id=“province_map_box”>
  2.      <div id=province_map”></div>
  3. </div>

css部分

  1. <style lang=“scss” scoped>
  2.      #province_map_box {
  3.      height: 500px;
  4.      position: relative;
  5.      }
  6.      #province_map_box #province_map{
  7.      height: 100%;
  8.      }
  9.      #province_map_box .province_map_logo{
  10.      position: absolute;
  11.      top: 0;
  12.      left: 0;
  13.      width:45px;
  14.      }
  15. </style>
  16. <style lang=“scss”>
  17.      #province_map.tooltip_style{
  18.      lineheight:1.7;
  19.      overflow: hidden;
  20.      }
  21.      #province_map.tooltip_left{
  22.      float: left;
  23.      }
  24.      #province_map.tooltip_right{
  25.      float: right;
  26.      }
  27. </style>

script部分

  1. data () {
  2.      return {
  3.      options: {
  4.      geo: {
  5.      map: “city”,
  6.      scaleLimit: {
  7.      min: 1,
  8.      max: 2
  9.      },
  10.      zoom: 1,
  11.      top: 20,
  12.      label: {
  13.      normal: {
  14.      show:false,
  15.      fontSize: “14”,
  16.      color: “rgba(0,0,0,0.7)”
  17.      },
  18.      emphasis: {
  19.      color: ‘#fff’
  20.      }
  21.      },
  22.      itemStyle: {
  23.      normal: {
  24.      borderColor: “rgba(0, 0, 0, 0.2)”,
  25.      areaColor: “#3b9cff”,//设置地图区域背景色
  26.      },
  27.      emphasis: {
  28.      areaColor: “#3b9cff”,
  29.      shadowOffsetX: 0,
  30.      shadowOffsetY: 0
  31.      }
  32.      }
  33.      },
  34.      series: [
  35.      {
  36.      name: ‘省份’,
  37.      type: ‘map’,
  38.      geoIndex: 0,
  39.      map: ‘province’,
  40.      data:[]
  41.      },
  42.      {
  43.      name: ‘企业分布’, //红色标注
  44.      type: ‘custom’,
  45.      coordinateSystem: ‘geo’,
  46.      clickable:true,
  47.      data:[]
  48.      }
  49.      ]
  50.      }
  51.      },
  52.      cityJson: {
  53.          features: []
  54.      }
  55. },
  56. created(){
  57.      this.city = this.$route.query.city
  58. },
  59. mounted() {
  60.      this.$nextTick(()=>{
  61.          this.initEchartMap()
  62.      })
  63. },
  64. methods:{
  65.      //初始化中国地图
  66.      initEchartMap() {
  67.          let mapDiv = document.getElementById(‘japan_map’)
  68.          let myChart = this.$echarts.init(mapDiv)
  69.          let city = this.city
  70.          //动态引入省份json文件
  71.          this.cityJson = require(`echarts/map/json/province/${city}.json`)
  72.          this.$echarts.registerMap(‘city’, this.cityJson, {})
  73.          this.setEchartOption()
  74.          myChart.setOption(this.options)
  75.      //可为自定义图标添加点击事件
  76.          myChart.on(‘click’, {element: ‘aaa’}, (params) => {
  77.          // todo: 当 name 为 ‘aaa’ 的图形元素被点击时,此回调被触发。
  78.          });
  79.      },
  80.      //修改echart配制
  81.      setEchartOption(){
  82.      //红色标注点的坐标
  83.          let markList = [
  84.              { name: ‘五常’, value: [123.523565,52.920114] },
  85.              { name: ‘中治’, value: [126.319954,46.400728] },
  86.              { name: ‘中顺’, value: [133.310927,47.271857] },
  87.              { name: ‘常也’, value: [129.631468,45.65747] },
  88.              { name: ‘可谭’, value: [130.551333,47.321922] },
  89.              { name: ‘顺允’, value: [125.436884,48.460261] },
  90.          ]
  91.          this.options.series[1].data = markList
  92.          if(markList.length>0){
  93.      this.options.series[1].renderItem = function(params,api){
  94.              return {
  95.      type: ‘image’,
  96.      name: ‘aaa’,
  97.      style: {
  98.      image: require(“@/assets/img/icon_mark.png”), //标注点图标
  99.      width: 14,
  100.      height: 18,
  101.      x: api.coord([markList[params.dataIndex].value[0], markList[params.dataIndex].value[1]])[0],
  102.      y: api.coord([markList[params.dataIndex].value[0], markList[params.dataIndex].value[1]])[1]
  103.              }
  104.              }
  105.          }
  106.          }
  107.      }
  108. }

注: echarts v4.2.1版本安装后会有地图json文件

-2

echarts添加地图标点(笔记)

如图:

-3

实例html:

  1. <!DOCTYPE html>
  2. <html style=height: 100%>
  3.      <head>
  4.          <meta charset=“utf-8”>
  5.      </head>
  6.      <body style=height: 100%; margin: 0>
  7.          <div id=“container” style=height: 100%></div>
  8.          <script type=“text/Javascript” src=“https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js”></script>
  9.          <!– <script type=”text/javascript” src=”https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js”></script> –>
  10.          <!– <script type=”text/javascript” src=”https://cdn.jsdelivr.net/npm/echarts-stat/dist/ecStat.min.js”></script> –>
  11.          <!– <script type=”text/javascript” src=”https://cdn.jsdelivr.net/npm/echarts/dist/extension/dataTool.min.js”></script> –>
  12.          <script type=“text/javascript” src=“https://cdn.jsdelivr.net/npm/echarts/map/js/china.js”></script>
  13.          <script type=“text/javascript” src=“E:\incuBATor-echarts-4.8.0\map\js\province\guangxi.js”></script>
  14.          <!– <script type=”text/javascript” src=”https://cdn.jsdelivr.net/npm/echarts/map/js/world.js”></script> –>
  15.          <!– <script type=”text/javascript” src=”https://api.map.baidu.com/api?v=2.0&ak=xfhhaTThl11qYVrqLZii6w8qE5ggnhrY&__ec_v__=20190126″></script>
  16.          <script type=”text/javascript” src=”https://cdn.jsdelivr.net/npm/echarts/dist/extension/bmap.min.js”></script> –>
  17.          <script type=“text/javascript”>
  18. var dom = document.getElementById(“container”);
  19. var myChart = echarts.init(dom);
  20. var app = {};
  21. option = null;
  22. var geoCoordMap = {
  23.      “南宁医院”:[108.324994,22.810701]
  24. };
  25. var convertData = function (data) {
  26.      var res = [];
  27.      for (var i = 0; i < data.length; i++) {
  28.          var geoCoord = geoCoordMap[data[i].name];
  29.          if (geoCoord) {
  30.              res.push(geoCoord.concat(data[i].value).concat(data[i].name));
  31.          }
  32.      }
  33.      console.log(res);
  34.      return res;
  35. };
  36. option = {
  37.      backgroundColor: ‘#fff’,
  38.      title: {
  39.          text: ‘广西区合作医院分布’,
  40.          subtext: ‘data from 数字广润’,
  41.          sublink: ‘http://gxgrtech.com.cn/’,
  42.          left: ‘center’,
  43.          textStyle: {
  44.              color: ‘#000’
  45.          }
  46.      },
  47.      tooltip: {
  48.          trigger: ‘item’,
  49.          //formatter: “名称:{a}<br />坐标:{c}”
  50.          formatter:function(params){
  51.              console.log(params);
  52.              console.log(params.data[3]);
  53.              var res = ‘名称:’+params.data[3]+‘<br/>’;
  54.              return res;
  55.          }
  56.      },
  57.      legend: {
  58.          orient: ‘vertical’,
  59.          top: ‘bottom’,
  60.          left: ‘right’,
  61.          data:[‘医院’],
  62.          textStyle: {
  63.              color: ‘#fff’
  64.          }
  65.      },
  66.      visualMap: {
  67.          min: 0,
  68.          max: 300,
  69.          splitNumber: 5,
  70.          color: [‘#d94e5d’,‘#eac736’,‘#50a3ba’],
  71.          textStyle: {
  72.              color: ‘#fff’
  73.          },
  74.          dimension:3
  75.      },
  76.      geo: {
  77.          map: ‘广西’,
  78.          label: {
  79.              normal: {
  80.                  show:true,
  81.                  areaColor: ‘#ffefd5’,
  82.                  borderColor: ‘#111’,
  83.                  textStyle:{color:“#c71585”}
  84.              },
  85.              emphasis: {
  86.                  show: false,
  87.                  textStyle:{color:“#fff”}
  88.              }
  89.          },
  90.          itemStyle: {
  91.              normal: {
  92.                  show:false,
  93.                  areaColor: ‘#ffefd5’,
  94.                  borderColor: ‘#009fe8’
  95.              },
  96.              emphasis: {
  97.                  show:false,
  98.                  areaColor: ‘#f47920’
  99.              }
  100.      }
  101.      },
  102.      series: [
  103.          {
  104.              name: ‘医院’,
  105.              type: ‘scatter’,
  106.              coordinateSystem: ‘geo’,
  107.              data: convertData([
  108.                  {name: “南宁医院”, value: 9}
  109.              ]),
  110.              encode: {
  111.                  value: 2
  112.              },
  113.              symbolSize: 12,
  114.              label: {
  115.                  normal: {
  116.                      show: false,//显示市区标签
  117.                      textStyle:{color:“#c71585”}//省份标签字体颜色
  118.                      },
  119.                  emphasis: {//对应的鼠标悬浮效果
  120.                      show: true, //关闭文字 (这东西有问题得关)
  121.                      textStyle:{color:“#800080”}
  122.                  }
  123.              },
  124.              itemStyle: {
  125.                  normal: {
  126.                      borderWidth: .5,//区域边框宽度
  127.                      borderColor: ‘#009fe8’,//区域边框颜色
  128.                      areaColor:“#ffefd5”,//区域颜色
  129.                      },
  130.                  emphasis: {
  131.                      show:true,
  132.                      borderWidth: .5,
  133.                      borderColor: ‘#4b0082’,
  134.                      areaColor:“#f47920”,
  135.                  }
  136.              }
  137.          }
  138.      ]
  139. };
  140. if (option && typeof option === “object”) {
  141.      myChart.setOption(option, true);
  142. }
  143.          </script>
  144.      </body>
  145. </html>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

标签

发表评论