当前位置: 首页 > 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.gsyq.cn/news/1430961.html

相关文章:

  • [开源] 医保基金流向追踪图:面向医保办自查与汇报的可视化分析系统
  • 大模型核心基础知识(12)—机器学习的基本概念与常见方法
  • 2026年养老保姆推荐平台排名,价格透明吗? - mypinpai
  • MobileNet-Yolo深度解析:超轻量级实时目标检测的终极实战指南
  • 终极指南:如何免费获取和使用Poppins多语言字体
  • 038、替换激活函数能涨几个点?SiLU、Mish、GELU、ReLU 在 YOLO 上的消融实验
  • OBS-Multi-RTMP:一键同步多平台直播,让内容传播效率提升300%
  • 2026年适配维普AI智能降重工具横评:亲测8款工具,把AIGC率稳控在安全线内
  • 告别手动对账:3步实现美团饿了么百度外卖订单自动化采集 [特殊字符]
  • 2026年徐州讯灵AI品牌推荐 - mypinpai
  • 终极QMCFLAC转MP3解决方案:突破QQ音乐加密格式限制
  • 2026年吸气式感烟火灾探测器口碑排名 - mypinpai
  • 2026Q2四川园林景观雕塑生产基地选型技术指南:GRG异形雕塑成都厂家、四川一站式雕塑设计制作厂家、四川不锈钢雕塑定制厂家选择指南 - 优质品牌商家
  • XUnity.AutoTranslator:3步解锁游戏语言屏障的终极解决方案
  • PiliPlus跨平台B站客户端:5个技巧让你在电脑和手机上享受无广告观影体验
  • 2026年国内金属雕塑主流厂家实力盘点与维度对比:四川雕塑厂家/定制雕塑厂家/市政雕塑厂家/成都雕塑厂家/校园雕塑厂家/选择指南 - 优质品牌商家
  • 提高超声相控阵系统测量精度与实时性能关键技术解析【附数据】
  • 2026年5月安庆装饰行业核心服务维度实测解析:安庆靠谱装修/安庆全屋整装/安庆别墅装修/安庆大平层装修/安庆家装/选择指南 - 优质品牌商家
  • 2026年Q2重庆钯金回收公司排行:重庆钯金回收、重庆银条回收、重庆首饰回收、重庆首饰珠宝回收、重庆黄金典当、重庆黄金回收选择指南 - 优质品牌商家
  • 【RT-DETR实战】093、遥感图像(RSOD)目标检测改进实战:当RT-DETR遇见高空视角
  • 不只是libxcb-cursor:深度排查Ubuntu 22.04 Qt平台插件加载失败的全链路指南
  • 显卡驱动清理大师:DDU深度使用完全指南
  • 3分钟上手JD-GUI:让Java字节码对你“坦诚相见“的魔法工具
  • 2026年GEO服务商推荐:全意图时代的企业选型指南 - GEO优化
  • 网易云音乐人申请避坑指南:从实名认证到30秒清唱视频,一次搞定审核
  • 2026苏州卫生间免砸砖防水维修口碑榜单|最新报价+真实施工案例 - 吉修匠
  • 如何将浏览器下载速度提升300%:Motrix WebExtension终极指南
  • 分层设计(Controller→业务服务→路由→微信SDK),多公众号环境的统一管理和消息发送以及获取openId绑定供应商
  • 2026年近期山西三项岗位品牌厂商深度解析与选型指南 - 2026年企业资讯
  • 2026年Q2成都吸塑包装技术解析与合规选型指南:四川吸塑包装、四川吸塑托盘、四川吸塑泡壳、四川吸塑盖、成都吸塑内托选择指南 - 优质品牌商家