从零开始Vue项目中使用MapboxGL开发三维地图教程(三)添加全屏,缩放旋转和比例控制面板以及自定义图标、标记点击弹窗、地图平移等功能

news2024/11/24 20:27:50

文章目录

      • 1、添加各种控制面板
        • 1.1、添加全屏
        • 1.2、缩放旋转控制
        • 1.3、比例尺
      • 2、获取并显示鼠标移动位置的经纬度坐标
      • 3、添加图标
        • 3.1、添加图片图层的图标
        • 3.2、添加带有标记的自定义图标
        • 3.3、悬停时显示弹出窗口

1、添加各种控制面板

1.1、添加全屏

      //添加全屏控制
      this.map.addControl(new this.$mapboxgl.FullscreenControl());

1.2、缩放旋转控制

      // Add zoom and rotation controls to the map.
      this.map.addControl(new this.$mapboxgl.NavigationControl());

1.3、比例尺

      // Add a scale control to the map
      this.map.addControl(new this.$mapboxgl.ScaleControl());

2、获取并显示鼠标移动位置的经纬度坐标

通过鼠标移动,获取实时的屏幕坐标和经纬度坐标:

    <div style="z-index: 9999; position: absolute; left:40%; background-color: rgb(100, 100, 79);color: #ffff;">
       <span>屏幕坐标:{{screenxy}}<br />经纬度: {{lnglat}}</span>
    </div>

data中定义两个值:

      //屏幕xy位置
      screenxy:"",
      //经纬度
      lnglat:null

初始化map方法中加上鼠标移动的监听事件:

      //获取鼠标位置
      map.on('mousemove', (e) => {
        this.screenxy = JSON.stringify(e.point)
        this.lnglat = JSON.stringify(e.lngLat)
          
      });

效果:
在这里插入图片描述

3、添加图标

3.1、添加图片图层的图标

首先通过一个图像的url地址添加图片到map中,图像名称起名iconImage;其次定义一个数组features,里面包括两个点的地理信息;然后将features数组通过map的addsource接口添加到map中,数据源的名称起为iconImage,数据源类型为geojson,里面的数据类型为FeatureCollection;最后添加图层,类型是symbol,数据源是iconImage。

      //添加图片图层的图标
      map.on('load',()=>{
        map.loadImage('https://docs.mapbox.com/mapbox-gl-js/assets/cat.png',(error,image)=>{
          if(error) throw error;
          map.addImage('iconImage',image);

          let features = [{
             "type": "Feature",
                    "geometry": {
                    "type": "Point",
                    "coordinates": [116.469000,40.251706]
                  }
                }, {
                    "type": "Feature",
                    "geometry": {
                    "type": "Point",
                    "coordinates": [116.469000,40.351706]
                  }
          }]

          map.addSource('iconImage',{
             type: 'geojson',
              data: {
                type: 'FeatureCollection',
                features
              }
          })

          map.addLayer({
            id: "iconImage",
            type: "symbol",
            source: 'iconImage', // 对应addSource第一个参数名字
            layout: {
              "icon-image": "iconImage", // 对应addImage()第一个参数名字
              "icon-size": 0.1,//图标的大小
            },
          })
        }) 
      })

在这里插入图片描述

3.2、添加带有标记的自定义图标

首先定义个FeatureCollection类型的对象,里面包括features的数组,里面包括三个点的feature;其次dom中创建一个div元素,通过遍历geojson中features数组给div元素赋值,也可以给div元素添加click事件;最后添加marker;

      //geojson数据
      const geojson = {
        type: "FeatureCollection",
        features: [
          {
            type: "Feature",
            properties: {
              message: "Foo",
              iconSize: [60, 60],
            },
            geometry: {
              type: "Point",
              coordinates: [91.324462, 32.024695],
            },
          },
          {
            type: "Feature",
            properties: {
              message: "Bar",
              iconSize: [50, 50],
            },
            geometry: {
              type: "Point",
              coordinates: [106.21582, 29.971891],
            },
          },
          {
            type: "Feature",
            properties: {
              message: "Baz",
              iconSize: [40, 40],
            },
            geometry: {
              type: "Point",
              coordinates: [106.292236, 37.281518],
            },
          },
        ],
      };

      // Add markers to the map.
      for (const marker of geojson.features) {
        // Create a DOM element for each marker.
        const el = document.createElement("div");
        const width = marker.properties.iconSize[0];
        const height = marker.properties.iconSize[1];
        el.className = "marker";
        el.style.backgroundImage = `url(https://placekitten.com/g/${width}/${height}/)`;
        el.style.width = `${width}px`;
        el.style.height = `${height}px`;
        el.style.backgroundSize = "100%";

        el.addEventListener("click", () => {
          window.alert(marker.properties.message);
        });

        // Add markers to the map.
        new this.$mapboxgl.Marker(el)
          .setLngLat(marker.geometry.coordinates)
          .addTo(map);
      }

在这里插入图片描述

3.3、悬停时显示弹出窗口

将鼠标悬停在自定义标记上时,显示包含信息的弹窗。
修改3.1中的图层数据,添加properties信息:

let features = [
              {
                type: "Feature",
                geometry: {
                  type: "Point",
                  coordinates: [116.469, 40.251706],
                },
                properties: {
                  description:
                    "<strong>A Little Night Music</strong><p>The Arlington Players' production of Stephen Sondheim's <em>A Little Night Music</em> comes to the Kogod Cradle at The Mead Center for American Theater (1101 6th Street SW) this weekend and next. 8:00 p.m.</p>"
                },
              },
              {
                type: "Feature",
                geometry: {
                  type: "Point",
                  coordinates: [113.469, 32.351706],
                },
                properties: {
                  description:
                    "<strong>A Little Night Music</strong><p>The Arlington Players' production of Stephen Sondheim's <em>A Little Night Music</em> comes to the Kogod Cradle at The Mead Center for American Theater (1101 6th Street SW) this weekend and next. 8:00 p.m.</p>"
                },
              },
            ];

添加弹窗核心代码:

// Create a popup, but don't add it to the map yet.
      const popup = new this.$mapboxgl.Popup({
        closeButton: false,
        closeOnClick: false
      });
      
      map.on('mouseenter', 'iconImage', (e) => {
      // Change the cursor style as a UI indicator.
      map.getCanvas().style.cursor = 'pointer';
      
      // Copy coordinates array.
      const coordinates = e.features[0].geometry.coordinates.slice();
      const description = e.features[0].properties.description;
      
      // Ensure that if the map is zoomed out such that multiple
      // copies of the feature are visible, the popup appears
      // over the copy being pointed to.
      while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
        coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
      }
      
      // Populate the popup and set its coordinates
      // based on the feature found.
      popup.setLngLat(coordinates).setHTML(description).addTo(map);
      });
      
      map.on('mouseleave', 'iconImage', () => {
        map.getCanvas().style.cursor = '';
        popup.remove();
      });

效果展示:
在这里插入图片描述

其他鼠标以及地图飞行平移事件方法:

  1. 鼠标经过事件
map.on('mouseenter', 'addLayer的id值', (e) => {
    console.log('e', e);
});

打印输出结果:
在这里插入图片描述

  1. 鼠标点击事件
map.on('click', 'addLayer的id值', (e) => {
    console.log('e', e);
});

打印输出结果:
在这里插入图片描述

  1. 地图平移
// center为要平移的坐标,zoom为平移的缩放级别
map.flyTo({ center:[116.00, 39.48], zoom: 9 });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

管理类联考——逻辑——知识篇——第一章 性质命题

第一章 性质命题&#xff08;最基础&#xff0c;最难*****&#xff09; 一、性质命题定义&#xff08;必考&#xff09; 判断事物具有或不具有某种性质的命题。 二、性质命题的四种基本形式 全称肯定&#xff1a;①所有的A都是B 全称否定&#xff1a;②所有的A不是B 特称肯…

Nature子刊:光遗传在绒猴执行检测任务中的行为效应

狨猴体型小&#xff0c;具有巨大的基因修饰潜力&#xff0c;并可表现复杂的行为&#xff0c;已经成为神经科学领域的一个关键模型。 德国恩斯特斯特朗格曼神经科学研究所与马克斯普朗克学会的研究人员设计了一种轻质的、3D打印的植入物&#xff0c;利用高密度硅基微电极阵列&am…

Monorepo vs. Microrepo: 选择适合你的代码仓库策略

简介 在软件开发领域&#xff0c;选择合适的代码仓库策略对于优化协作、可扩展性和代码质量至关重要。Monorepo和Microrepo是两种流行的方法&#xff0c;它们提供了各自的优势和考虑因素。本文将探讨这两种策略的特点&#xff0c;解释为何不同的公司选择不同的选项&#xff0c;…

基于Hexo和Butterfly创建个人技术博客,(5) 使用Hexo的Tags Plugin插件增强博客文章内容和视觉表现力

Hexo官司网查看 这里 注意&#xff1a; Tags语法是Hexo插件提供的&#xff0c;是非标准语言&#xff0c;写文章时要注意以下几点&#xff1a; 用于在文章中快速插入特定的内容&#xff0c;作用等同于其它语言&#xff0c;可理解为一种增强版本的markdown&#xff1b;可混合Mark…

Linux系统编程学习 NO.7 ——sudo配置、编译器的使用

引言&#xff1a; 现在是北京时间2023年6月14日8点16分&#xff0c;期末考试在即&#xff0c;重心可能得转移到考试上了。不过想到马上就可以回家陪家人过端午节&#xff0c;还是非常开心的。放暑假了就可以好好陪家人了。尝试一下换个环境复习吧&#xff0c;洗漱一下就去图书…

智见|比亚迪廉玉波:2023年销量目标300万辆

营收4240亿元&#xff0c;同比增长96%&#xff1b;归属上市公司股东净利润166亿元&#xff0c;同比增长445.86%&#xff1b;累计销售186.85万辆&#xff0c;同比增长152.5%……这是2022年比亚迪的成绩单。 据比亚迪披露&#xff0c;仅2022年一年新能源汽车的销量&#xff0c;就…

【重要】MThings V0.5.0更新要点

再见了BUG&#xff0c;为了改善质量&#xff0c;我们已修正了一些问题&#xff0c;以便您能继续富有成效且令人敬畏。 下载地址&#xff1a; http://gulink.cn/download 01. [新增]支持数据网关功能。 数据网关功能提供协议转换和数据汇聚功能&#xff0c;可实现不同的通道类型…

1--Gradle入门 - 简介、安装、目录结构、创建项目

1--Gradle入门 - 简介、安装、目录结构、创建项目 Gradle 官网 Gradle官网地址&#xff1a;Gradle Build Tool Gradle官方下载安装教程页面&#xff1a;https://gradle.org/install/ Gradle官方用户手册&#xff1a;https://docs.gradle.org/current/userguide/userguide.html …

4--Gradle入门 - 创建普通的web工程

4--Gradle入门 - 创建普通的web工程 前言 上一篇&#xff0c;我们已经创建了java工程&#xff0c;本篇章再来创建web工程。 “ 其实没啥用&#xff0c;还是研究如何部署 Springboot 环境就好了 ” 创建普通的web工程 1. 新建 gradle 管理的工程项目 1685862847224 2. 设置项目使…

前端构建工具的未来

本文作者系360奇舞团前端开发工程师 本文为翻译 原文标题&#xff1a;The Future Of Frontend Build Tools 原文作者&#xff1a;Alexander Joseph 原文链接&#xff1a;https://www.smashingmagazine.com/2022/06/future-frontend-build-tools/ 前端构建工具对现代前端开发者的…

基于SpringCloud+Vue房产销售平台的设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

数据库从业者在行业的变革下------越来越难

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

有趣的数学 依靠想象力的微积分

1、无限分割计算圆的面积 考虑将圆切成若干等份&#xff0c;下图为4等份。 下图为8等份。 下图为16等份。 下图为最终想象出来的极限矩形&#xff0c;据此分割为无穷等份的圆拼接为一个矩形。 矩形的面积 r * C / 2。 r为半径&#xff0c;C为周长。 2、夹逼法计算圆周率 借助…

使用SwinTransformer进行图片分类

SwinTransformer 是微软亚洲研究院在2021年提出的适用于CV领域的一种基于Tranformer的backbone结构。 它是 Shift Window Transformer 的缩写&#xff0c;主要创新点如下。 1&#xff0c;分Window进行Transformer计算&#xff0c;将自注意力计算量从输入尺寸的平方量级降低为线…

力扣刷题记录(一)剑指Offer(第二版)

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

【JVM系列】jvm内存结构详解

文章目录 前言HotSpot VM介绍内存结构程序计数器JVM栈本地方法栈Java堆方法区运行时常量池 永久代和元空间永久代&#xff08;PermGen&#xff09;元空间&#xff08;Metaspace&#xff09; 直接内存总结 前言 我们为什么要学习JVM&#xff1f; 面试的需要中高级程序员的必备技…

java的字符流

字符流的底层也是字节流。字符流字节流字符集。 特点是输入流一次读一个字节&#xff0c;遇到中文时&#xff0c;一次读多个字节&#xff08;读多少个与字符集有关&#xff09;&#xff1b;输出流底层会把数据按照指定的编码方式进行编码&#xff0c;变成字节再写到文件中。 字…

AI绘图高级篇 第7篇 MJ以图换图-卡通头像

大家好&#xff0c;我是菜鸟哥 这个是我们MJ系列的第7篇&#xff0c;以前在会员群里发过&#xff0c;就是把头像做成卡通或者3D的效果还是很酷&#xff0c;或者是迪斯尼风格的。其实非常简单&#xff0c;就是用了一个MJ的以图换图的功能&#xff0c;今天给大家详细的说一下。 前…

ChatGPT 指南:如何与人工智能模型进行对话与互动

人工智能技术的快速发展使得我们能够与智能机器进行对话和互动。 ChatGPT 是一种基于 GPT-3.5 架构的强大语言模型&#xff0c;它能够进行自然语言处理&#xff0c;理解我们的问题并提供相应的回答。本文将为您提供使用 ChatGPT 进行对话和互动的详细指南。 1、提出问题 与 Cha…

Python爬虫之基础知识

爬虫基础知识 一、爬虫的概念 模拟浏览器&#xff0c;发送请求&#xff0c;获取响应 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟客户端(主要指浏览器)发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;…