Vue 使用 Echarts + 高德地图Api 实现 地图下钻

 1、 安装 echarts

npm install echarts

2、引入

import * as echarts from 'echarts'

 3、在 index.html 中引入高德地图

<script src='http://webapi.amap.com/maps?v=1.3&key='你申请的key'&plugin=AMap.DistrictSearch'></script>

<script src="//webapi.amap.com/ui/1.0/main.js"></script>

 4、在 vue 中使用

<template>
  <div class="echarts">
    <div style="width: 100; height: 100%" ref="sctterMap"></div>
    <a-button v-if="parentInfo.length > 1" class="back" @click="back">
      返回
    </a-button>
    <div class="mapChoose">
      <span v-for="(item, index) in parentInfo" :key="item.code">
        <span class="title" @click="chooseArea(item, index)">{{
          item.cityName == '全国' ? '中国' : item.cityName
        }}</span>
        <span class="icon" v-show="index + 1 != parentInfo.length">></span>
      </span>
    </div>
  </div>
</template>

<style  scoped>
.echarts {
  width: 100%;
  height: 100%;
  position: relative;
}

.mapChoose {
  position: absolute;
  left: 20px;
  top: 55px;
  color: #3555f5;
}
.mapChoose .title {
  padding: 5px;
  border-top: 1px solid rgba(52, 52, 239, 0.8);
  border-bottom: 1px solid rgba(52, 52, 239, 0.8);
  cursor: pointer;
}

.mapChoose .icon {
  font-family: 'simsun';
  font-size: 25px;
  margin: 0 11px;
}
.back {
  position: absolute;
  right: 30px;
  top: 20px;
}
</style>

export default {
  name: 'Map',
  data() {
    return {
      myCharts: null,
      geoJson: {
        features: [],
      },
      parentInfo: [
        {
          cityName: '全国',
          code: 100000,
        },
      ],
    }
  },
  mounted() {
    this.getGeoJson(this.parentInfo[0].code)
  },
  methods: {
    getGeoJson(adcode) {
      let that = this
      AMapUI.loadUI(['geo/DistrictExplorer'], (DistrictExplorer) => {
        var districtExplorer = new DistrictExplorer()
        districtExplorer.loadAreaNode(adcode, function (error, areaNode) {
          if (error) {
            console.error(error)
            return
          }
          let Json = areaNode.getSubFeatures()
          if (Json.length > 0) {
            that.geoJson.features = Json
          } else if (Json.length === 0) {
            that.geoJson.features = that.geoJson.features.filter(
              (item) => item.properties.adcode == adcode
            )
            if (that.geoJson.features.length === 0) return
          }
          that.getMapData(adcode)
        })
      })
    },
    //获取数据
    getMapData(adcode) {
      let mapData = this.geoJson.features.map((item) => {
        return {
          name: item.properties.name,
          value: Math.random() * 1000,
          cityCode: item.properties.adcode,
        }
      })

      mapData = mapData.sort(function (a, b) {
        return b.value - a.value
      })
      this.initEcharts(mapData)
    },
    initEcharts(mapData) {
      var min = mapData[mapData.length - 1].value
      var max = mapData[0].value
      if (mapData.length === 1) {
        min = 0
      }
      this.myChart = echarts.init(this.$refs.sctterMap)
      echarts.registerMap('Map', this.geoJson) //注册
      this.myChart.setOption(
        {
          title: {
            show: true,
            left: 'center',
            top: '15',
            text: this.parentInfo[this.parentInfo.length - 1].cityName + '地图',
            textStyle: {
              color: 'rgba(52, 52, 239, 0.8)',
              fontSize: 16,
            },
          },
          tooltip: {
            trigger: 'item',
            formatter: (p) => {
              let val = p.value
              if (!val) {
                val = 0
              }
              let txtCon = p.name + ':' + val.toFixed(2)
              return txtCon + '数量'
            },
          },

          toolbox: {
            feature: {
              restore: {
                show: false,
              },
              dataView: {
                optionToContent: function (opt) {
                  let series = opt.series[0].data //折线图数据
                  let tdHeads =
                    '<th  style="padding: 0 20px">所在地区</th><th style="padding: 0 20px">销售额</th>' //表头
                  let tdBodys = '' //数据
                  let table = `<table border="1" style="margin-left:20px;border-collapse:collapse;font-size:14px;text-align:left;"><tbody><tr>${tdHeads} </tr>`
                  for (let i = 0; i < series.length; i++) {
                    table += `<tr>
                              <td style="padding: 0 50px">${series[i].name}</td>
                              <td style="padding: 0 50px">${series[
                                i
                              ].value.toFixed(2)}万</td>
                              </tr>`
                  }
                  table += '</tbody></table>'
                  return table
                },
              },
              saveAsImage: {
                name:
                  this.parentInfo[this.parentInfo.length - 1].cityName + '地图',
              },
              dataZoom: {
                show: false,
              },
              magicType: {
                show: false,
              },
            },
            iconStyle: {
              normal: {
                borderColor: '#1990DA',
              },
            },
            top: 15,
            right: 35,
          },
          visualMap: {
            min: min,
            max: max,
            left: '3%',
            bottom: '5%',
            calculable: true,
            seriesIndex: [0],
            inRange: {
              color: ['#105389', '#3a8abc', '#0D96F1'],
            },
            textStyle: {
              color: '#24CFF4',
            },
          },
          series: [
            {
              name: '地图',
              type: 'map',
              map: 'Map',
              roam: true, //是否可缩放
              zoom: 1.1, //缩放比例
              data: mapData,
              label: {
                normal: {
                  show: true,
                  color: 'rgb(249, 249, 249)', //省份标签字体颜色
                  formatter: (p) => {
                    switch (p.name) {
                      case '内蒙古自治区':
                        p.name = '内蒙古11'
                        break
                      case '西藏自治区':
                        p.name = '西藏'
                        break
                      case '新疆维吾尔自治区':
                        p.name = '新疆'
                        break
                      case '宁夏回族自治区':
                        p.name = '宁夏'
                        break
                      case '广西壮族自治区':
                        p.name = '广西'
                        break
                      case '香港特别行政区':
                        p.name = '香港'
                        break
                      case '澳门特别行政区':
                        p.name = '澳门'
                        break
                      default:
                        break
                    }
                    return p.name
                  },
                },
                emphasis: {
                  show: true,
                  color: '#f75a00',
                },
              },
              itemStyle: {
                normal: {
                  areaColor: '#24CFF4',
                  borderColor: '#53D9FF',
                  borderWidth: 1.3,
                  shadowBlur: 15,
                  shadowColor: 'rgb(58,115,192)',
                  shadowOffsetX: 7,
                  shadowOffsetY: 6,
                },
                emphasis: {
                  areaColor: '#8dd7fc',
                  borderWidth: 1.6,
                  shadowBlur: 25,
                },
              },
            },
          ],
        },
        true
      )
      let that = this
      this.myChart.off('click')
      this.myChart.on('click', (params) => {
        if (
          that.parentInfo[that.parentInfo.length - 1].code ==
          params.data.cityCode
        ) {
          return
        }

        let data = params.data
        that.parentInfo.push({
          cityName: data.name,
          code: data.cityCode,
        })
        that.getGeoJson(data.cityCode)
      })
    },

    //选择切换市县
    chooseArea(val, index) {
      if (this.parentInfo.length === index + 1) {
        return
      }
      this.parentInfo.splice(index + 1)
      this.getGeoJson(this.parentInfo[this.parentInfo.length - 1].code)
    },

    back() {
      if (this.parentInfo.length > 1) {
        this.parentInfo.splice(this.parentInfo.length - 1, 1)
        this.getGeoJson(this.parentInfo[this.parentInfo.length - 1].code)
      }
    },
  },
}

4、大功告成

 

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值