Vue+Echart实现地图省市区三级下钻

采用在线地图数据,整体简约,扩展也方便

参考

<template>
    <div>

        <div ref="mapContainer" style="width: 100%; height: 600px;"></div>
        <button @click="goBack">返回上一级</button>
    </div>
</template>

<script>
import * as echarts from 'echarts';
import axios from 'axios';
import router from '../router';

export default {
    name: 'ChinaMap',
    data() {
        return {
            currentLevel: 'china',  // 当前显示的地图层级
            levelStack: [],          // 地图层级栈
            coordinates: [          // 标记点坐标
                { name: '北京', value: [116.405285, 39.904989] },
                { name: '上海', value: [121.473701, 31.230416] }
            ]
        };
    },
    mounted() {
        this.loadMapData();
    },
    watch: {
        '$route.query.code': function () {
            // 当路由参数变化时重新加载地图数据
            this.loadMapData();
        }
    },
    methods: {
        goBack() {
            router.push({ query: { code: this.$route.query.fromCode } });
        },
        async loadMapData() {
            try {
                const adcode = this.$route.query.code || '100000';  // 默认加载中国地图

                // 获取 geoJSON 数据
                const response = await axios.get(`https://geo.datav.aliyun.com/areas_v3/bound/${adcode}_full.json`);
                const chinaGeoJson = response.data;

                // 注册地图
                echarts.registerMap(adcode, chinaGeoJson);

                // 提取 adcode 映射表
                const adcodeMap = this.extractAdcodeMap(chinaGeoJson);

                // 初始化 ECharts 实例
                const chart = echarts.init(this.$refs.mapContainer);

                // 配置项
                const option = {
                    title: {
                        text: '中国地图',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'item',
                        formatter: function (params) {
                            const adcode = adcodeMap[params.name] || '未知';
                            return `${params.name}<br>adcode: ${adcode}`;
                        }
                    },
                    visualMap: {
                        min: 0,
                        max: 100000,
                        text: ['High', 'Low'],
                        calculable: true
                    },
                    series: [
                        {
                            name: '数值',
                            type: 'map',
                            map: adcode,  // 使用 adcode 作为地图名称
                            roam: true,
                            itemStyle: {
                                areaColor: '#d3d3d3',  // 默认区域颜色
                                borderColor: '#111',   // 边框颜色
                                borderWidth: 1         // 边框宽度
                            },
                            emphasis: {
                                focus: 'self',
                                itemStyle: {
                                    areaColor: '#f4e925'  // 高亮颜色
                                }
                            },
                            data: [
                                { name: '北京市', value: 500, adcode: '110000' },
                                { name: '上海市', value: 11300, adcode: '310000' },
                                { name: '云南省', value: 300, adcode: '530000' },
                                { name: '广东省', value: 300, adcode: '440000' },
                                // 其他省份的数据
                            ]
                        },
                    ]
                };

                // 使用配置项设置图表
                chart.setOption(option);

                // 监听点击事件
                chart.on('click', (params) => {
                    const adcode = adcodeMap[params.name];
                    if (adcode) {
                        this.levelStack.push(this.currentLevel);  // 记录当前层级
                        this.currentLevel = adcode;  // 更新当前层级
                        router.push({ query: { code: adcode, fromCode: this.$route.query.code } });
                    }
                });
            } catch (error) {
                console.error('Failed to load map data:');
            }
        },

        extractAdcodeMap(geoJson) {
            const adcodeMap = {};
            geoJson.features.forEach(feature => {
                const name = feature.properties.name;
                const adcode = feature.properties.adcode;
                if (name && adcode) {
                    adcodeMap[name] = adcode;
                }
            });
            return adcodeMap;
        }
    }
}
</script>

效果

省级

市级

县级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值