高德地图JS API AMap.MouseTool绘制

news2024/11/14 14:05:34

fang在这里插入图片描述

🤖 作者简介:水煮白菜王 ,一位资深前端劝退师 👻
👀 文章专栏: 高德AMap专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧✍。
感谢支持💕💕💕

关联文章:
高德地图JS API 开发——区划浏览DistrictExplorer
高德地图JS API加载行政区边界AMap.Polygon

目录

    • 高德地图JS API AMap.MouseTool绘制
      • 鼠标工具 AMap.MouseTool
      • 运行示例
      • 实现步骤
        • 1.引入JS API加载地图
        • 2.创建MouseTool工具类
        • 3.通过鼠标进行绘制覆盖物
        • 4.获取通过 AMap.MouseTool 绘制的点、线、面覆盖物的位置/范围/路径
        • 5.鼠标工具距离量测、面积量测、拉框放大
        • 全部代码

高德地图JS API AMap.MouseTool绘制

在前期文章谈到过关于高德矢量图形,用于在地图上绘制线、面等矢量地图要素的类型;接下来介绍鼠标工具 MouseTool 绘制,包括绘制线段、多边形、矩形、圆形,这种功能来DIY区域块、设置为围栏划分。

鼠标工具 AMap.MouseTool

new AMap.MouseTool(map: Map)

AMap.MouseTool 插件主要通过用户在地图图面的鼠标操作,绘制相应的点、线、面覆盖物;或者进行图面的距离测量、面积量测、拉框放大、拉框缩小等。。其下的成员主体函数:marker(opts)、circle(opts)、rectangle(opts)、polyline(opts)、polygon(opts)、measureArea(opts)、rule(opts)、rectZoomIn(opts)、rectZoomOut(opts)、及close(ifClear)

成员函数描述参数
marker([opts])开启鼠标画点标注模式。鼠标在地图上单击绘制点标注,标注样式参考MarkerOptions设置opts (MarkerOptions) 可选,参考MarkerOptions设置
circle([opts])开启鼠标画圆模式。鼠标在地图上拖动绘制相应的圆形。圆形样式参考CircleOptions设置opts (CircleOptions) 可选,参考CircleOptions设置
rectangle([opts])开启鼠标画矩形模式。鼠标在地图上拉框即可绘制相应的矩形。矩形样式参考PolygonOptions设置opts (PolygonOptions) 可选,参考PolygonOptions设置
polyline([opts])开启鼠标画折线模式。鼠标在地图上点击绘制折线,鼠标左键双击或右键单击结束绘制,折线样式参考PolylineOptions设置opts (PolylineOptions) 可选,参考PolylineOptions设置
polygon([opts])开启鼠标画多边形模式。鼠标在地图上单击开始绘制多边形,鼠标左键双击或右键单击结束当前多边形的绘制,多边形样式参考PolygonOptions设置opts (PolygonOptions) 可选,参考PolygonOptions设置
measureArea([opts])开启面积量测模式。鼠标在地图上单击绘制量测区域,鼠标左键双击或右键单击结束当前量测操作,并显示本次量测结果。量测面样式参考PolygonOptions设置opts (PolygonOptions) 可选,参考PolygonOptions设置
rule([opts])开启距离量测模式。鼠标在地图上单击绘制量测节点,并计算显示两两节点之间的距离,鼠标左键双击或右键单击结束当前量测操作。量测线样式参考PolylineOptions设置 注:不能同时使用rule方法和RangTool插件进行距离量测opts (PolylineOptions) 可选,参考PolylineOptions设置
rectZoomIn([opts])开启鼠标拉框放大模式。鼠标可在地图上拉框放大地图。矩形框样式参考PolygonOptions设置opts (PolygonOptions) 可选,参考PolygonOptions设置
rectZoomOut([opts])开启鼠标拉框缩小模式。鼠标可在地图上拉框缩小地图。矩形框样式参考PolygonOptions设置opts (PolygonOptions) 可选,参考PolygonOptions设置
close([ifClear])关闭当前鼠标操作。参数arg设为true时,鼠标操作关闭的同时清除地图上绘制的所有覆盖物对象;设为false时,保留所绘制的覆盖物对象。默认为falseifClear (boolean) 可选,是否清除地图上的覆盖物

运行示例

InsCode审核中

实现步骤

1.引入JS API加载地图

加载JS API注意AMap.MouseTool需要引入使用 plugins: ["AMap.MouseTool"]

引入方式看自己项目选择,前期文章可供参考👉 「JS API急救包」

  import AMapLoader from '@amap/amap-jsapi-loader';
  
  const initializeMap = async () => {
    await AMapLoader.load({
      key: "", // 请替换为您自己的高德地图API Key
      version: "2.0",
      plugins: ["AMap.MouseTool"] // 引入AMap.MouseTool 插件
    }).then((AMap) => {
    
      map = new AMap.Map('container', {
        zoom: 14
      });
    });
  };
2.创建MouseTool工具类
      //在地图中添加MouseTool插件
      mouseTool = new AMap.MouseTool(map);
      
  	  //添加绘制触发事件draw()
      mouseTool.on('draw', (e) => {
        overlays.value.push(e.obj);
      });
3.通过鼠标进行绘制覆盖物
mouseTool.marker({
 // 在这里配置样式
});

如果想通过鼠标点击,在图面添加自定义样式 Marker 点,只需要在 marker 方法中添加点样式 MarkerOptions。具体配置参考 「点覆盖物」。
线,面的添加方式同上。只要将 marker 方法替换成相应的线 mousetool.polyline(); 或者 面 mousetool.polygon(); 方法即可。

mouseTool.polyline(opts);
mouseTool.polygon(opts);
mouseTool.rectangle(opts);
// 更多...
4.获取通过 AMap.MouseTool 绘制的点、线、面覆盖物的位置/范围/路径

使用鼠标工具绘制的点、折线、多边形、圆形、矩形等覆盖物,都可以通过多边形覆盖物自身的方法,获取到位置/范围/路径。此处以多边形为例,阐述获取相应信息的方式:

    //在地图中添加MouseTool插件
    var mouseTool = new AMap.MouseTool(map);

    //用鼠标工具画多边形
    var drawPolygon = mouseTool.polygon(); 

    //添加事件
    AMap.event.addListener( mouseTool,'draw',function(e){
        console.log(e.obj.getPath());//获取路径/范围
    });
5.鼠标工具距离量测、面积量测、拉框放大

鼠标工具除可以绘制多种覆盖物以外,还可以进行距离量测、面积量测、拉框放大、拉框缩小等操作。

以下以距离量测模式为例介绍。鼠标在地图上单击绘制量测节点,并计算显示两两节点之间的距离,鼠标左键双击或右键单击结束当前量测操作。距离测量方式:

   //在地图中添加MouseTool插件
   var mouseTool = new AMap.MouseTool(map);

   //测量
   mouseTool .rule(); 

在这里插入图片描述

全部代码
<!-- Vue 3 Code -->
<template>
    <div>
      <div ref="container" id="container"></div>
      <div class="info">操作说明:圆和矩形通过拖拽来绘制,其他覆盖物通过点击来绘制</div>
      <div class="input-card">
        <div class="input-item">
          <input type="radio" name="func" value="marker" v-model="selectedTool"><span class="input-text">画点</span>
          <input type="radio" name="func" value="polyline" v-model="selectedTool"><span class="input-text">画折线</span>
          <input type="radio" name="func" value="polygon" v-model="selectedTool"><span class="input-text" style="width:5rem;">画多边形</span>
        </div>
        <div class="input-item">
          <input type="radio" name="func" value="rectangle" v-model="selectedTool"><span class="input-text">画矩形</span>
          <input type="radio" name="func" value="circle" v-model="selectedTool"><span class="input-text">画圆</span>
          <input type="radio" name="func" value="distance" v-model="selectedTool"><span class="input-text">测距</span>
        </div>
        <div class="input-item">
          <input id="clear" type="button" class="btn" value="清除" @click="clearOverlays" />
          <input id="close" type="button" class="btn" value="关闭绘图" @click="closeDrawing" />
        </div>
      </div>
    </div>
  </template>
  
  <script setup>
  import { ref, onMounted, onBeforeUnmount, watch } from 'vue';
  import AMapLoader from '@amap/amap-jsapi-loader';
  
  const containerRef = ref(null);
  const selectedTool = ref('marker');
  const overlays = ref([]);
  
  let map = null;
  let mouseTool = null;
  
  const initializeMap = async () => {
    await AMapLoader.load({
      key: "22b379529dd2879095130ee6b2774d36", // 请替换为您自己的高德地图API Key
      version: "2.0",
      plugins: ["AMap.MouseTool"]
    }).then((AMap) => {
      map = new AMap.Map('container', {
        zoom: 14
      });
  
      mouseTool = new AMap.MouseTool(map);
  
      mouseTool.on('draw', (e) => {
        overlays.value.push(e.obj);
      });
    });
  };
  
  const draw = (type) => {
    switch (type) {
      case 'marker':
        mouseTool.marker();
        break;
      case 'polyline':
        mouseTool.polyline({ 
          strokeColor: '#ff33ff', //轮廓线颜色
          strokeOpacity: 1, //轮廓线透明度
          strokeWeight: 3, //轮廓线宽度
          strokeStyle: "solid", //线样式还支持 'dashed'
         });
        break;
      case 'polygon':
        mouseTool.polygon({ 
          strokeColor: '#3366FF',
          strokeWeight: 3, 
         });
        break;
      case 'rectangle':
        mouseTool.rectangle({ 
          fillColor: '#87CEFA', // 填充颜色
          fillOpacity: 0.2, // 填充透明度
          strokeColor: '#1E90FF',
          strokeWeight: 3, 
         });
        break;
      case 'circle':
        mouseTool.circle({ 
          fillColor: '#ff3333', 
          strokeColor: '#DC143C',
          strokeWeight: 3, 
         });
        break;
      case 'distance':
        mouseTool.rule();
        break;
    }
  };
  
  const clearOverlays = () => {
    map.remove(overlays.value);
    overlays.value = [];
  };
  
  const closeDrawing = () => {
    mouseTool.close(true);
    selectedTool.value = '';
  };
  
  watch(selectedTool, (newVal) => {
    if (newVal) {
      draw(newVal);
    }
  });
  
  onMounted(() => {
    initializeMap();
  });
  
  onBeforeUnmount(() => {
    if (map) {
      map.destroy();
    }
  });
  </script>
  
  <style scoped>
 // import "../assets/mousetool.css"; 示例原样式https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css
  #container {
  height: 100vh;
  width: 100vw;
}
  </style>

在这里插入图片描述
如果你觉得这篇文章对你有帮助,请点赞 👍、收藏 👏 并关注我!👀
在这里插入图片描述

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

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

相关文章

基于SpringBoot的校园二手商品交易平台的设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、课题研究背景意义及现状 1.课题背景 随着社会的发展&#xff0c;低碳经济生活已成为当今世界发展的主题&#xff0c;物品循环利用、回收再造成为了社会关注的焦点。调查发现&#xff0c;随着大学生购买力的增强&#xff0…

李宏毅结构化学习 02

文章目录 一、上篇博文复习二、Separable Case三、Non-separable Case四、Considering Errors五、Regularization六、Structured SVM七、Cutting Plane Algorithm for Structured SVM八、Multi-class and binary SVM九、Beyond Structured SVM 一、上篇博文复习 图中x表示输入的…

CSS 复合选择器简单学习

目录 1. Emmet 语法 1.1 快速生成 HTML 结构语法 1.2 快速生成 CSS 样式 1.3 格式化工具 2. 调试 2.1 打开调试工具 2.2 使用调试工具 3. 复合选择器 3.1 后代选择器 3.2 子选择器 3.3 并集选择器 3.4 伪类选择器 3.3.1 链接伪类选择器 3.3.2 :focus 伪类选择器 …

C++入门 之 类和对象(下)

目录 一、初始化列表 二、隐式类型转换与explict 三、静态成员——static 四、友元 五、内部类 六、匿名对象 七.对象拷贝时的编译器优化 一、初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有一种方式&…

【重学 MySQL】三十、数值类型的函数

【重学 MySQL】三十、数值类型的函数 基本函数角度与弧度互换函数三角函数指数与对数进制间的转换示例 基本函数 MySQL提供了一系列基本的数值函数&#xff0c;用于处理数学运算和数值转换。以下是一些常用的基本函数及其用法&#xff1a; 函数用法ABS(x)返回x的绝对值。SIGN…

Java 23、JDK 23正式发布!

9月18日消息&#xff0c;Java 23目前已经正式推出&#xff0c;这是继Java 22之后的又一个非长期支持&#xff08;LTS&#xff09;版本&#xff0c;Oracle 对此版本仅提供六个月的支持。 Java 23包含12个新的JEP&#xff08;JDK增强提案&#xff09;&#xff0c;其中包括其中包…

consul服务注册发现与配置中心

目录 1 consul安装与运行 1.1 下载方式 1.2 安装 1.3 启动 1.4 访问方式 2 consul 实现服务注册与发现 2.1 引入 2.2 服务注册 2.3 服务发现 3 consul配置中心 3.1 基础配置 Eureka已经停止更新了&#xff0c;consul是独立且和微服务功能解耦的注册中心&#xff0c;…

黎巴嫩通信设备爆炸初步分析

这两天比较轰动的事&#xff0c;当属中东地区发生的一系列通信设备爆炸事件。下面分析下怎么炸的 1、为什么要用传呼机 传呼机是上世纪八九十年代流行的通信装备&#xff0c;在中国大陆已经基本绝迹&#xff0c;但在世界范围内依然广泛使用&#xff0c;因此它的产业链还活着。…

如何快速修改CSDN代码块或者主题的字体颜色

第一步登录你的CSDN账号然后点击你的头像 第二步点击下拉框中的“内容管理” 第三步&#xff0c;点击“博客设置” 第四步&#xff0c;点击“等级”选择喜欢的主题和颜色 第五步&#xff0c;选择代码块的主题和颜色 最后保存刷新就可以了。

Mybatis Plus分页查询返回total为0问题

Mybatis Plus分页查询返回total为0问题 一日&#xff0c;乌云密布&#xff0c;本人看着mybatis plus的官方文档&#xff0c;随手写了个分页查询&#xff0c;如下 Page<Question> questionPage questionService.page(new Page<>(current, size),questionService.g…

一体化平台数据中心安全建设方案(Word完整原件)

第 一 章 信息安全保障系统 1.1 系统概述 1.2 安全标准 1.3 系统架构 1.4 系统详细设计 1.4.1 计算环境安全 1.4.2 区域边界安全 1.4.3 通信网络安全 1.4.4 管理中心安全 1.5 安全设备及系统 1.5.1 VPN加密系统 1.5.2 入侵防御系统 1.5.3 防火墙系统 1.5.4 安全审计系统 1.5.5 …

基于 ROS 的Terraform托管服务轻松部署ChatGLM2-6B

介绍 ChatGLM2-6B是开源中英双语对话模型ChatGLM-6B的第二代版本&#xff0c;在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础上&#xff0c;ChatGLM2-6B具有更强大的性能、更长的上下文、更高效的推理等特性。 资源编排服务&#xff08;Resource Orchestration…

谈对象第二弹: C++类和对象(中)

文章目录 一、类的默认成员函数二、构造函数三、析构函数四、拷贝构造函数五、运算符重载5.1运算符重载5.2赋值运算符重载5.3实现日期类<<、>>重载检查、获取天数关系运算符重载算数、赋值运算符重载Date.hDate.cpp 六、取地址运算符重载6.1const成员函数6.2取地址…

PyTorch使用------自动微分模块

目录 &#x1f354; 梯度基本计算 1.1 单标量梯度的计算 1.2 单向量梯度的计算 1.3 多标量梯度计算 1.4 多向量梯度计算 1.5 运行结果&#x1f4af; &#x1f354; 控制梯度计算 2.1 控制不计算梯度 2.2 注意: 累计梯度 2.3 梯度下降优化最优解 2.4 运行结果&#x1…

在grafana上配置显示全部node资源信息概览

在grafana上配置显示全部node资源信息概览&#xff0c;便于巡检 1&#xff0c;注册grafana官网账号&#xff1a;Grafana dashboards | Grafana Labs&#xfeff; 2、寻找可以展示所有node资源概览信息的dashboard&#xff0c;并下载支持prometheus数据源的dashboard&#xff…

论文开题不用愁,5步带你轻松搞定研究计划!

开题报告是每位研究生在论文写作初期必须完成的一项重要任务。它不仅是对自己研究方向的初步规划&#xff0c;也是导师和评审专家衡量课题可行性的重要依据。一份优秀的开题报告不仅能够清晰阐述研究的背景、目的和意义&#xff0c;还能展示研究的创新性和可行性&#xff0c;从…

与谷歌旗下自动驾驶公司扩大合作后,Uber股票值得买入吗?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;与Waymo扩大在无人驾驶出租车方面的合作后&#xff0c;Uber的股价上涨了5%。 &#xff08;2&#xff09;Uber的第二季度的财务业绩非常强劲&#xff0c;收入增长了…

【Python】练习:控制语句(二)第4关

第4关&#xff1a;控制结构综合实训 第一题第二题&#xff08;※&#xff09;第三题&#xff08;※&#xff09;第四题&#xff08;※&#xff09;第五题&#xff08;※&#xff09;第六题&#xff08;※&#xff09; 第一题 #第一题def rankHurricane(velocity):#请在下面编写…

[Simpfun游戏云1]搭建MC Java+基岩互通生存游戏服务器

众所周知&#xff0c;MC有多个客户端&#xff0c;像常见的比如Java Edition和基岩等&#xff0c;这就导致&#xff0c;比如我知道一个超级好玩的JE服务器&#xff0c;但我又想使用基岩版来玩&#xff0c;肯定是不行的&#xff0c;因为通讯协议不一样。 这就有一些人才发明了多…

浅谈死锁以及判断死锁的方法

引言 我们在并发情况下见过很多种锁&#xff0c;synchronized&#xff0c;ReentrantLock 等等&#xff0c;这些锁是为了保证线程安全&#xff0c;使线程同步的锁&#xff0c;与今天所要学习的死锁并不相同&#xff0c;死锁并不是一种锁&#xff0c;而是一种现象。 官方定义&a…