什么是地图下钻

是一种交互式的数据可视化技术,允许用户从较高层级的地理区域(如国家或省级)逐步深入到更精细的层级(如市、区或者县等),以便查看更详细的数据。用户可以点击某个省份,下钻到市级地图,再进一步下钻到区县级地图。

如何实现地图下钻

准备dom元素

<template>
  <n-button @click="back()" v-if="backBtn">返回上一级</n-button>
  <div id="map-dom" class="map-box"></div>
</template>

准备地图数据

可以通过一个小工具获取  datav.aliyun.com/portal/scho…

复制url,通过请求获取地图所需的数据

先获取地图数据,再初始化echarts图表

设置函数默认参数,后续通过点击地图传过来的值来获取下钻目标所需的数据。

onMounted(() => {
  getMapJson()
})
//获取地图数据
const getMapJson = async (adcode = '100000', _level_ = '') => {
  // district是最后一级
  if (_level_ == 'district') return
  // adcode为 100000 表示中国, 最高层级 所以 backBtn 为 false
  adcode == '100000' ? (backBtn.value = false) : (backBtn.value = true)
  let url = `https://geo.datav.aliyun.com/areas_v3/bound/${adcode}_full.json`
  let res = await fetch(url)
  let json
  let data
  if (res.ok) {
    json = await res.json()
    data = json.features.map((item) => ({
      name: item.properties.name, 
      adcode: item.properties.adcode,
      parent: item.properties.parent,
      level: item.properties.level,
      _level_: item.properties.level,
    }))
    //获取到 地图数据再初始化echarts
    initCharts(data, json)
  }
}

初始化图表

初始化的时候接收了两个参数,data是给series提供数据,监听echarts点击事件的时候会用到,json是注册地图使用的。

当点击事件触发时会掉接口获取下一级地图所需数据,获取到数据之后再初始化echarts图表,方可显示下一级的地图;

点击的同时要把参数逐级存在数组当中,返回上一级的时候使用

//初始化echarts
const initCharts = async (data, json) => {
  //获取地图数据
  let myChart
  //获取dom
  let dom = document.getElementById('map-dom')
  myChart = echarts.getInstanceByDom(dom) // 获取已有的图表实例
  // 如果有实例,先销毁
  if (myChart) {
    myChart.dispose()
  }
  myChart = echarts.init(dom)
  // 注册地图
  echarts.registerMap('china', json)
  const option = {
    silent: false,
    geo: {
      type: 'map',
      map: 'china',
      roam: true, //允许缩放
      layoutCenter: ['50%', '50%'], // 让地图居中
      layoutSize: '100%', // 调整地图大小(可用 100% 或具体像素值)
      label: {
        show: true,
      },
    },
    series: [
      {
        type: 'map',
        map: 'china', // 地图名称
        geoIndex: 0,
        roam: true,
        data: data, // 地图数据
        label: {
          show: true,
        },
      },
    ],
  }
  myChart.setOption(option, true)
  // 点击地图事件
  myChart.on('click', function (params) {
    if (params.data) {
      const {
        adcode,
        name,
        level,
        parent: { adcode: parentAdcode },
      } = params.data
      if (level != 'district') {
        parentCode.value.push({ parentAdcode, level })
      }
      getMapJson(adcode as string, level as string)
    }
  })
}

 返回上一级

获取上一级的参数

获取到之后删除掉,不然下次还是获取到的还是一样的数据

// 返回上一级
let backBtn = ref(false)
let parentCode = ref([])
const back = () => {
//获取上一级的参数
  let { parentAdcode, level } = parentCode.value.slice(-1)[0]
//获取到之后删除掉,不然下次还是获取到的还是一样的数据
  parentCode.value = parentCode.value.slice(0, -1)
  getMapJson(parentAdcode, level)
}}