111.在 Vue 3 中使用 OpenLayers 实现动态曲线流动图(类似 ECharts 迁徙状态)

在数据可视化领域,ECharts 提供的 迁徙图(流动图) 是一种直观展示数据流动的方式,如人口迁徙、物流流向等。我们可以使用 OpenLayers 结合 Vue 3 来实现类似的 动态曲线流动图,从而在 Web GIS 项目中提供更生动的可视化效果。

本文将介绍如何使用 Vue 3 + OpenLayers + ol-dynamic-curves 插件,完成一个类似 ECharts 迁徙图 的地图效果。


1. 效果展示

最终的效果如下:

🌍 地图背景:使用 OpenLayers 加载 OSM(OpenStreetMap) 瓦片地图。
🎯 动态曲线:使用 ol-dynamic-curves 插件绘制动态流动曲线,模拟数据流动。


2. 项目环境

  • Vue 3<script setup> 语法)

  • Vite 5(轻量级打包工具)

  • OpenLayers(用于加载地图)

  • ol-dynamic-curves(用于绘制动态曲线)


3. 安装依赖

我们需要安装 OpenLayers 和 ol-dynamic-curves 组件。

npm install ol ol-dynamic-curves

4. 代码实现

4.1 Vue 组件模板

新建 MigrationMap.vue 组件,填充如下代码:

<!--* @Author: 彭麒* @Date: 2025/4/2* @Email: 1062470959@qq.com* @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。-->
<template><div class="container"><div class="w-full flex justify-center flex-wrap"><div class="font-bold text-[24px]">在Vue3中使用OpenLayers实现动态曲线流动图,类似Echarts迁徙状态</div></div><div id="vue-openlayers"></div></div>
</template><script setup>
import { onMounted, ref } from 'vue';
import 'ol/ol.css';
import { Map, View } from 'ol';
import TileLayer from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
import CurvesLayer from 'ol-dynamic-curves';const map = ref(null);const initMap = () => {map.value = new Map({target: "vue-openlayers",layers: [new TileLayer({source: new OSM()})],view: new View({projection: "EPSG:4326",center: [116.15, 40.79],zoom: 6})});
};const loadCurves = () => {if (!map.value) return;const options = {map: map.value,pointPositions: [[[116.38840, 39.90562], [143.60, 33.00]],[[116.38840, 39.90562], [154.216463, 42.895035]],[[116.38840, 39.90562], [105.941956, 47.07053]],[[116.38840, 39.90562], [100.718274, 0.95006]]],splitLength: 180,oneFrameLimitTime: 5,radialColor: {0: '#ff0000',0.2: '#ffff00',0.4: '#ff00ff',0.6: '#00ff00',0.8: '#00ffff',1: '#ff00ff'},controlRatio: 1};new CurvesLayer(options);
};onMounted(() => {initMap();loadCurves();
});
</script><style scoped>
.container {width: 840px;height: 570px;margin: 50px auto;border: 1px solid #42B983;
}#vue-openlayers {width: 800px;height: 450px;margin: 0 auto;border: 1px solid #42B983;position: relative;
}
</style>

5. 代码解析

5.1 OpenLayers 地图初始化

const initMap = () => { map.value = new Map({ target: "vue-openlayers", layers: [ new TileLayer({ source: new OSM() }) ], view: new View({ projection: "EPSG:4326", center: [116.15, 40.79], zoom: 6 }) }); 
};
  • 使用 OSM 瓦片图 作为底图。

  • 采用 EPSG:4326 坐标系(经纬度)。


5.2 加载动态曲线

const loadCurves = () => {if (!map.value) return;const options = {map: map.value,pointPositions: [[[116.38840, 39.90562], [143.60, 33.00]],[[116.38840, 39.90562], [154.216463, 42.895035]],[[116.38840, 39.90562], [105.941956, 47.07053]],[[116.38840, 39.90562], [100.718274, 0.95006]]],splitLength: 180,oneFrameLimitTime: 5,radialColor: {0: '#ff0000',0.2: '#ffff00',0.4: '#ff00ff',0.6: '#00ff00',0.8: '#00ffff',1: '#ff00ff'},controlRatio: 1};new CurvesLayer(options);
};
  • 设定 pointPositions,定义曲线起点和终点坐标。

  • 设置 radialColor 让曲线呈现渐变流动效果。


6. 运行项目

如果你使用 Vite 作为构建工具,运行:

npm run dev

浏览器访问 http://localhost:5173,即可看到 动态迁徙流动图


7. 进阶优化

  1. 支持交互操作:可以添加鼠标悬停事件,显示曲线的详细信息。

  2. 曲线样式优化:调整 splitLengthoneFrameLimitTime,优化动画流畅度。

  3. 数据动态加载:可结合 WebSocket 或 API 请求,实现实时更新迁徙数据。


8. 结语

本文介绍了如何在 Vue 3 中使用 OpenLayers 实现 动态曲线流动图,类似 ECharts 迁徙状态图。结合 ol-dynamic-curves 插件,可以轻松实现数据流向的可视化。如果你对 GIS 可视化感兴趣,可以尝试将 数据动态化结合 Cesium 进行 3D 可视化

🚀 欢迎点赞 & 关注,获取更多 Vue + OpenLayers 相关教程! 🎯

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

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

相关文章

全栈开发项目实战——AI智能聊天机器人

文章目录 一&#xff1a;项目技术栈和代码分析1.前端技术栈&#xff08;1&#xff09;HTML&#xff08;index.html&#xff09;&#xff1a;&#xff08;2&#xff09;CSS&#xff08;styles.css&#xff09;&#xff1a;&#xff08;3&#xff09;JavaScript&#xff08;scrip…

无人机机体结构设计要点与难点!

一、无人机机体结构设计要点 1. 类型与应用场景匹配 固定翼无人机&#xff1a;需优化机翼升阻比&#xff0c;采用流线型机身降低气动阻力&#xff08;如大展弦比机翼设计&#xff09;。 多旋翼无人机&#xff1a;注重轻量化框架和对称布局&#xff08;如四轴/六轴碳纤维机…

eBest AI智能报表:用自然语言对话解锁企业数据生产力

告别传统数据迷宫&#xff0c;让业务洞察"开口即得" 【数据价值被困在系统迷宫中】​ 在数字化转型的深水区&#xff0c;80%的企业正被数据孤岛和越来越多&#xff0c;也越来越复杂的系统所困扰。 • 操作黑洞&#xff1a;用户平均通过6次筛选和层级跳转才能触达目标…

Linux 编程环境

文章目录 VimGCCGDBMake Vim Vim GCC GCC&#xff08;GNU Compiler Collection&#xff09;是一款编译语言编译器&#xff0c;此项目最早由GNU计划的发起者理查德 斯托曼开始实施。第一版GCC于1987年发行&#xff0c;最初的GCC代表GNU C Compiler&#xff0c;即GNU的C语言编…

JSONP跨域访问漏洞

一、漏洞一:利用回调GetCookie <?php$conn new mysqli(127.0.0.1,root,root,learn) or die("数据库连接不成功"); $conn->set_charset(utf8); $sql "select articleid,author,viewcount,creattime from learn3 where articleid < 5"; $result…

JuiceFS vs HDFS,最简单的 JuiceFS 入门

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等希望看什么,评论或者私信告诉我! 文章目录 一、背景二、JuiceFS 入门2.1 核心特性2.2 JuiceFS 架构2.3 JuiceFS 如何存储文…

音频进阶学习二十四——IIR滤波器设计方法

文章目录 前言一、滤波器设计要求1.选频滤波器种类2.通带、阻带、过度带3.滤波器设计指标 二、IIR滤波器的设计过程1.设计方法2.常见的模拟滤波器设计1&#xff09;巴特沃斯滤波器&#xff08;Butterworth Filter&#xff09;2&#xff09;切比雪夫滤波器&#xff08;Chebyshev…

vue3源码分析 -- runtime

runtime运行时&#xff0c;主要在packages/runtime-core目录下&#xff0c;核心提供了h、render等函数。在理解它们之前&#xff0c;我们需要了解下HTML DOM 树和虚拟 DOM等概念 HTML DOM 树 通过节点构成的一个树形结构&#xff0c;我们称为HTML DOM节点树。DOM 文档里面做了…

清明假期在即

2025年4月2日&#xff0c;6~22℃&#xff0c;一般 遇见的事&#xff1a;这么都是清明出去玩&#xff1f;你们不扫墓的么。 感受到的情绪&#xff1a;当精力不放在一个人身上&#xff0c;你就会看到很多人&#xff0c;其实可以去接触的。 反思&#xff1a;抖音上那么多不幸和幸…

tomcat 目录结构组成

文章目录 背景文件结构层级一些常用的路径 背景 现在非常多的 java web 服务部署在 linux 服务器中&#xff0c;我们服务器中的 tomcat 会有各种文件路径&#xff0c;看下它有哪些文件 文件结构层级 ├── bin/ # 核心脚本和启动文件 ├── conf/ # …

多层内网渗透测试虚拟仿真实验环境(Tomcat、ladon64、frp、Weblogic、权限维持、SSH Server Wrapper后门)

在线环境:https://www.yijinglab.com/ 拓扑图 信息收集 IP地址扫描 确定目标IP为10.1.1.121 全端口扫描 访问靶机8080端口,发现目标是一个Tomcat服务,版本

NOIP2010提高组.引水入城

*前置题目 901. 滑雪 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 310, INF 0x3f3f3f3f; const int dx[4] {0, -1, 0, 1}, dy[4] {1, 0, -1, 0};int n, m, h[N][N]; int f[N][N]; int ans;int dfs(i…

Share02-小小脚本大大能量

各位看官你们好&#xff0c;又是一篇共享知识点的文章&#xff0c;今天我们来聊一聊脚本在我们上位组态中的作用。各个厂家的上位软件或者触屏软件都内嵌了脚本功能&#xff0c;有的是二次开发的固定指令格式&#xff0c;有的可以接收广域的标准语言指令。它带给我们更多的方便…

LangChain接入azureopenai步骤(2025年初)

背景&#xff1a; 为了快速且规范的实现ai应用&#xff0c;可使用LangChain框架&#xff0c;便于后期维护。虽然deepseek异军突起&#xff0c;在终端用户占有率很高&#xff0c;但是仔细查阅相关api接口&#xff0c;尤其是自有知识库需要使用的文本向量化模型方面&#xff0c;o…

阿里云国际站代理商:模型训练中断数据丢失怎么办?

定期保存训练状态&#xff1a;在训练过程中&#xff0c;设定自动保存训练状态的频率&#xff0c;将模型的参数、优化器状态、训练数据的中间结果等定期保存到存储介质上。这样&#xff0c;当中断发生时&#xff0c;可以恢复到上次保存的状态&#xff0c;避免训练进度的损失。 …

C++17更新内容汇总

C17 是 C14 的进一步改进版本&#xff0c;它引入了许多增强特性&#xff0c;优化了语法&#xff0c;并提升了编译期计算能力。以下是 C17 的主要更新内容&#xff1a; 1. 结构化绑定&#xff08;Structured Bindings&#xff09; 允许同时解构多个变量&#xff0c;从 std::tup…

2025年Axure RP9无法免费使用Axure Cloud的解决方案

解决方案 更换新账号&#xff0c;换了一个邮箱注册&#xff0c;再登陆&#xff0c;又会给你30天的试用期。 对&#xff0c;办法就是换个邮箱注册&#xff0c;又续上30天的试用期。

供应链中的的“四流合一”

在供应链中&#xff0c;物流、资金流、信息流、商流是共同存在的&#xff0c;商流、信息流和资金流的结合将更好的支持和加强供应链上、下游企业之间的货物、服务往来&#xff08;物流&#xff09;。 一、商流 在供应链中&#xff0c;上下游供应商的资金链条均可被金融服务机构…

MonkeyDev 如何创建一个root级级别的app

前提条件:有越狱的手机,XCode中已经安装了Monkeydev 1. 和普通应用一个创建一个ios的工程 2. 在App的TARGETS>build setting> 中设置Apple Development 3. 设置User-Defined的配置 CODE_SIGNING_ALLOWED = NO MonkeyDevBuildPackageOnAnyBuild = NO MonkeyDevClearUi…

Excel时间类型函数(包括today、date、eomonth、year、month、day、weekday、weeknum、datedif)

目录 1. TODAY()2. DATE()3. EOMONTH()4. YEAR()5. MONTH()6. DAY()7. WEEKDAY()8. WEEKNUM()9. DATEDIF()10.&#x1f4cc; 函数扩展与应用11. &#x1f4da; 时间函数基础概念与分类 Excel 提供了许多 日期与时间类型的函数&#xff0c;用于操作与处理日期或时间数据。这些函…