Vue + ECharts 实现山东地图展示与交互

这篇文章中,我将逐步介绍如何使用 Vue 和 ECharts 实现一个互动式的地图展示组件,其中支持返回上一层地图、点击查看不同城市的详细信息,以及根据数据动态展示不同的统计信息。

效果图:玩转山东地图:用Echarts打造交互式数据可视化--好玩篇_excharts 山东地图-CSDN博客

我将分为以下几部分进行详细讲解:

  1. 项目结构与组件基本框架
  2. ECharts 的基本配置与地图初始化
  3. 动态加载不同地区地图数据
  4. 地图交互:点击事件与返回上一层功能
  5. 自定义 Tooltip 和图标
  6. 样式与布局调整

1. 项目结构与组件基本框架

首先,定义了一个 Vue 组件 MapComponent,它将负责渲染地图、处理用户交互,并展示传递给它的数据。

html 复制代码
<template>
  <div class="map_style">
    <!-- 返回按钮,只有在有历史记录时显示 -->
    <Button
      type="primary"
      @click="goBack"
      class="go_back_index"
      v-if="mapStack.length > 1"
    >返回</Button>

    <!-- 地图容器 -->
    <div
      ref="chart"
      style="height: 100%; width: 100%"
      class="chart-container"
    ></div>
  </div>
</template>

在模板中,主要有两个部分:

  • 返回按钮:mapStack 中有多个历史记录时,返回按钮会显示,用于返回上一层地图。
  • 地图容器: 这是 ECharts 渲染地图的地方,通过 ref="chart" 获取容器 DOM。

2. ECharts 的基本配置与地图初始化

mounted 生命周期钩子中,初始化了 ECharts 图表并注册了地图数据:

javascript 复制代码
mounted () {
  this.$nextTick(() => {
    this.initChart();
  })
  window.addEventListener('resize', this.handleResize); // 窗口变化时调整图表大小
}

initChart 方法中,注册了山东省的地图数据并初始化了 ECharts 实例:

javascript 复制代码
initChart () {
  // 注册山东省地图
  this.$echarts.registerMap('shandong', this.mapData['山东省']);
  // 初始化 ECharts 实例
  this.chart = this.$echarts.init(this.$refs.chart);

  // 监听地图点击事件,点击后进入下一级地图
  this.chart.on('click', ({ name }) => {
    if (this.mapData[name] && name !== this.currentCity) {
      // 进入下一级地图
      this.mapStack.push(name);
      this.setMapData(name);
    }
  });

  // 设置地图选项
  this.setMapData(this.currentCity);
}

3. 动态加载不同地区地图数据

地图数据在 mapData 中以城市名称为键,地图 JSON 文件为值。每个城市的数据可以通过 require 动态加载。例如:

javascript 复制代码
mapData: {
  '山东省': require('./shangdong.json'),
  '青岛市': require('../json/青岛市.json'),
  '济南市': require('../json/济南市.json'),
  ...
}

4. 地图交互:点击事件与返回上一层功能

当点击地图中的某个城市时,会更新地图为该城市的地图数据,并将当前城市名称加入到 mapStack 中以实现返回功能。goBack 方法会弹出当前城市并加载上一层城市的地图数据。

javascript 复制代码
goBack () {
  if (this.mapStack.length > 1) {
    this.mapStack.pop(); // 弹出当前城市
    this.setMapData(this.mapStack[this.mapStack.length - 1]); // 设置上一城市的数据
  }
}

5. 自定义 Tooltip 和图标

地图上的每个城市展示的数据通过 tooltipFormatter 方法进行自定义格式化,显示每个城市的相关信息,如总用户数、平均积分、平均时长等。

javascript 复制代码
tooltipFormatter (params) {
  const marker = `<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:#284979;"></span>`;
  const cityName = `<h3>${(params.data && params.data.name) || params.name || '暂无单位'}</h3>`;
  const totalUser = marker + '人数:' + (params.data && params.data.totalUser || 0) + '<br />';
  const score = marker + '平均积分:' + (params.data && params.data.score || 0) + '<br />';
  const duration = marker + '平均时长:' + (params.data && params.data.duration || 0);
  return cityName + totalUser + score + duration ;
}

这段代码通过判断 params.data 是否存在,动态生成显示城市信息的 HTML 格式。

6. 样式与布局调整

对于地图组件的样式,使用了 scoped 样式进行隔离,确保组件的样式不会污染到其他部分:

css 复制代码
.map_style {
  position: relative;
  height: 100%;
  width: 100%;
}

.go_back_index {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index:999;
}

.chart-container {
  border-radius: 10px;
  overflow: hidden;
}
  • map_style 类定义了组件的外部容器样式,确保其占满父容器。
  • go_back_index 类定义了返回按钮的位置,确保它在页面的左上角,且 z-index 很高,以便始终显示在其他内容之上。
  • chart-container 类定义了地图容器的外观,给它设置了圆角和隐藏溢出部分的效果。
总结:

文章介绍了如何使用 Vue 和 ECharts 实现一个交互式地图组件。通过以下几个步骤实现了地图的基本功能:

  1. 初始化 ECharts 和地图数据;
  2. 支持返回上一层地图的功能;
  3. 根据点击的城市动态加载该城市的地图和数据;
  4. 自定义地图的 Tooltip,展示城市的相关统计信息;
  5. 对组件进行了样式和布局的优化,确保地图组件可以灵活适应不同的屏幕尺寸。

通过组件,可以灵活地展示不同城市或地区的数据,并允许用户点击进入查看更详细的统计信息。

相关推荐
崔庆才丨静觅44 分钟前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅2 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax