资讯动态

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

发布时间:2026/9/10 9:36:55 来源:尧图企业网站定制
一、效果说明本文将实现一个有趣的小功能️ 点击地图 → 播放点击音效️ 拖动地图 → 播放循环音效⛔ 停止拖动 → 停止音效适用于GIS系统交互增强无人机巡检系统可视化项目体验优化二、技术栈Vue3Composition APIOpenLayers原生 Audio API三、实现思路核心逻辑非常简单操作触发事件行为点击地图click播放音效开始拖动movestart播放循环音效结束拖动moveend停止音效四、完整代码!-- * Author: 彭麒 * Date: 2026/3/30 * Email: 1062470959qq.com * Description: 此源码版权归吉檀迦俐所有可供学习和借鉴或商用。 -- template div classcontainer div classw-full flex justify-center flex-wrap div classfont-bold text-[24px] Vue3 Openlayers点击/拖动播放音频 /div /div div idmap/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?lyrsmglenx{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 APIconst map ref(null)使用ref替代data使用onMounted替代mounted2️⃣ 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. 报错NotSupportedErrorThe element has no supported sources原因音频链接失效被跨域拦截不是 MP3 文件 建议✔ 使用本地音频✔ 或使用稳定 HTTPS 音频资源七、进阶优化✅ 1. 使用本地音频生产环境import clickMp3 from /assets/audio/click.mp3 const clickAudio new Audio(clickMp3)✅ 2. 封装音频 Hookconst useAudio () { const play (audio) { audio.currentTime 0 audio.play() } return { play } }✅ 3. 场景升级推荐方向 无人机飞行音效 雷达扫描音 AI语音播报八、总结本文实现了一个简单但非常实用的功能让地图“有声音”提升点交互更真实系统更有沉浸感非常适合 GIS / 可视化系统九、后续拓展如果你正在做巡检系统三维 GISCesium数字孪生 可以进一步结合空间音效事件驱动音频语音播报系统如果觉得有帮助欢迎点赞 收藏 ⭐ 关注 后续会持续更新 Vue3 GIS 实战内容

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价