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

199.Vue3 + OpenLayers 实现:点击 / 拖动地图播放音频

一、效果说明

本文将实现一个有趣的小功能:

  • 🖱️ 点击地图 → 播放点击音效

  • 🗺️ 拖动地图 → 播放循环音效

  • ⛔ 停止拖动 → 停止音效

适用于:

  • GIS系统交互增强

  • 无人机巡检系统

  • 可视化项目体验优化


二、技术栈

  • Vue3(Composition API)

  • OpenLayers

  • 原生 Audio API


三、实现思路

核心逻辑非常简单:

操作触发事件行为
点击地图click播放音效
开始拖动movestart播放循环音效
结束拖动moveend停止音效

四、完整代码

<!-- * @Author: 彭麒 * @Date: 2026/3/30 * @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:点击/拖动播放音频 </div> </div> <div id="map"></div> </div> </template> <script setup> import { onMounted, ref } from 'vue' import 'ol/ol.css' import { Map, View } from 'ol' import Tile from 'ol/layer/Tile' import XYZ from 'ol/source/XYZ' const map = ref(null) const clickAudio = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3') const moveAudio = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3') // 循环播放(拖动用) moveAudio.loop = true const initMap = () => { const raster = new Tile({ source: new XYZ({ url: 'https://www.google.com/maps/vt?lyrs=m&gl=en&x={x}&y={y}&z={z}', crossOrigin: 'anonymous' }) }) map.value = new Map({ target: 'map', layers: [raster], view: new View({ projection: 'EPSG:3857', center: [2617200, 5951081], zoom: 5 }) }) // ✅ 点击播放音效 map.value.on('click', () => { clickAudio.currentTime = 0 // 关键:支持连续点击 clickAudio.play() }) // ✅ 开始拖动 map.value.on('movestart', () => { if (moveAudio.paused) { moveAudio.currentTime = 0 moveAudio.play() } }) // ✅ 拖动结束 map.value.on('moveend', () => { moveAudio.pause() moveAudio.currentTime = 0 }) } onMounted(() => { initMap() }) </script> <style scoped> .container { width: 840px; height: 590px; margin: 50px auto; border: 1px solid #42b983; } #map { width: 800px; height: 460px; margin: 0 auto; border: 1px solid #42b983; } </style>

五、关键知识点解析

1️⃣ Vue3 Composition API

const map = ref(null)
  • 使用ref替代data

  • 使用onMounted替代mounted


2️⃣ OpenLayers 事件机制

map.value.on('click', handler) map.value.on('movestart', handler) map.value.on('moveend', handler)

说明:

  • click:点击地图

  • movestart:开始拖动

  • moveend:拖动结束


3️⃣ Audio API 使用

const audio = new Audio('xxx.mp3') audio.play() audio.pause()

六、常见问题

❗ 1. 连续点击没有声音

clickAudio.currentTime = 0

👉 必须重置播放时间


❗ 2. 音频叠加播放

if (moveAudio.paused)

👉 防止重复触发播放


❗ 3. 浏览器不播放音频

原因:

  • 浏览器限制自动播放

  • 必须用户交互(点击/拖动)

👉 本案例已符合要求 ✔


❗ 4. 报错:NotSupportedError

The element has no supported sources

原因:

  • 音频链接失效

  • 被跨域拦截

  • 不是 MP3 文件

👉 建议:

✔ 使用本地音频
✔ 或使用稳定 HTTPS 音频资源


七、进阶优化

✅ 1. 使用本地音频(生产环境)

import clickMp3 from '@/assets/audio/click.mp3' const clickAudio = new Audio(clickMp3)

✅ 2. 封装音频 Hook

const useAudio = () => { const play = (audio) => { audio.currentTime = 0 audio.play() } return { play } }

✅ 3. 场景升级(推荐方向)

  • 🚁 无人机飞行音效

  • 📡 雷达扫描音

  • 📢 AI语音播报


八、总结

本文实现了一个简单但非常实用的功能:

👉让地图“有声音”

提升点:

  • 交互更真实

  • 系统更有沉浸感

  • 非常适合 GIS / 可视化系统


九、后续拓展

如果你正在做:

  • 巡检系统

  • 三维 GIS(Cesium)

  • 数字孪生

👉 可以进一步结合:

  • 空间音效

  • 事件驱动音频

  • 语音播报系统


如果觉得有帮助,欢迎点赞 👍 收藏 ⭐ 关注 🚀
后续会持续更新 Vue3 + GIS 实战内容!

http://www.jsqmd.com/news/567532/

相关文章:

  • 射频电路设计中的阻抗匹配原理与实践
  • 每周一个开源项目 #6:LlamaEdge 轻量本地大模型部署工具
  • 深求·墨鉴保姆级教程:从安装到使用,打造你的个人数字文房
  • 视觉感知升维:RGB+EVS 硬件融合的新基准
  • Janus-Pro-7B开发环境搭建:Ubuntu20.04系统配置全攻略
  • ”测试开发全日制学徒班7期第2天“-Linux常用命令之帮助命令
  • FUTURE POLICE语音模型Java八股文实践:设计模式在语音服务中的应用
  • 深入解析Apk安装后桌面图标缺失的CATEGORY_LAUNCHER与LEANBACK_LAUNCHER机制
  • HarmonyOS6 ArkTS ListItemGroup设置Header/Footer
  • 别再买错千元投影! 哈趣Q1Pro藏看越级体验
  • 突破Web墨卡托限制:Mapbox-gl.js v2.15.0 自定义坐标系扩展实战
  • 避坑指南:PyTorch模型保存时选torch.save还是state_dict?5个实际项目经验总结
  • 低噪声放大器设计中的常见误区与优化技巧:如何避免噪声系数飙升
  • OpCore-Simplify:智能重构黑苹果配置流程的效率革命
  • Unity微信小游戏打包后,如何用七牛云CDN加速资源加载(附完整配置流程与避坑点)
  • Claude Code 源码泄漏:想研究的赶紧 fork,可能随时消失
  • Win10下QTTabBar安装全攻略:解决.NET 3.5报错0x80240438的终极方案
  • IPXWrapper焕新攻略:让经典游戏在Windows 11完美联机
  • CanFestival主站PDO配置避坑指南:以Kinco FD伺服的速度/位置模式控制为例
  • HarmonyOS6 ArkTS ListItemGroup设置多列布局
  • Sunshine:5步打造你的专属游戏串流服务器,随时随地畅玩PC大作
  • Lingbot 模型与 Dify 集成:构建无需编码的深度图生成 AI 应用
  • MoveIt!与Gazebo联调实战:手把手教你配置controllers_gazebo.yaml(附常见报错修复)
  • 从仿真到实车:解析Fast-LIO2定位中坐标系缺失的排查与修复
  • AI绘画新手指南:用FLUX.1和SDXL风格,轻松生成高质量图片
  • 程序员转型AI大模型全攻略:告别焦虑,抢占时代红利
  • Qwen3.5-2B轻量化部署:单卡3090上同时运行3个实例的资源分配方案
  • JavaScript 开发 - Object 的 hasOwn 方法
  • 3步构建稳定黑苹果:给硬件爱好者的OpenCore智能配置方案
  • 基于SpringBoot集成乙巳马年皇城大门春联生成终端W:打造企业级文化应用