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