📌 学习目标
- 掌握创建可拖动标记的实现方法
- 理解相关API的使用
- 能够独立完成类似功能开发
🎯 核心概念
创建可拖动的标记。
💻 完 整 代 码
<!DOCTYPE html>
<html lang="en">
<head>
<title>Create a draggable Marker</title>
<meta property="og:description" content="将标记拖动到地图上的新位置并在显示中填充其坐标。" />
<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>
.coordinates {
background: rgba(0, 0, 0, 0.5);
color: #fff;
position: absolute;
bottom: 40px;
left: 10px;
padding: 5px 10px;
margin: 0;
font-size: 11px;
line-height: 18px;
border-radius: 3px;
display: none;
}
</style>
<div id="map"></div>
<pre id="coordinates" class="coordinates"></pre>
<script>
const coordinates = document.getElementById('coordinates');
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [0, 0],
zoom: 2
});
const marker = new maplibregl.Marker({draggable: true})
.setLngLat([0, 0])
.addTo(map);
function onDragEnd() {
const lngLat = marker.getLngLat();
coordinates.style.display = 'block';
coordinates.innerHTML =
`Longitude: ${lngLat.lng}<br />Latitude: ${lngLat.lat}`;
}
marker.on('dragend', onDragEnd);
</script>
</body>
</html>
🔍 代码解析
1. 初始化地图
使用 new maplibregl.Map() 创建地图实例,配置了以赤道为中心的全球视图。
2. 关键配置项
- draggable: true: 启用标记的拖动功能
- getLngLat(): 获取标记当前位置坐标
- dragend事件: 监听拖动结束事件
- 实时坐标显示: 在拖动结束后更新坐标显示
⚙️ 参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| draggable | boolean | 否 | 是否可拖动,默认false |
| lngLat | [number, number] | 是 | 初始位置 [经度, 纬度] |
| marker.getLngLat() | method | - | 获取当前坐标 |
| dragend | event | - | 拖动结束时触发 |
🎨 效果说明

运行代码后,地图显示全球视图,在地图中心(0, 0位置)显示一个可拖动的标记。用户可以:
- 点击并拖动标记到任意位置
- 拖动过程中标记跟随鼠标移动
- 释放鼠标后,底部显示标记当前的经纬度坐标
💡 常 见 问 题
Q1: 标记不能拖动?
A: 检查以下几点:
- 确认创建Marker时设置了
draggable: true - 确认标记已添加到地图(
addTo(map)) - 检查是否有其他元素阻止了鼠标事件
Q2: 如何获取拖动过程中的实时坐标?
A: 监听drag事件获取实时坐标:
marker.on('drag', () => {
const lngLat = marker.getLngLat();
coordinates.innerHTML = `Longitude: ${lngLat.lng.toFixed(4)}<br />Latitude: ${lngLat.lat.toFixed(4)}`;
});
Q3: 如何限制拖动范围?
A: 在dragend事件中检查并纠正位置:
marker.on('dragend', () => {
const lngLat = marker.getLngLat();
// 限制在[-180, 180]经度范围
const clampedLng = Math.max(-180, Math.min(180, lngLat.lng));
const clampedLat = Math.max(-90, Math.min(90, lngLat.lat));
marker.setLngLat([clampedLng, clampedLat]);
});
📝 练习任务
- 基础练习:修改坐标显示的样式和位置
- 进阶挑战:添加拖动过程中的实时坐标显示
- 拓展思考:如何实现拖动范围限制?
- 综合实践:创建一个地址选择器,支持拖动标记选择位置
🌟 最佳实践
- 用户体验: 提供清晰的视觉反馈,区分拖动状态
- 性能优化: 对于实时坐标更新,使用requestAnimationFrame优化
- 边界处理: 考虑坐标范围限制(经度-180180,纬度-9090)
- 状态管理: 保持坐标显示与标记位置同步
- 可访问性: 提供键盘操作支持,允许通过键盘移动标记
🔗 延伸阅读
-
[下一课预告]:将继续学习地图图层的基础知识
本文是MapLibre GL JS实践课程系列的一部分,欢迎关注收藏
532

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



