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

[复制链接]
发表于 2026-2-9 01:29:33 | 显示全部楼层 |阅读模式
接纳在线舆图数据,团体简约,扩展也方便
参考
  1. <template>
  2.     <div>
  3.         <div ref="mapContainer" style="width: 100%; height: 600px;"></div>
  4.         <button @click="goBack">返回上一级</button>
  5.     </div>
  6. </template>
  7. <script>
  8. import * as echarts from 'echarts';
  9. import axios from 'axios';
  10. import router from '../router';
  11. export default {
  12.     name: 'ChinaMap',
  13.     data() {
  14.         return {
  15.             currentLevel: 'china',  // 当前显示的地图层级
  16.             levelStack: [],          // 地图层级栈
  17.             coordinates: [          // 标记点坐标
  18.                 { name: '北京', value: [116.405285, 39.904989] },
  19.                 { name: '上海', value: [121.473701, 31.230416] }
  20.             ]
  21.         };
  22.     },
  23.     mounted() {
  24.         this.loadMapData();
  25.     },
  26.     watch: {
  27.         '$route.query.code': function () {
  28.             // 当路由参数变化时重新加载地图数据
  29.             this.loadMapData();
  30.         }
  31.     },
  32.     methods: {
  33.         goBack() {
  34.             router.push({ query: { code: this.$route.query.fromCode } });
  35.         },
  36.         async loadMapData() {
  37.             try {
  38.                 const adcode = this.$route.query.code || '100000';  // 默认加载中国地图
  39.                 // 获取 geoJSON 数据
  40.                 const response = await axios.get(`https://geo.datav.aliyun.com/areas_v3/bound/${adcode}_full.json`);
  41.                 const chinaGeoJson = response.data;
  42.                 // 注册地图
  43.                 echarts.registerMap(adcode, chinaGeoJson);
  44.                 // 提取 adcode 映射表
  45.                 const adcodeMap = this.extractAdcodeMap(chinaGeoJson);
  46.                 // 初始化 ECharts 实例
  47.                 const chart = echarts.init(this.$refs.mapContainer);
  48.                 // 配置
  49.                 const option = {
  50.                     title: {
  51.                         text: '中国地图',
  52.                         left: 'center'
  53.                     },
  54.                     tooltip: {
  55.                         trigger: 'item',
  56.                         formatter: function (params) {
  57.                             const adcode = adcodeMap[params.name] || '未知';
  58.                             return `${params.name}<br>adcode: ${adcode}`;
  59.                         }
  60.                     },
  61.                     visualMap: {
  62.                         min: 0,
  63.                         max: 100000,
  64.                         text: ['High', 'Low'],
  65.                         calculable: true
  66.                     },
  67.                     series: [
  68.                         {
  69.                             name: '数值',
  70.                             type: 'map',
  71.                             map: adcode,  // 使用 adcode 作为地图名称
  72.                             roam: true,
  73.                             itemStyle: {
  74.                                 areaColor: '#d3d3d3',  // 默认区域颜色
  75.                                 borderColor: '#111',   // 边框颜色
  76.                                 borderWidth: 1         // 边框宽度
  77.                             },
  78.                             emphasis: {
  79.                                 focus: 'self',
  80.                                 itemStyle: {
  81.                                     areaColor: '#f4e925'  // 高亮颜色
  82.                                 }
  83.                             },
  84.                             data: [
  85.                                 { name: '北京市', value: 500, adcode: '110000' },
  86.                                 { name: '上海市', value: 11300, adcode: '310000' },
  87.                                 { name: '云南省', value: 300, adcode: '530000' },
  88.                                 { name: '广东省', value: 300, adcode: '440000' },
  89.                                 // 其他省份的数据
  90.                             ]
  91.                         },
  92.                     ]
  93.                 };
  94.                 // 使用配置项设置图表
  95.                 chart.setOption(option);
  96.                 // 监听点击事件
  97.                 chart.on('click', (params) => {
  98.                     const adcode = adcodeMap[params.name];
  99.                     if (adcode) {
  100.                         this.levelStack.push(this.currentLevel);  // 记录当前层级
  101.                         this.currentLevel = adcode;  // 更新当前层级
  102.                         router.push({ query: { code: adcode, fromCode: this.$route.query.code } });
  103.                     }
  104.                 });
  105.             } catch (error) {
  106.                 console.error('Failed to load map data:');
  107.             }
  108.         },
  109.         extractAdcodeMap(geoJson) {
  110.             const adcodeMap = {};
  111.             geoJson.features.forEach(feature => {
  112.                 const name = feature.properties.name;
  113.                 const adcode = feature.properties.adcode;
  114.                 if (name && adcode) {
  115.                     adcodeMap[name] = adcode;
  116.                 }
  117.             });
  118.             return adcodeMap;
  119.         }
  120.     }
  121. }
  122. </script>
复制代码
结果

省级

市级

县级


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表