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

MapLibre GL JS第30课:添加视频

📌 学习目标

  • 掌握添加视频的实现方法
  • 理解相关API的使用
  • 能够独立完成类似功能开发

🎯 核心概念

将视频添加为地图上的动态图层。

💻 完 整 代 码

代码示例

constvideoStyle={'version':8,'sources':{'satellite':{'type':'raster','url':'https://api.maptiler.com/tiles/satellite/tiles.json?key=get_your_own_OpIi9ZULNHzrESv6T2vL','tileSize':256},'video':{'type':'video','urls':['https://static-assets.mapbox.com/mapbox-gl-js/drone.mp4','https://static-assets.mapbox.com/mapbox-gl-js/drone.webm'],'coordinates':[[-122.51596391201019,37.56238816766053],[-122.51467645168304,37.56410183312965],[-122.51309394836426,37.563391708549425],[-122.51423120498657,37.56161849366671]]}},'layers':[{'id':'background','type':'background','paint':{'background-color':'rgb(4,7,14)'}},{'id':'satellite','type':'raster','source':'satellite'},{'id':'video','type':'raster','source':'video'}]};constmap=newmaplibregl.Map({container:'map',minZoom:14,zoom:17,center:[-122.514426,37.562984],bearing:-96,style:videoStyle});letplayingVideo=true;map.on('click',()=>{playingVideo=!playingVideo;if(playingVideo)map.getSource('video').play();elsemap.getSource('video').pause();});

代码示例

<!DOCTYPEhtml><htmllang="en"><head><title>Add a video</title><metaproperty="og:description"content="在卫星栅格底图上显示视频。"/><metaproperty="og:created"content="2025-06-25"/><metacharset='utf-8'><metaname="viewport"content="width=device-width, initial-scale=1"><linkrel='stylesheet'href='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.css'/><scriptsrc='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.js'></script><style>body{margin:0;padding:0;}html, body, #map{height:100%;}</style></head><body><divid="map"></div><script>constvideoStyle={'version':8,'sources':{'satellite':{'type':'raster','url':'https://api.maptiler.com/tiles/satellite/tiles.json?key=get_your_own_OpIi9ZULNHzrESv6T2vL','tileSize':256},'video':{'type':'video','urls':['https://static-assets.mapbox.com/mapbox-gl-js/drone.mp4','https://static-assets.mapbox.com/mapbox-gl-js/drone.webm'],'coordinates':[[-122.51596391201019,37.56238816766053],[-122.51467645168304,37.56410183312965],[-122.51309394836426,37.563391708549425],[-122.51423120498657,37.56161849366671]]}},'layers':[{'id':'background','type':'background','paint':{'background-color':'rgb(4,7,14)'}},{'id':'satellite','type':'raster','source':'satellite'},{'id':'video','type':'raster','source':'video'}]};constmap=newmaplibregl.Map({container:'map',minZoom:14,zoom:17,center:[-122.514426,37.562984],bearing:-96,style:videoStyle});letplayingVideo=true;map.on('click',()=>{playingVideo=!playingVideo;if(playingVideo)map.getSource('video').play();elsemap.getSource('video').pause();});</script></body></html>

🔍 代码解析

1. 配置样式对象

定义完整的样式对象,包含多个数据源和图层:

  • satellite: 卫星影像栅格源
  • video: 视频源

2. 配置视频数据源

style.sources中定义视频源:

  • type: 'video': 指定为视频源
  • urls: 视频文件URL数组(支持多种格式)
  • coordinates: 视频四角对应的地理坐标

3. 配置图层

创建三个图层:

  • background: 背景层
  • satellite: 卫星影像层
  • video: 视频层(叠加在卫星影像上)

4. 初始化地图

使用配置的样式对象创建地图实例,设置初始视角。

5. 添加点击交互

点击地图切换视频播放/暂停状态。

⚙️ 参数说明

参数类型必填说明
containerstring地图容器ID
styleobject完整的样式对象
center[number, number]初始中心点,默认[0, 0]
zoomnumber初始缩放级别,默认0
bearingnumber初始方位角

视频源配置

属性类型说明
typestring必须为 ‘video’
urlsarray视频文件URL数组
coordinatesarray四角地理坐标数组 [左下, 右下, 右上, 左上]

🎨 效果说明

运行代码后:

  • 地图显示美国旧金山区域(中心点 -122.51°W, 37.56°N)
  • 卫星影像作为底图
  • 无人机航拍视频叠加在指定地理区域
  • 点击地图可播放/暂停视频
  • 用户可正常交互(拖拽、缩放、旋转)

💡 常 见 问 题

Q1: 视频坐标如何设置?
A:coordinates数组按顺序定义视频四角的地理坐标:左下、右下、右上、左上。

Q2: 如何支持多种浏览器?
A:提供多种格式的视频文件(MP4、WebM等),浏览器会自动选择支持的格式。

Q3: 如何控制视频播放?
A:通过map.getSource('video').play()pause()方法控制。

📝 练习任务

  1. 基础练习:修改视频URL,更换为其他视频
  2. 进阶挑战:添加视频进度条控制
  3. 拓展思考:如何实现多个视频图层切换?

🌟 最佳实践

  1. 格式兼容: 提供多种视频格式确保跨浏览器支持
  2. 坐标准确: 确保视频坐标与实际地理位置匹配
  3. 交互友好: 提供清晰的播放控制方式
  4. 性能优化: 视频尺寸适中,避免过大影响加载速度

🔗 延伸阅读

  • Map API文档

  • MapLibre GL JS 官方文档

  • [下一课预告]:将继续学习地图图层的基础知识


本文是MapLibre GL JS实践课程系列的一部分,欢迎关注收藏

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

相关文章:

  • 2026年西安靠谱的育婴师推荐排名 - mypinpai
  • Claude Code 迎来重磅更新!v2.1.156 v2.1.157 双版本发布:本地插件免市集加载、多 Worktree 自由切换与大波 Bug 修复
  • 一个人写了一套店群矩阵自动化软件:我是如何干掉繁琐切号流程与并发内存泄漏的
  • [开源] 医保基金流向追踪图:面向医保办自查与汇报的可视化分析系统
  • 2026年养老保姆推荐平台排名,价格透明吗? - mypinpai
  • MobileNet-Yolo深度解析:超轻量级实时目标检测的终极实战指南
  • 朱光亚与一个民族最深沉的精神底色(潜龙在渊)
  • 终极指南:如何免费获取和使用Poppins多语言字体
  • 如何快速掌握MoviePilot批量重命名:完整操作指南与实战技巧
  • 038、替换激活函数能涨几个点?SiLU、Mish、GELU、ReLU 在 YOLO 上的消融实验
  • 大模型核心基础知识(12)—机器学习的基本概念与常见方法
  • MapLibre GL JS第31课:添加实时数据
  • 告别手动对账:3步实现美团饿了么百度外卖订单自动化采集 [特殊字符]
  • OBS-Multi-RTMP:一键同步多平台直播,让内容传播效率提升300%
  • 2026年适配维普AI智能降重工具横评:亲测8款工具,把AIGC率稳控在安全线内
  • 039、卷积模块替换实验:GhostConv、DSConv、DynamicConv 的精度-速度权衡
  • 实验一 常用网络命令的使用
  • TrafficMonitor插件完全指南:如何将Windows任务栏打造成全能信息中心
  • Arduino雨水监测系统:从传感器原理到物联网报警实现
  • 2026年徐州讯灵AI品牌推荐 - mypinpai
  • Display Driver Uninstaller:彻底解决显卡驱动残留问题的系统管理员必备工具
  • 【新手保姆级教程】OpenClaw v2.7.8 一键安装教程,Windows 环境快速部署(包含安装包)
  • 因民事养老金管理失误,英国政府拒绝向Capita授予5.63亿英镑合同
  • Vue3日期时间选择器终极指南:如何在5分钟内构建现代化表单界面
  • 拆解Linux 0.11的键盘驱动:从‘按回车’到‘读字符’的底层发生了什么?
  • [开源] 多部门会签文档进度自动重建系统:面向医院行政与临床协同的OCR+状态机追踪工具
  • 终极QMCFLAC转MP3解决方案:突破QQ音乐加密格式限制
  • 2026年吸气式感烟火灾探测器口碑排名 - mypinpai
  • Qt圆角窗口的两种实现方案详解
  • 基于波前编码的红外系统焦深延拓特性解析方案【附代码】