当前位置: 首页 > news >正文

Mapbox GL JS 实现鼠标绘制矩形功能的详细代码和讲解

以下是如何使用 Mapbox GL JS 实现鼠标绘制矩形功能的详细代码和讲解。Mapbox GL JS 是一个强大的 JavaScript 库,可以用来创建交互式地图。下面将通过监听鼠标事件并动态更新地图图层来实现这一功能。


实现步骤

  1. 初始化地图

    • 在 HTML 文件中引入 Mapbox GL JS 库,并设置一个容器来显示地图。
    • 创建一个 mapboxgl.Map 实例,配置地图样式、中心点和缩放级别。
  2. 监听鼠标事件

    • 使用 map.on 方法监听 mousedown(鼠标按下)、mousemove(鼠标移动)和 mouseup(鼠标松开)事件。
    • mousedown 时记录矩形的起始点。
    • mousemove 时根据鼠标位置实时更新矩形。
    • mouseup 时结束绘制并固定矩形。
  3. 绘制矩形

    • 使用 GeoJSON 数据格式表示矩形。
    • 通过 map.addSourcemap.addLayer 将矩形添加到地图上。
    • 在鼠标移动时动态更新 GeoJSON 数据以显示矩形的当前形状。
  4. 结束绘制

    • 在绘制完成后移除不必要的事件监听器,避免重复触发。

详细代码

以下是完整的 HTML 和 JavaScript 代码示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mapbox GL 绘制矩形</title>
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.10.0/mapbox-gl.js"></script>
    <link href="https://api.mapbox.com/mapbox-gl-js/v2.10.0/mapbox-gl.css" rel="stylesheet">
    <style>
        body { margin: 0; padding: 0; }
        #map { position: absolute; top: 0; bottom: 0; width: 100%; }
    </style>
</head>
<body>
    <div id="map"></div>
    <script>
        // 设置 Mapbox 访问令牌
        mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN'; // 请替换为你的 Mapbox 访问令牌

        // 初始化地图
        const map = new mapboxgl.Map({
            container: 'map', // 地图容器 ID
            style: 'mapbox://styles/mapbox/streets-v11', // 地图样式
            center: [-74.5, 40], // 初始中心点(经度,纬度)
            zoom: 9 // 初始缩放级别
        });

        let startPoint; // 矩形起始点

        // 开始绘制:监听鼠标按下事件
        function startDrawing(e) {
            startPoint = e.lngLat; // 记录鼠标按下时的经纬度
            map.on('mousemove', drawRectangle); // 开始监听鼠标移动
            map.on('mouseup', stopDrawing); // 开始监听鼠标松开
        }

        // 绘制矩形:监听鼠标移动事件
        function drawRectangle(e) {
            const endPoint = e.lngLat; // 获取鼠标当前位置
            // 计算矩形的四个顶点坐标
            const coordinates = [
                [startPoint.lng, startPoint.lat], // 左上角
                [endPoint.lng, startPoint.lat],   // 右上角
                [endPoint.lng, endPoint.lat],     // 右下角
                [startPoint.lng, endPoint.lat],   // 左下角
                [startPoint.lng, startPoint.lat]  // 回到起点闭合
            ];

            // 创建矩形的 GeoJSON 数据
            const rectangleGeoJSON = {
                type: 'Feature',
                geometry: {
                    type: 'Polygon',
                    coordinates: [coordinates]
                }
            };

            // 如果数据源已存在,则更新;否则创建新数据源和图层
            if (map.getSource('rectangle')) {
                map.getSource('rectangle').setData(rectangleGeoJSON);
            } else {
                map.addSource('rectangle', {
                    type: 'geojson',
                    data: rectangleGeoJSON
                });
                map.addLayer({
                    id: 'rectangle-layer',
                    type: 'fill',
                    source: 'rectangle',
                    paint: {
                        'fill-color': '#088', // 填充颜色
                        'fill-opacity': 0.5   // 透明度
                    }
                });
            }
        }

        // 结束绘制:监听鼠标松开事件
        function stopDrawing() {
            map.off('mousemove', drawRectangle); // 移除鼠标移动监听
            map.off('mouseup', stopDrawing);     // 移除鼠标松开监听
            // 可以在此保存矩形数据或执行其他操作
        }

        // 绑定鼠标按下事件,开始绘制流程
        map.on('mousedown', startDrawing);
    </script>
</body>
</html>

代码讲解

1. 初始化地图
  • 引入 Mapbox GL JS:通过 <script><link> 标签引入 Mapbox GL JS 的 JavaScript 和 CSS 文件。
  • 设置访问令牌:将 mapboxgl.accessToken 设置为你的 Mapbox 访问令牌(需自行申请)。
  • 创建地图实例:使用 mapboxgl.Map 配置地图,指定容器 ID(map)、地图样式(streets-v11)、中心点和缩放级别。
2. 监听鼠标事件
  • 鼠标按下 (mousedown)
    • 通过 e.lngLat 获取鼠标按下时的经纬度,存储在 startPoint 中。
    • 绑定 mousemovemouseup 事件,开始绘制流程。
  • 鼠标移动 (mousemove)
    • 调用 drawRectangle 函数,实时更新矩形形状。
  • 鼠标松开 (mouseup)
    • 调用 stopDrawing 函数,移除事件监听器,结束绘制。
3. 绘制矩形
  • 计算坐标:根据 startPoint 和当前鼠标位置 endPoint,生成矩形的四个顶点坐标,形成闭合的多边形。
  • 创建 GeoJSON:将坐标封装为 GeoJSON 格式的 Polygon 类型。
  • 更新地图
    • 如果地图上已有 rectangle 数据源,则通过 setData 更新数据。
    • 如果没有,则通过 addSource 添加数据源,并通过 addLayer 创建一个填充图层来显示矩形。
  • 样式设置:矩形填充颜色为 #088(青色),透明度为 0.5
4. 结束绘制
  • stopDrawing 函数中,使用 map.off 移除 mousemovemouseup 的事件监听器,确保绘制过程不会重复触发。
  • 你可以选择在此处保存矩形数据(例如存储到数组中)或添加其他功能。

注意事项

  • 访问令牌:确保将 'YOUR_MAPBOX_ACCESS_TOKEN' 替换为你的实际 Mapbox 访问令牌,否则地图无法加载。
  • 单一矩形:当前代码只支持绘制一个矩形,绘制完成后会覆盖之前的矩形。如需支持多个矩形,可以为每个矩形生成唯一的 ID 并创建独立图层。
  • 扩展功能:你可以添加按钮或逻辑来重置地图状态,或允许用户删除已绘制的矩形。

通过以上代码可以在 Mapbox GL JS 地图上实现鼠标绘制矩形的功能。这一功能适用于区域选择、地图标注等场景,具有很强的实用性。

相关文章:

  • C++ | std::function
  • Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异
  • 基于方法分类的无监督图像去雾论文
  • 小白入门机器学习概述
  • 128. 最长连续序列
  • 树莓派超全系列文档--(18)树莓派配置音频
  • 快速入手:基于SpringBoot的Dubbo应用融合Nacos成为注册中心
  • 工业机器人核心算法体系解析:从感知到决策的技术演进
  • Ubuntu 系统 Docker 中搭建 CUDA cuDNN 开发环境
  • 鸿蒙应用元服务开发-Account Kit概述
  • Raspberry 树莓派 CM4模块的底板设计注意事项
  • 运维简历之项目经验(Project Experience in Pperation and Maintenance Resume)
  • InfiniBand (IB)和 以太网 的区别
  • 《孟婆汤的零知识证明加密术》
  • 发动机试验台底座:汽车研发的关键支撑(北重制造厂家)
  • 记忆学习用内容
  • Dify 配置语音转文字
  • [skip]CBAM
  • 蓝桥杯比赛python程序设计——纯职业小组
  • 时间处理核心原理与Easy-ES实战避坑指南
  • 电子商务网站的开发流程/鸡西seo顾问
  • 做白酒的网站/福州网站优化
  • 营销型网站建设eyouc/深圳seo优化外包公司
  • 新疆电商网站建设公司/百度大数据查询平台
  • 宁波网站推广软件/广州seo网站推广公司
  • 钓鱼网站怎么做/搜索引擎优化seo是什么