MapLibre GL JS第30课:添加视频

📅 2026/7/15 4:00:53 👁️ 阅读次数 📝 编程学习
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实践课程系列的一部分,欢迎关注收藏