📌 学习目标
- 掌握飞到位置的实现方法
- 理解相关API的使用
- 能够独立完成类似功能开发
🎯 核心概念
飞到指定位置。
💻 完 整 代 码
<!DOCTYPE html>
<html lang="en">
<head>
<title>Fly to a location</title>
<meta property="og:description" content="使用 flyTo 在位置之间平滑过渡。" />
<meta property="og:created" content="2006-06-25" />
<meta charset='utf-8'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel='stylesheet' href='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.css' />
<script src='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>
<style>
#fly {
display: block;
position: absolute;
top: 20px;
left: 50%;
transform: translate(-50%);
width: 50%;
height: 40px;
padding: 10px;
border: none;
border-radius: 3px;
font-size: 12px;
text-align: center;
color: #fff;
background: #ee8a65;
}
</style>
<div id="map"></div>
<br />
<button id="fly">Fly</button>
<script>
const map = new maplibregl.Map({
container: 'map',
style: 'https://tiles.openfreemap.org/styles/bright',
center: [-74.5, 40],
zoom: 9
});
document.getElementById('fly').addEventListener('click', () => {
// 通过将点-74.50, 40偏移最多5度
// 飞到随机位置。
map.flyTo({
center: [
-74.5 + (Math.random() - 0.5) * 10,
40 + (Math.random() - 0.5) * 10
],
essential: true // 此动画相对于prefers-reduced-motion被认为是必要的
});
});
</script>
</body>
</html>
🔍 代码解析
1. 创建地图实例
首先使用 maplibregl.Map() 创建一个地图实例,配置地图容器、样式文件、初始中心点和缩放级别。这里使用了开放街图的明亮风格作为底图。
2. 飞行动画核心
通过 map.flyTo() 方法实现地图的平滑飞行效果。这个方法会在两个视点之间创建自然的动画过渡,而不是简单的瞬间跳转。
3. 随机目标点
每次点击按钮时,通过 Math.random() 生成一个随机的经纬度偏移量,让地图飞到以初始位置为中心、周围5度范围内的任意位置。
4. essential 参数
设置 essential: true 表示这个动画对于用户操作是必要的,应该相对于用户的无障碍偏好(prefers-reduced-motion)进行调整。
⚙️ 参数说明
Map 构造函数参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| container | string | 是 | 地图容器的DOM元素ID |
| style | string | 是 | 地图样式JSON的URL地址 |
| center | [number, number] | 否 | 初始中心点坐标 [经度, 纬度],默认 [0, 0] |
| zoom | number | 否 | 初始缩放级别,默认0 |
flyTo 方法参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| center | [number, number] | 是 | 目标中心点坐标 [经度, 纬度] |
| essential | boolean | 否 | 设为true表示动画是必要的,默认false |
🎨 效果说明

运行代码后,页面上会显示一张以 [-74.5, 40] 为中心、缩放级别为9的交互式地图。点击"Fly"按钮后,地图会以平滑动画的方式飞到随机生成的目标位置。飞行过程中用户可以继续与地图交互,地图会自动完成动画并停留在目标位置。
💡 常 见 问 题
Q1: 飞行动画过程中能否中断?
A: 可以的。在飞行过程中再次调用 flyTo() 方法,新的飞行目标会立即替代当前目标,地图会平滑过渡到新的目标位置。
Q2: 如何让飞行速度更快或更慢?
A: 可以通过设置 speed 参数来控制飞行速度,例如 map.flyTo({ center: [...], speed: 2 })。数值越大速度越快,默认约为1.2。
Q3: 地图不显示怎么办?
A: 检查以下几点:
- 确认已正确引入MapLibre GL JS的CSS和JS文件
- 确认容器元素存在且设置了明确的高度
- 检查浏览器控制台是否有错误信息
📝 练习任务
- 基础练习:修改随机偏移的范围,将5度改为10度或更小,观察飞行距离的变化
- 进阶挑战:尝试添加多个按钮,每个按钮飞到不同的预设位置(如不同的城市)
- 拓展思考:如何让地图在飞行过程中保持某个特定缩放级别?提示:查看
flyTo的zoom参数
🌟 最佳实践
- 动画平滑: flyTo提供流畅的视觉过渡效果
- 性能考虑: 避免在飞行过程中频繁触发新飞行
- 用户反馈: 动画过程中保持地图可交互
- 无障碍: essential参数确保必要动画不被打断
- 随机性: 使用Math.random创造自然的随机飞行体验
🔗 延伸阅读
-
[下一课预告]:将继续学习地图图层的基础知识
本文是MapLibre GL JS实践课程系列的一部分,欢迎关注收藏
547

被折叠的 条评论
为什么被折叠?



