从零开始Vue项目中使用MapboxGL开发三维地图教程(四)改变鼠标style、地图置于单击feature中心、量测距离和polgon面积和中心点坐标

news2024/11/28 6:54:04

文章目录

      • 1、飞行平移到鼠标点击图层属性的地图中心位置
      • 2、当鼠标光标进入“圆”图层中的某个要素时,将其更改为指针
      • 3、量测距离
      • 4、量测area面积和中心点坐标

1、飞行平移到鼠标点击图层属性的地图中心位置

        //鼠标点击事件
        map.on("click", "iconImage", (e) => {
          console.log("e", e);
          const lng = e.lngLat.lng;
          const lat = e.lngLat.lat;
          const coordinates = e.lngLat;

          const description = "点击的位置坐标为:" + lng + "/" + lat;
          popup.setLngLat(coordinates).setHTML(description).addTo(map);
          //飞行平移到地图中心的位置
          map.flyTo({
              center: e.lngLat,
              zoom: 3,
              speed: 0.2,
              curve: 2,
          });

        });

2、当鼠标光标进入“圆”图层中的某个要素时,将其更改为指针

// Change the cursor to a pointer when the it enters a feature in the 'circle' layer.
	map.on('mouseenter', 'circle', () => {
	map.getCanvas().style.cursor = 'pointer';
});

// Change it back to a pointer when it leaves.
	map.on('mouseleave', 'circle', () => {
	map.getCanvas().style.cursor = '';
});

在这里插入图片描述

3、量测距离

单击地图上的点来创建线,使用turf测量线的长度距离。
这里我们使用到turfjs库,安装并引入turf。

npm安装

npm install @turf/turf

页面中引入:

  import * as turf from '@turf/turf'

页面中添加一个容器:

<div id="distance" class="distanceContainer"></div>

核心代码:

 const distanceContainer = document.getElementById('distance');
          // GeoJSON object to hold our measurement features
          const geojson = {
            'type': 'FeatureCollection',
            'features': []
          };
          // Used to draw a line between points
          const linestring = {
            'type': 'Feature',
            'geometry': {
              'type': 'LineString',
              'coordinates': []
            }
          };

          map.addSource('geojson', {
            'type': 'geojson',
            'data': geojson
          });

          // Add styles to the map
          map.addLayer({
            id: 'measure-points',
            type: 'circle',
            source: 'geojson',
            paint: {
              'circle-radius': 5,
              'circle-color': '#000'
            },
            filter: ['in', '$type', 'Point']
          });
          map.addLayer({
            id: 'measure-lines',
            type: 'line',
            source: 'geojson',
            layout: {
              'line-cap': 'round',
              'line-join': 'round'
            },
            paint: {
              'line-color': '#000',
              'line-width': 2.5
            },
            filter: ['in', '$type', 'LineString']
          });

          map.on('click', (e) => {
            const features = map.queryRenderedFeatures(e.point, {
              layers: ['measure-points']
            });

            console.log(features)

            // Remove the linestring from the group
            // so we can redraw it based on the points collection.
            if (geojson.features.length > 1) geojson.features.pop();

            // Clear the distance container to populate it with a new value.
            distanceContainer.innerHTML = '';

            // If a feature was clicked, remove it from the map.
            if (features.length) {
              const id = features[0].properties.id;
              geojson.features = geojson.features.filter(
                (point) => point.properties.id !== id
              );
            } else {
              const point = {
                'type': 'Feature',
                'geometry': {
                  'type': 'Point',
                  'coordinates': [e.lngLat.lng, e.lngLat.lat]
                },
                'properties': {
                  'id': String(new Date().getTime())
                }
              };

              geojson.features.push(point);
            }

            if (geojson.features.length > 1) {
              linestring.geometry.coordinates = geojson.features.map(
                (point) => point.geometry.coordinates
              );

              geojson.features.push(linestring);

              // Populate the distanceContainer with total distance
              const value = document.createElement('pre');
              const distance = turf.length(linestring);
              value.textContent = `Total distance: ${distance.toLocaleString()}km`;
              distanceContainer.appendChild(value);
            }

            map.getSource('geojson').setData(geojson);
          });
        });

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

          const features = map.queryRenderedFeatures(e.point, {
            layers: ['measure-points']
          });
          // Change the cursor to a pointer when hovering over a point on the map.
          // Otherwise cursor is a crosshair.
          map.getCanvas().style.cursor = features.length ?
            'pointer' :
            'crosshair';

        });

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

4、量测area面积和中心点坐标

在地图上画一个多边形,并计算多边形中包含的面积和中心点坐标。

操作步骤:

  • 单击地图开始绘制多边形。

  • 绘制最终顶点时双击以完成多边形。多边形的总面积将显示在地图的左上角。

  • 要删除多边形并绘制新多边形,请使用地图右上角的绘制工具。

该功能使用mapbox gl draw绘制多边形,并使用Turf.js计算其面积(平方米)和中心点坐标。

代码如下:

创建一个div元素:

<div id="calculated-area" style="width: 250px;height: 150px;background-color: #ffff;margin: 10px;padding: 10px;">

实例化mapboxdraw:

        const draw = new MapboxDraw({
          // displayControlsDefault: false,
          // Select which mapbox-gl-draw control buttons to add to the map.
          controls: {
            polygon: true,
            trash: true
          },
          // Set mapbox-gl-draw to draw by default.
          // The user does not have to click the polygon control button first.
          defaultMode: 'draw_polygon'
        });
        map.addControl(draw);

        map.on('draw.create', updateArea);
        map.on('draw.delete', updateArea);
        map.on('draw.update', updateArea);

        function updateArea(e) {
          const data = draw.getAll();
          console.log(data)
          const answer = document.getElementById('calculated-area');
          if (data.features.length > 0) {
            const area = turf.area(data);
            // const polygonfeatures = turf.points([data.features[0].geometry.coordinates[0]])
            const centrepostion = turf.centroid(data.features[0])
            // Restrict the area to 2 decimal points.
            const rounded_area = Math.round(area * 100) / 100;
            answer.innerHTML = `<p>面积为:<strong>${rounded_area}</strong>square meters</p>
           <br />
            <p>中心点坐标:${centrepostion.geometry.coordinates}</p>`;

            console.log(centrepostion)
          } else {
            answer.innerHTML = '';
            if (e.type !== 'draw.delete')
              alert('Click the map to draw a polygon.');
          }
        }

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

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

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

相关文章

基于Amazon SageMaker平台部署Stable Diffusion模型实现——图片识别

序言&#xff1a; 当谈到机器学习和人工智能的开发和部署时&#xff0c;Amazon SageMaker是一个非常强大和全面的平台。作为一项托管式的机器学习服务&#xff0c;Amazon SageMaker提供了一套完整的工具和功能&#xff0c;帮助开发者轻松构建、训练和部署机器学习模型。 首先&…

程序猿成长之路之密码学篇-AES算法解密详解及代码呈现

各位csdn的小伙伴们大家好呀&#xff0c;我又回来了&#xff0c;这篇文章为上一次介绍AES加密算法的姊妹篇&#xff0c;重点将会详细介绍一下AES算法的解密过程并呈上AES加解密的代码。【暂时不包含iv即偏移量】。下面请跟随我一同进入AES解密的世界。 AES加密详解 如果有小伙…

ffmpeg编译笔记:ubuntu18.04编译ffmpeg5.1 x86与64

一、前言 本篇描述了ffmpeg5.1在ubuntu18.04上的编译经验。编译后的库支持h264&#xff0c;h265软硬解码&#xff0c;支持https&#xff0c;支持SDL。本篇同时描述openssl在ffmpeg中的编译经验&#xff0c;以及提供ffmpeg编译和openssl编译的32位和64位的配置命令。 二、相关…

这8道接口测试面试题

接口测试常见的问题了。 大家乍一看&#xff01; 接口测试面试题 这几个问题&#xff0c;能答出来几个&#xff1f;有没有8个都能够完美的答出来的&#xff1f;在留言区打出你的数字。&#xff08;0~8&#xff09; 这些问题你回答起来&#xff0c;不要吞吞吐吐只说几个关键字…

1. java.io.File 类的使用

1.1 概述 • File 类及本章下的各种流&#xff0c;都定义在 java.io 包下。 • 一个 File 对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c; 与平台无关。&#xff08;体会万事万物皆对象&#xff09; • File 能新建、删除…

重启好多次路由器,还是上不了网怎么办?

大家好&#xff0c;我的网工朋友 遇到突发的网络断连&#xff0c;你一般会怎么做&#xff1f; 我觉得很多人都会插拔一下路由器&#xff0c;这和电脑不行了&#xff0c;马上就重启电脑一样&#xff0c;是刻在DNA里的傻瓜操作。 但是也有很多时候&#xff0c;这个傻瓜操作是解…

PrivateGPT:安全和私密的离线 GPT-4

在人工智能 (AI) 和自然语言处理 (NLP) 领域&#xff0c;隐私通常是一个基本问题&#xff0c;尤其是在处理敏感数据时。PrivateGPT 是这一领域的突破性发展&#xff0c;正面解决了这个问题。它旨在在没有互联网连接的情况下在本地运行&#xff0c;通过防止数据离开您的执行环境…

这些方法可以手写扫描识别

小伙伴们知道有一项技术是可以将我们手写的东西识别出来吗&#xff1f;这一项创新的技术就是手写识别功能&#xff0c;它能够将手写内容快速转换为数字或文本格式&#xff0c;并提高信息处理和管理的效率。而且相比传统的手工记录方式&#xff0c;手写识别功能具有较高的准确性…

腾讯测试开发 4 轮面试,接到 30k*15 的 Offer !详解面试流程和真题

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 但说实话&#xff0c;想进大厂还真没那么容易。我的一个朋…

find命令

你将看到的第一个命令是find。这是个用于搜索文件的命令&#xff0c;它极其有用&#xff0c;但Linux初学者常常觉得它不易使用&#xff0c;这不仅仅是因为它有选项、测试和动作类型的参数&#xff0c;还因为其中一个参数的处理结果可能会影响到后续参数的处理。在深入研究这些选…

pandas---缺失值的处理

1. 处理缺失值 判断数据中是否包含NaN&#xff1a; pd.isnull(df)&#xff1b;pd.notnull(df) 存在缺失值nan: 删除存在缺失值的:dropna(axisrows) 不会修改原数据&#xff0c;需要接受返回值&#xff1b; 替换缺失值:fillna(value, inplaceTrue) value:替换成的值&#…

基于STM32的四旋翼无人机项目(一):基础知识篇

前言&#xff1a;本篇博客为飞控专栏的第一篇系统性概述文章&#xff0c;将对飞控系统进行详细讲解介绍。考虑到飞控项目具有一定工程复杂度&#xff0c;所以作者将整个项目进行分章节教学与讲解&#xff0c;希望可以给读者朋友带来更好地学习体验。项目将以 C-Quad 四轴无人机…

SpringBoot 中使用 JWT 案例分享详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

大模型LLM领域,有哪些可以作为学术研究方向?

清湛人工智能研究院 2023-05-31 09:23 发表于江苏 编者&#xff1a;本文转载了清华大学计算机系刘知远教授对大模型的一些思索&#xff0c;以飨读者。 刘知远 CCF 高级会员&#xff0c;CCCF 前编委。清华大学计算机系副教授、博士生导师。已在ACL、IJCAI、AAAI等人工智能领域…

回归预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于GRU-AdaBoost门控循环单元结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于GRU-AdaBoost门…

单品GMV破千万,这些品类正在抖音热卖

优势品类及核心产品能更好触达消费者&#xff0c;以较低的成本让用户感知品牌&#xff0c;塑造品牌力。 抖音作为品牌最核心的线上渠道之一&#xff0c;该如何找到平台优势品类&#xff1f;制定品牌营销策略&#xff1f;有效提升产品销量呢&#xff1f; 近期&#xff0c;新抖上…

【CesiumJS入门】(4)加载3D Tiles并获取tileset

前言 本次&#xff0c;我们将写一个函数来加载3D Tiles数据&#xff0c; 3D Tiles数据的文档&#xff1a;CesiumGS/3d-tiles: Specification for streaming massive heterogeneous 3D geospatial datasets (github.com) 同时我们将获取加载成功后的tileset数据集&#xff08;有…

Python 中错误 ImportError: No Module Named Sklearn

在 Python 中,sklearn 被用作机器学习工具,用于在回归、集群等方面创建程序。很多时候,导入它会抛出错误—— No module named sklearn。 这意味着由于安装错误、无效的 Python 或 pip 版本或其他问题,系统无法找到它。 Python中错误ImportError: No module named sklearn…

基于Java营业厅宽带系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Karl Guttag评Vision Pro:比Quest Pro做了更多正确选择

上周苹果正式发布Vision Pro&#xff0c;尽管要到明年才发售&#xff0c;但光学领域的专业博主Karl Guttag也发表了自己的看法。他提到&#xff1a;目前受邀体验的媒体中要不是苹果粉丝、要不就是对AR、VR了解比较少&#xff0c;没有我看到“批判性思维”或太多对技术分析的内容…