前言

在现代数据可视化领域,3D 地图飞线效果是一种非常吸引人的展示方式,特别适合展示地理空间关系和数据流动。本文将详细解析如何使用 ECharts GL 在 Vue 项目中实现一个 3D 中国地图飞线效果。

技术栈

  • Vue.js 2.x/3.x

  • ECharts 5.x

  • ECharts GL 2.x

核心实现步骤

1. 准备工作

首先需要安装必要的依赖:

npm install echarts echarts-gl --save

2. 基础地图配置

import * as echarts from 'echarts'
import "echarts-gl";
import chinaJson from '@/utils/chinaOutline.json'export default {mounted() {this.initChart()},methods: {initChart() {const dom = this.$refs.chartRef;this.myChart = echarts.init(dom);echarts.registerMap('china', chinaJson);// ...其他配置}}
}

3. 数据处理

我们需要准备两类数据:

  1. 城市点位数据 - 用于在地图上显示城市位置

  2. 飞线数据 - 用于显示从起点到各城市的连线

const FROMCITY = [113.28064, 23.125177]  // 起点坐标(深圳)
const FROMCITYCOORD = [113.28064, 23.125177]// 处理飞线数据
const linesData = this.cityList.map(city => ({fromName: FROMCITY,toName: city.city,coords: [[FROMCITYCOORD[0], FROMCITYCOORD[1], 1], [city.provinceCapitalX, city.provinceCapitalY, 1]],
}));// 处理散点数据
const scatterData = this.cityList.map(city => ({name: city.city.replace('市', ''),value: [city.provinceCapitalX, city.provinceCapitalY, 1],
}));

4. 3D 地图核心配置

geo3D: {map: 'china',regionHeight: 8,  // 区域高度itemStyle: {color: 'RGBA(153, 249, 235, 1)',  // 地图基础颜色borderWidth: 1.5},viewControl: {distance: 110,  // 观察距离alpha: 60,      // 上下旋转角度beta: 0         // 左右旋转角度},// ...其他配置
}

5. 飞线系列配置

{type: 'lines3D',effect: {show: true,period: 4,            // 动画周期trailWidth: 4,        // 尾迹宽度symbol: 'arrow',      // 箭头符号color: 'rgba(255,255,255, 1)'},lineStyle: {width: 1.5,color: '#1AD9FF',     // 飞线颜色opacity: 0.8},data: linesData         // 飞线数据
}

6. 城市点位配置

{type: 'scatter3D',symbol: 'circle',symbolSize: 14,label: {show: true,formatter: '{b}',     // 显示城市名称color: '#FFF'},itemStyle: {color: '#FFA601'      // 点颜色},data: scatterData       // 散点数据
}

完整代码解析

setChartInit() {const dom = this.$refs.chartRef;this.myChart = this.myChart || echarts.init(dom);// 注册地图echarts.registerMap('china', chinaJson);// 准备数据const linesData = this.cityList.map(city => ({fromName: FROMCITY,toName: city.city,coords: [[FROMCITYCOORD[0], FROMCITYCOORD[1], 1], [city.provinceCapitalX, city.provinceCapitalY, 1]],}));const scatterData = this.cityList.map(city => ({name: city.city.replace('市', ''),value: [city.provinceCapitalX, city.provinceCapitalY, 1],}));// 配置项const option = {// 3D地图配置geo3D: {map: 'china',regionHeight: 8,// ...其他geo3D配置},series: [// 飞线系列{type: 'lines3D',// ...飞线配置data: linesData},// 点位系列{type: 'scatter3D',// ...点位配置data: scatterData}]};this.myChart.setOption(option);
}

完整代码

<template><div class="chartRef" ref="chartRef" style="height: 100%;width: 100%" />
</template>
<script>import * as echarts from 'echarts'
import '@/utils/chinaMap'
import "echarts-gl";
import chinaJson from '@/utils/chinaOutline.json'const FROMCITY = [113.28064, 23.125177]
const FROMCITYCOORD = [113.28064, 23.125177]export default {name: 'Demo',data() {return {cityList:[{"id": 0,"city": "绍兴市","provinceCapitalX": "120.15358","provinceCapitalY": "30.287458","num": 200},{"id": 1,"city": "北京市","provinceCapitalX": "116.405289","provinceCapitalY": "39.904987","num": 200},{"id": 2,"city": "嘉兴市","provinceCapitalX": "120.15358","provinceCapitalY": "30.287458","num": 200},{"id": 3,"city": "锦州市","provinceCapitalX": "118.76741","provinceCapitalY": "41.796768","num": 200},{"id": 4,"city": "临沂市","provinceCapitalX": "120.15358","provinceCapitalY": "30.287458","num": 200},{"id": 5,"city": "深圳市","provinceCapitalX": "113.28064","provinceCapitalY": "23.125177","num": 200}
],}},mounted() {this.getData()},watch: {},methods: {// 地图组件初始加载setChartInit() {const dom = this.$refs.chartRef;this.myChart = this.myChart || echarts.init(dom);echarts.registerMap('china', chinaJson);const linesData = this.cityList.map(city => ({fromName: FROMCITY,toName: city.city,coords: [[FROMCITYCOORD[0], FROMCITYCOORD[1], 1], [city.provinceCapitalX, city.provinceCapitalY, 1]],}));const scatterData = this.cityList.map(city => ({name: city.city.replace('市', ''),value: [city.provinceCapitalX, city.provinceCapitalY, 1],}));const option = {tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},backgroundColor: 'transparent',geo3D: {zlevel: 1,type: 'geo3D',coordinateSystem: 'geo3D',map: 'china',regionHeight: 8,roam: false,silent: false, select: {disabled: false},itemStyle: {borderColor: 'RGBA(37, 182, 144, 0)',color: 'RGBA(153, 249, 235, 1)',borderWidth: 1.5},shading: "realistic",realisticMaterial: {detailTexture: "./bg.png",textureTiling: 1,blendMode: 'Additive', // 可选值:Additive / Subtractive / Multiply 等},light: {main: {intensity: 1.2,shadow: true,shadowQuality: 'high'},ambient: {intensity: 0.3}},viewControl: {distance: 110,alpha: 60,beta: 0,autoRotate: false,rotateSensitivity: 1,zoomSensitivity: 1,panSensitivity: 1},emphasis: {label: {show: true,color: 'RGBA(255, 255, 255, 1)',fontSize: 14,},itemStyle: {color: 'RGBA(255, 255, 255, 1)',borderWidth: 4,borderColor: "RGBA(255,255,255, 1)",regionHeight: 25,opacity: 1,shadowColor: 'RGBA(153, 249, 235, 1)'}},},series: [// 飞线系列{type: 'lines3D',coordinateSystem: 'geo3D',zlevel: 2,silent: true,effect: {show: true,period: 4,trailWidth: 4,trailLength: 0.4,symbol: 'arrow',symbolSize: 16,color: 'rgba(255,255,255, 1)'},lineStyle: {width: 1.5,color: '#1AD9FF',opacity: 0.8},data: linesData},// 点位系列{type: 'scatter3D',coordinateSystem: 'geo3D',zlevel: 3,symbol: 'circle',symbolSize: 14,silent: false,label: {show: true,position: 'right',formatter: '{b}',textStyle: {color: '#FFF',fontSize: 14}},itemStyle: {color: '#FFA601'},emphasis: {label: {show: false},itemStyle: {color: '#1AD9FF'}},data: scatterData}]}this.myChart.setOption(option);}}
}
</script><style scoped lang="scss"></style>

效果优化技巧

  1. 动画效果:通过调整 effect.period 可以改变飞线动画速度

  2. 视觉层次:使用 zlevel 控制不同图层的叠加顺序

  3. 光照效果:调整 light 配置可以改变地图的明暗效果

  4. 交互体验:配置 viewControl 可以控制地图的旋转、缩放等交互行为

常见问题解决

  1. 地图不显示

    • 确保正确注册了地图 JSON 数据

    • 检查容器是否有固定宽高

  2. 飞线不显示

    • 检查坐标数据格式是否正确

    • 确保 lines3D 系列被正确添加到 series 中

  3. 性能问题

    • 数据量过大时考虑简化或聚合数据

    • 使用 silent: true 减少不必要的交互检测

总结

通过 ECharts GL 实现 3D 地图飞线效果,可以为地理空间数据提供更加直观的展示方式。本文详细介绍了从数据准备到最终实现的完整流程,以及各种配置项的用途和优化技巧。这种可视化方式特别适合展示城市间的关联关系、物流路线、人口迁移等场景。

希望这篇技术解析能帮助你在项目中实现类似的效果。如果有任何问题,欢迎在评论区讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92506.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92506.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92506.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis对象编码

前言 Redis中提供多种数据结构&#xff1a;string、list、map、set、zset等&#xff0c;关于上述多种数据类型的底层实现原理&#xff0c;Redis针对不同的数据类型对应的不同使用场景从时间和空间上进行平衡选择不同的对象编码方式。本文大致介绍一些Redis对象编码方式以及在上…

12-Django项目实战-登录短信验证

1.路由配置 2.对接第三方短信接口 详细内容请点击 3.视图函数 def sms_view(request):"""短信验证视图逻辑1.获取请求体的数据[phone]2.调用封装的短信发送接口&#xff0c;实现发送短信"""data json.loads(request.body)phone data.get(&q…

Java技术栈/面试题合集(11)-设计模式篇

场景 Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140870227 通过对面试题进行系统的复习可以对Java体系的知识点进行查漏补缺。 注: 博客: 霸道流氓气质-CSDN博…

Linux系统:Ext系列文件系统(软件篇)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录[TOC](文章目录)一&#xff0c;ext2文件系统1-1 宏观认识1-2 Block Group1-3 块组内部构成1-3-1 超级块(Super Block)1-3-2 块组描述符表GDT(Group Descriptor Table…

14. isaacsim4.2教程-April Tags/给相机加噪声

1. 前言April Tags 是一种视觉标签&#xff08;类似 QR 码&#xff09;&#xff0c;用于通过相机进行定位和识别。它们通常用于计算机视觉任务中&#xff0c;帮助机器人识别和定位自己在物理空间中的位置&#xff0c;或者识别和追踪特定对象。前提条件启用 ROS 桥接&#xff1a…

Kafka + 时间轮 + 数据库实现延迟队列方案

Kafka 原生不支持延迟队列功能。而RabbitMQ、RocketMQ及Redis等其他消息队列原生支持延迟队列。 RabbitMQ RocketMQ Redis 实现方式 通过插件实现&#xff0c;消息进入延迟队列后根据配置时间过滤转发。 原生支持&#xff0c;发送消息时设置延迟级别&#xff0c;定时任务处…

力扣 hot100 Day69

287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改…

Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)

Android Studio 版本号:2024.1.2 CameraX是Jetpack系列中的一个库,它基于Camera2 API构建,但提供了更高层次的抽象。 CameraX 三大核心用例: Preview预览 ,ImageCapture拍照和 VideoCapture录视频 一、创建项目,进行环境配置 CameraX 需要一些属于 Java 8 的方法,因此…

【机器学习深度学习】微调训练数据质量

目录 前言 一、为什么数据质量评估很重要 二、数据质量评估的核心维度 三、数据质量的可量化维度&#xff08;必须要测的指标&#xff09; 四、多答案、多类型数据的取舍与优化 场景 A&#xff1a;一个问题有多个相似回答 场景 B&#xff1a;多个类型数据&#xff0c;每…

从DeepSeek-V3到Kimi K2,大型语言模型架构对比

文章目录 摘要 **稀疏化与专家系统** **注意力机制优化** **归一化与稳定性设计** 模型架构对比详析 DeepSeek-V3 vs Llama 4 Maverick Qwen3 vs SmolLM3 Kimi 2的突破 1 DeepSeek V3/R1 1.1 多头潜在注意力(MLA) 1.2 混合专家系统(MoE) 1.3 DeepSeek 总结 2 OLMo 2 2.1 归…

Unity笔记(二)——Time、Vector3、位置位移、角度、旋转、缩放、看向

写在前面写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。这里只有部分语法知识。五、Time时间相关1、时间缩放比例概念&#xff1a;可以通过UnityEngine.Time类的timeScale属性控制游戏时…

vue+vite项目中怎么定义一个环境变量可以在开发环境和生产环境使用不同的值,并且可以在vue页面和index.html通用。

首先我们需要下载一个插件vite-plugin-html然后再项目最外层和index.html同级目录下新建.env.development和.env.production两个项目并且定义你想要的环境变量名:注意要以VITE_开头VITE_APP_MAP_TOKEN1233444然后vite.config.js文件import { defineConfig,loadEnv } from vite…

Python-深度学习--2信息熵,条件熵(ID3决策树),KL散度

一、信息熵&#xff08;Entropy&#xff09;的计算与应用信息熵用于衡量一个概率分布的不确定性&#xff0c;值越大表示分布越分散&#xff08;不确定性越高&#xff09;。1. 数学定义对于离散概率分布 P&#xff0c;信息熵公式为&#xff1a;&#xff08;通常以 2 为底单位是比…

国产化Word处理控件Spire.Doc教程:Python提取Word文档中的文本、图片、表格等

在现代办公场景中&#xff0c;Word文档已成为信息存储与交流的重要载体&#xff0c;承载着关键的业务数据、结构化表格、可视化图表以及协作批注等重要内容。面对日益增长的文档处理需求&#xff0c;传统的人工操作方式已难以满足效率与准确性的双重标准。采用Python实现Word文…

Spring IOC 原理

Spring IoC&#xff08;控制反转&#xff09;是Spring框架的核心机制&#xff0c;其原理是通过容器管理对象生命周期和依赖关系&#xff0c;实现解耦。 1. 控制反转&#xff08;IoC&#xff09;核心思想 传统模式&#xff1a;对象主动创建依赖&#xff08;如new Service()&…

VSCode:基础使用 / 使用积累

官网 Visual Studio Code - Code Editing. Redefined 记录一、更新依赖 尝试删除yarn.lock文件 记录二、“解决冲突”的方式变了 更新后&#xff0c;“解决冲突”的方式变了&#xff0c;有的时候能选中两者&#xff0c;有的时候不能 现在又更新了&#xff0c;回复到了原来…

tcp 确认应答和超时时间

1. 确认应答之间的时间&#xff08;RTT&#xff09;这是指 从发送方发送数据到接收方返回确认&#xff08;ACK&#xff09;之间的时间。它反映的是数据传输的 往返延迟。例如&#xff0c;发送方发送一个数据包&#xff0c;接收方收到后&#xff0c;回传一个确认包&#xff08;A…

图的应用-最短路径

最短路径的典型用途&#xff1a;交通网络的问题——从甲地到乙地之间是否有公路连通&#xff1f;在有多条通路的情况下&#xff0c;哪一条路最短&#xff1f;交通网络用有向网来表示&#xff1a;顶点——表示地点&#xff0c;弧——表示两个地点有路连通&#xff0c;弧上的权值…

【qt5_study】1.Hello world

模板 作为初学者我们选择第一个Application(Qt)和 Qt Widgets Application,所谓的模板就是 Qt为了方便开发程序,在新建工程时可以让用户基于一种模板来编写程序,包括 cpp文件, ui文件都已经快速的创建,而不用用户手动创建这些文件。 基类 这里默认选择的基类为 QMainWin…

项目构想|文生图小程序

Date: August 4, 2025项目介绍 &#x1f44b;&#xff0c;我们通过 Vibe Coding 做一个文字生成图片的小程序。 我们会从需求分析、技术选型、UI设计、项目构筑到最后打包&#xff0c;一路尝试 Vibe Coding 实现。 创建项目 创建文件夹&#xff1a;ai-pic-mini-app 采用 Git 进…