当前位置: 首页 > news >正文

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.dtcms.com/a/107552.html

相关文章:

  • 从代码学习深度学习 - 残差网络(ResNet)PyTorch版
  • MSVC编译遇到C2059、C2143、C2059、C2365、C2059等错误的解决方案
  • 打开pycharm显示编制索引后卡死
  • C++软件开发架构
  • llm-universe 踩坑记录
  • 数值与字典解决方案第二十五讲:数组的合并拆分及筛选
  • GNSS信号模拟器、导航信号模拟器、导航模拟信号源介绍
  • 如何解决 PyQt5 中的 `xcb` 插件加载错误
  • vue修饰符
  • ns-3使用animation出现文件小、无时间、打开后只有拓扑没有内容
  • 《静默与轰鸣的对决》
  • 什么是向量搜索Vector Search?
  • work03_1 实现一个简单的计算器,能够处理加法、减法、乘法和除法
  • 四、Bug篇+用例篇
  • Docker学习--容器操作相关命令--docker inspect 命令
  • C/C++指针核心难点全解析:从内存模型到实战避坑指南
  • AttributeError: module ‘smtplib‘ has no attribute ‘SMTP_SSL‘ 解决方法
  • AI小白的第十天:影响模型泛化能力的因素以及对策
  • spring boot 集成redis 中RedisTemplate 、SessionCallback和RedisCallback使用对比详解,最后表格总结
  • 系统思考与时间管理
  • 在MFC中使用Qt(五):MFC和Qt的共存和交互
  • 经典算法 最长公共子序列问题
  • GPU与CUDA对应
  • 阿里云服务器对接高防的时候可能会出现的问题
  • 鸿蒙应用元服务开发-Account Kit 常见问题说明
  • BRC认证是什么?如何获得BRC认证?对企业发展的好处
  • 解决Oracle PL/SQL中“表或视图不存在“错误的完整指南
  • 数据分析与知识发现 论文阅读【信息抽取】
  • OSD显示
  • 动态规划——区间DP