三、前端高德地图、测量两个点之前的距离

news/2024/5/17 9:48:06

点击测距工具可以开启测量,再次点击关闭测量,清除地图上的点、连线、文字

在这里插入图片描述
在这里插入图片描述

再次点击测量工具的时候清除。

首先

上面的功能条河下面的地图我搞成了两个组件,他们作为兄弟组件存在,所以简单用js写了个事件监听触发的对象,
eventObj.js

const eventBus = {evnetList: [],// 监听事件$on(callbackFun, name) {this.evnetList.push({name,callbackFun})},//触发事件$emit(name, data) {this.evnetList.forEach(element => {if (name === element.name) {element.callbackFun(data)}});},
}
export default eventBus

我们在头部工具栏组件中引入:

import eventBus from './eventObj';

点击的dom

<divonClick={()=>this.clickFlagFun()}className={this.state.clickFlag ? 'rightBox1click' : 'rightBox1 '}><Icon type="discount-o" style={{ marginRight: '4px' }} />AB间距</div>

事件:
clickFlag: 需要再 state 中提前声明 为 false 默认为关闭

  clickFlagFun() {this.setState({clickFlag: !this.state.clickFlag,},()=>{Toast.prompt({content: this.state.clickFlag ? '已开启测量工具' : '已关闭测量工具',duration: 5000,size: 'large'});//主动触发自定义事件eventBus.$emit('changclickFlag',this.state.clickFlag)});}

在地图盒子中:
我们需要在挂载的时候就进行监听这个事件:
执行相应的逻辑(这个一会说)

    eventBus.$on((flag) => {this.setState({isCanClickMarkerLineFlag: flag,},() => {if (!flag) {//   清楚line  和 textthis.map.remove([...this.state.textAndlineObj,...this.state.currentClickMarkerList,]);this.setState({currentClickMarkerList: [],currentClickOptionsList: [],textAndlineObj: [],});this.map.off('click', clickHandler);return false;}// 测量距离方法flag && this.map.on('click', clickHandler);});}, 'changclickFlag');

看地图组件全部代码,里面有对应注释(其实代码很low 但是不想整理 因为它能跑):

import React, { Component } from 'react';
import { Icon } from '@alife/aisc';
import AMapLoader from '@amap/amap-jsapi-loader';
import '../index.scss';
import eventBus from './eventObj';
import { base64PNG, sanjiaoSVG, gray, red, green } from './base64png.js';
const content = `<div style="width:auto;padding:3px;background:gray;color:#000;border:none">EU126,租凭<br/>XX.XX MW</div>`;
class MapComponent extends Component {constructor() {super();this.map = {};this.AMap = null;this.state = {isCanClickMarkerLineFlag: false,zoom: 10,datalist: [{icon: 1,position: [121.487899486, 31.24916171],title: 'aaaaa',zoom: 3,content,},{icon: 2,position: [121.287899486, 31.34916171],title: 'bbb',zoom: 3,content,},{icon: 3,position: [121.387899486, 31.44916171],title: 'ccc',zoom: 3,content,},{icon: 3,position: [121.487899486, 31.44916171],title: 'ddd',zoom: 3,content,},{icon: 3,position: [121.487899486, 31.54916171],title: 'eee',zoom: 3,content,},],currentClickMarkerList: [],currentClickOptionsList: [],textAndlineObj: [],};}// 2.dom渲染成功后进行map对象的创建componentDidMount() {const that = thisvar clickHandler =  function (e) {// 最多生成两个标记点if (that.state.currentClickOptionsList.length <= 2) {let arrList = [];// 只能点击两个坐标if (that.state.currentClickOptionsList.length !== 0) {// 第一个 +  第二个标记点坐标arrList = [that.state.currentClickOptionsList[0],[e.lnglat.getLng(), e.lnglat.getLat()],];} else {// 第一标记点坐标arrList = [[e.lnglat.getLng(), e.lnglat.getLat()]];}// 为了避免重复渲染//   清楚line  和 textthat.map.remove([...that.state.textAndlineObj,...that.state.currentClickMarkerList,]);that.setState({// 坐标存起来  目前没有用到 只是做长度判断使用currentClickOptionsList: arrList,},() => {// 循环生成点击两次的坐标点const currentClickOptionsList = arrList;let arr = [];currentClickOptionsList.map((i, idx) => {var marker1 = new AMap.Marker({icon: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',position: new AMap.LngLat(i[0], i[1]),zoom: 888,// 是否拖拽draggable: true,// clickable: true,extData: {flag: idx,},// 图标大小offset: [-10, -31],});//   存起来两个标点对象arr = [...arr, marker1];});// 标点对象为两个的时候 展示 line  和 Textif (arr.length == 2) {that.lineAndTextFun(that, arr);}// 存储标记点that.setState({currentClickMarkerList: arr,});// mapthat.map.add(arr);});}}eventBus.$on((flag) => {this.setState({isCanClickMarkerLineFlag: flag,},() => {if (!flag) {//   清楚line  和 textthis.map.remove([...this.state.textAndlineObj,...this.state.currentClickMarkerList,]);this.setState({currentClickMarkerList: [],currentClickOptionsList: [],textAndlineObj: [],});this.map.off('click', clickHandler);return false;}// 测量距离方法flag && this.map.on('click', clickHandler);});}, 'changclickFlag');AMapLoader.reset(); //需要把这个reset一下AMapLoader.load({key: 'xxxxxxxxxxxxxx', // 申请好的Web端开发者Key,首次调用 load 时必填version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15plugins: [''], // 需要使用的的插件列表,如比例尺'AMap.Scale'等}).then((AMap) => {console.log(AMap, 'AMap');this.AMap = AMap;this.renderMapFun();}).catch((e) => {console.log(e);});}renderMapFun() {// 生成容器this.map = new this.AMap.Map('container111', {zoom: this.state.zoom, //初始化地图级别center: [121.487899486, 31.24916171], //初始化地图中心点位置-上海});const obj = {1: green,2: red,3: gray,};// 生成 默认点let arr = [];this.state.datalist.map((i) => {var marker1 = new AMap.Marker({icon: obj[i.icon],position: i.position,title: i.title,zoom: i.zoom,});marker1.setLabel({content: i.content,offset: new AMap.Pixel(-20, 28),});arr = [...arr, marker1];});this.map.add(arr);}//   划线 和 展示 textlineAndTextFun = (that, arr) => {var line = new AMap.Polyline({strokeColor: '#80d8ff',isOutline: true,outlineColor: 'white',});that.map.add(line);var text = new AMap.Text({text: '',style: {'background-color': '#29b6f6','border-color': '#e1f5fe','font-size': '12px',},});function computeDis() {var p1 = arr[0].getPosition();var p2 = arr[1].getPosition();var textPos = p1.divideBy(2).add(p2.divideBy(2));var distance = Math.round(p1.distance(p2));var path = [p1, p2];line.setPath(path);text.setText('两点相距' + distance + '米');text.setPosition(textPos);}computeDis();arr[0].on('dragging', computeDis);arr[1].on('dragging', computeDis);that.map.add(text);that.setState({textAndlineObj: [text, line],});};addFun = () => {const { zoom } = this.state;if (zoom !== 18) {this.setState({zoom: zoom + 1,},() => {// 设置地图显示的缩放级别,在PC上,参数zoom可设范围:[3,18];// 在移动端:参数zoom可设范围:[3,19]。3D地图下,可将zoom设置为浮点数。/this.map.setZoom(this.state.zoom);});}};downFun = () => {const { zoom } = this.state;if (zoom !== 3) {this.setState({zoom: zoom - 1,},() => {this.map.setZoom(this.state.zoom);});}};render() {// 1.初始化创建地图容器,div标签作为地图容器,同时为该div指定id属性;return (<div style={{ width: '100%', height: '100%' }}><div id="container111" className="map"><div className="leftBox"><div className="top"><Icon type="add" onClick={this.addFun} />{this.state.zoom} <Icon type="minus" onClick={this.downFun} /></div><div className="bottom"><div className="box"><img src={gray} alt="" />预计裁撤</div><div className="box"><img src={red} alt="" />建设中</div><div className="box"><img src={green} alt="" />预计保留</div></div></div></div></div>);}
}
//导出地图组建类
export default MapComponent;

总结一下吧:
1、点击开启测距
2、点出两个距离点的时候展示测出的距离描述(Line、Text)
3、再点击其他区域,会再次生成一个新的
4、可以实现拖拽效果,重新测出距离
5、再次点击开始测距,关闭,同时清除map上的距离点、line、text。

看的有点蒙的话 可以先看看前两篇:
一、前端高德地图注册、项目中引入、渲染标记(Marker)and覆盖物(Circle)
二、前端高德地图、渲染标记(Marker)引入自定义icon,手动设置zoom

另外献上官方连接:
1、https://lbs.amap.com/demo/javascript-api/example/map-componets/map-overlays
2、https://lbs.amap.com/demo/javascript-api/example/event/map-click-event
3、https://lbs.amap.com/demo/javascript-api/example/event/event-map-drag


http://www.mrgr.cn/p/35250286

相关文章

视频怎么加水印?这几种加水印方法非常简单

给视频加水印是一种保护知识产权的方法。水印是一种数字标记&#xff0c;可以包括作者的名称、品牌标识或其他信息&#xff0c;以便识别和追踪视频的来源。通过给视频加水印&#xff0c;能够有效地防止视频被盗用或未经授权的使用&#xff0c;让我们的知识产权得到更好的保护。…

fpga开发——蜂鸣器

蜂鸣器的原理 有源蜂鸣器和无源蜂鸣器 无源蜂鸣器利用电磁感应现象&#xff0c;为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声&#xff0c;接入直流电只能持续推动振膜而无法产生声音&#xff0c;只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声…

Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三

Ueditor 百度强大富文本Springboot 项目集成使用 首先如果大家的富文本中不考虑图片或者附件的情况下&#xff0c;只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉&#xff01; 然后就是说如…

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 &#xff08;NCCM&#xff09;解决方案&#xff…

14个最强大的建筑设计AI工具

在整个行业中&#xff0c;建筑师在他们的创造性追求中正在拥抱一个新的合作伙伴&#xff1a;AI。 一旦受到重复和单调的困扰&#xff0c;建筑工人发现自己正处于数字革命的风口浪尖&#xff0c;其中比特和字节掌握着自动化和曾经难以想象的可能性的关键。 推荐&#xff1a;用 …

【Linux】网络基础之TCP协议

目录 &#x1f308;前言&#x1f338;1、基本概念&#x1f33a;2、TCP协议报文结构&#x1f368;2.1、源端口号和目的端口号&#x1f369;2.2、4位首部长度&#x1f36a;2.3、32位序号和确认序号&#xff08;重点&#xff09;&#x1f36b;2.4、16位窗口大小&#x1f36c;2.5、…

golang单元测试及mock总结

文章目录 一、前言1、单测的定位2、vscode中生成单测 二、构造测试case的注意事项1、项目初始化2、构造空interface{}3、构造结构体的time.Time类型4、构造json格式的test case 三、运行单测文件1、整体运行单测文件2、运行单个单测文件报错&#xff08;1&#xff09;command-l…

IO流(2)-缓冲流

1. 缓冲流的简单介绍 我们上贴说到了 FileInputStream&#xff0c;FileOutputStream&#xff0c;FileReader&#xff0c;FileWriter。 其实这四个流&#xff0c;我们通常把它叫做原始流&#xff0c;它们是比较偏底层的&#xff1b;而今天我们要说的四个缓冲流&#xff0c;如…

微服务 云原生:搭建 K8S 集群

为节约时间和成本&#xff0c;仅供学习使用&#xff0c;直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境&#xff1a;CentOS-7-x86_64-Minimal-2009 镜像&#xff0c;为方便起见&#xff0c;直接在 root 账户下操作&#xff0c;现实情况最好不要这样做。 基础准备 关…

vins调试的注意事项

1、摄像头的内参和畸变矫正系数 这个系数不对&#xff0c;没法做&#xff0c;因为下一步没法做对。这个会导致系统无法初始化。 2、对畸变的像素点&#xff0c;求得归一化坐标的方法 理解不同矫正模型的原理&#xff0c;确保矫正对了&#xff0c;得到z1平面的去畸变点。 3、摄…

map,set的封装(基于改造红黑树)

目录 引言 1.迭代器 2.map的[]重载 3.KeyOfValue模板参数 4.整体代码展示 //改造后的红黑树代码 #include <iostream> using namespace std;enum Colour {RED 0,BLACK, };//为了实现map与set封装使用同一个模板红黑树&#xff0c;前者的value是pair&#xff0c;后者…

【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片

文章目录 前言1. 导入模块和库2. 定义函数 download_image(url, filepath)3. 定义函数 get_page()4. 主程序入口 完整代码运行效果 结束语 前言 本文主要介绍了使用Python编写的多线程爬虫程序&#xff0c;用于下载表情包网站上的图片。通过解析网页内容和使用XPath定位&#x…

python爬虫基础

文章目录 前言爬虫简介urllib库的使用如何获取网页的源码一个类型六个方法一个类型六个方法1、read()方法2、readline()方法3、readlines()方法4、getcode()5、geturl()6、getheaders() urllib下载下载网页下载图片下载视频 请求对象的定制 未完待续 前言 爬虫爬的好牢饭吃的早…

关于K8s的Pod的详解(一)

关于K8s的Pod的详解&#xff08;一&#xff09; Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建&#xff0c;调度&#xff0c;管理的基本单位。由上级的Controller对Node上安装的Kubelet发…

云安全攻防(二)之 云原生安全

云原生安全 什么是云原生安全&#xff1f;云原生安全包含两层含义&#xff1a;面向云原生环境的安全和具有云原生特征的安全 面向云原生环境的安全 面向云原生环境的安全的目标是防护云原生环境中的基础设施、编排系统和微服务系统的安全。这类安全机制不一定会具有云原生的…

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历…

Web-1-网站工作流程介绍

我们学习web开发&#xff0c;首先要知道什么是Web&#xff1f; Web: 全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站 比如我展示的这京东&#xff0c;淘宝唯品会都叫做网站&#xff0c;那么现在大家想一下&#xff0c;你还知道什…

论文笔记:Adjusting for Autocorrelated Errors in Neural Networks for Time Series

2021 NIPS 原来的时间序列预测任务是根据预测论文提出用一阶自回归误差预测 一阶差分&#xff0c;类似于ResNet的残差思路&#xff1f;记为pred&#xff0c;最终的预测结果

解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo

&#x1f600;前言 解决PicGo上传图片失败错误信息和上传图片失败包404错误以及Typora怎么一键导入本地图片到PicGo &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#x…