用Vue3+echarts实现可下钻地图(到市)

<template>
  <div id="main"></div>
  <button v-if="isDeep" @click="backToLastMap()">返回上一层</button>
</template>
<script setup>
import { onMounted, ref } from 'vue';
import * as echarts from 'echarts';
import axios from 'axios';
import { message } from 'ant-design-vue';

const myChart = ref();
const isDeep = ref(false);
const historyMapData = ref([]);
const chartMap = () => {
  myChart.value = echarts.init(document.getElementById('main'));
  initMap(myChart, '中华人民共和国', '100000', false);
  myChart.value.on('click', (e) => {
    const provinceName = e.name;
    const provinceAdcode = e.data.value.adcode;
    if (provinceAdcode !== '100000') {
      isDeep.value = true;
    }
    initMap(myChart, provinceName, provinceAdcode);
  });
};

// 返回上一级
const backToLastMap = () => {
  historyMapData.value.pop();
  const lastMapData = historyMapData.value[historyMapData.value.length - 1];
  const { geoName, adcode } = lastMapData;
  if (adcode === '100000') {
    isDeep.value = false;
  }
  initMap(myChart, geoName, adcode);
};
// 初始化地图
const initMap = async (chartDOM, geoName, adcode) => {
  chartDOM.value.showLoading();
  // 获取地图JSON数据,注册地图。
  try {
    const mapData = await getMapJSON(adcode, geoName);
    if (historyMapData.value.findIndex((i) => i.adcode === adcode) == -1) {
      historyMapData.value.push({ geoName, adcode });
    }

    // 获取地图配置项,生成地图
    const option = getOption(geoName, mapData);
    chartDOM.value.setOption(option);
  } catch (error) {
    return message.info('已经是最后一层了。');
  } finally {
    chartDOM.value.hideLoading();
  }
};
let a = '';
// 获取地图数据
const getMapJSON = async (adcode = '100000', geoName) => {
  if (adcode === a) {
    throw new Error('已经是最后一层了。');
  }
  const res = await axios.get(
    `https://geo.datav.aliyun.com/areas_v2/bound/${adcode}_full.json`
  );
  a = adcode;
  echarts.registerMap(geoName, res.data);

  const mapData = res.data.features.map((item) => {
    return {
      value: item.properties,
      name: item.properties.name,
    };
  });
  return mapData;
};

// 获取地图配置
const getOption = (geoName, mapData) => {
  const option = {
    title: { text: geoName },
    tooltip: {
      trigger: 'item',
    },
    series: [
      {
        type: 'map',
        map: geoName,
        data: mapData,
      },
    ],
    animation: true,
  };
  return option;
};
onMounted(() => {
  chartMap();
});
</script>
<style>
#main {
  width: 80%;
  height: 600px;
}
</style>

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值