MapLibre GL JS第62课:创建可拖动标记

📌 学习目标

  • 掌握创建可拖动标记的实现方法
  • 理解相关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事件: 监听拖动结束事件
  • 实时坐标显示: 在拖动结束后更新坐标显示

⚙️ 参数说明

参数类型必填说明
draggableboolean是否可拖动,默认false
lngLat[number, number]初始位置 [经度, 纬度]
marker.getLngLat()method-获取当前坐标
dragendevent-拖动结束时触发

🎨 效果说明

在这里插入图片描述

运行代码后,地图显示全球视图,在地图中心(0, 0位置)显示一个可拖动的标记。用户可以:

  • 点击并拖动标记到任意位置
  • 拖动过程中标记跟随鼠标移动
  • 释放鼠标后,底部显示标记当前的经纬度坐标

💡 常 见 问 题

Q1: 标记不能拖动?
A: 检查以下几点:

  1. 确认创建Marker时设置了 draggable: true
  2. 确认标记已添加到地图(addTo(map)
  3. 检查是否有其他元素阻止了鼠标事件

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]);
});

📝 练习任务

  1. 基础练习:修改坐标显示的样式和位置
  2. 进阶挑战:添加拖动过程中的实时坐标显示
  3. 拓展思考:如何实现拖动范围限制?
  4. 综合实践:创建一个地址选择器,支持拖动标记选择位置

🌟 最佳实践

  1. 用户体验: 提供清晰的视觉反馈,区分拖动状态
  2. 性能优化: 对于实时坐标更新,使用requestAnimationFrame优化
  3. 边界处理: 考虑坐标范围限制(经度-180180,纬度-9090)
  4. 状态管理: 保持坐标显示与标记位置同步
  5. 可访问性: 提供键盘操作支持,允许通过键盘移动标记

🔗 延伸阅读


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷丩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值