uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

用户需求:需要在填写表单信息时,在地图上标绘自己房屋的位置信息。

这个问题处理了很久,在网上也没有找到全面的相关案例,所以我将我的思路分享给大家,希望可以解决大家遇到的问题。如果大家有更好的思路,欢迎评论区留言,大家一起学习,共同进步!

实现最终界面:

由于我上一次写过一篇关于在uniapp微信小程序上如何加载控件的文章,在这里我不在赘述,大家可以先看这一篇:uniapp微信小程序实现地图展示控件

关于绘制面的知识点,我将分为以下几点为大家讲解:

目录

一、创建context 对象

二、开始绘制面图层

1.使用地图的tap点击事件,获取当前点击位置的坐标点

2.使用polyline将两个点连接成线

3.获取点击地图的双击事件,双击后结束标绘


一、创建context 对象

在页面加载的时候,创建map对象

onLoad(data) {this.initMap();
},
methods:{initMap(){this.mapCtx = wx.createMapContext('mymap');},
}

设置加载地图的中心点和缩放等级

<map id="mymap" class="myMap_map" @tap="mapAction" :longitude="mapData.longitude" :latitude="mapData.latitude" :scale="mapData.scale"><cover-view class="myMap_map__cover-view"><cover-view class="myMap_map__cover-view_mapControls"><!-- 显示绘制的控件--><cover-view class="myMap_map__cover-view_mapControls_drawControl" @click="drawPolygon"><cover-image class="myMap_map__cover-view_mapControls_drawControl_drawicon" :src="mapData.drawIconPath"></cover-image><cover-view class="myMap_map__cover-view_mapControls_drawControl_drawText">标绘位置</cover-view></cover-view></cover-view></cover-view>
</map>

在data中声明变量

// 地图的相关操作
mapData:{//设置地图中心点 lon经度y、lat纬度xlongitude:'119.965238',latitude:'35.916325',scale:18,polygon:[],marker:[],},

二、开始绘制面图层

绘制面数据需要先明白,polygon是由多个点绘制而成的。也就是说我们需要先获取在地图上点击的point,将这个数据存储起来。

我的实现思路是点击标绘位置之后开始在地图上绘制,点击地图获取在地图上的定位点,存储这些定位点,最后结束的时候,需要双击地图。然后将point数据组赋值给polygon,生成一个polygon数据。在这里需要注意:用户点击两个点的时候,需要将这两个点进行连接,成poline,所以地图上需要加载point、poline和polygon。

1.使用地图的tap点击事件,获取当前点击位置的坐标点

这里我用了一个变量做判断,点击标绘位置的时候,说明开始标绘,这个时候我再点击地图,获取定位点的坐标,然后push到markers数组中。

HTML部分:

<!-- 展示地图信息  标绘位置情况 -->
<view class="myMap"><u-divider text="地图展示"></u-divider><map id="mymap" class="myMap_map" @tap="mapAction" :longitude="mapData.longitude" :latitude="mapData.latitude" :scale="mapData.scale" :polygons="mapData.polygons":markers="mapData.markers"><cover-view class="myMap_map__cover-view"><cover-view class="myMap_map__cover-view_mapControls"><!-- 显示绘制的控件--><cover-view class="myMap_map__cover-view_mapControls_drawControl" :class="item.check ? 'myMap_map__cover-view_mapControls_checkdrawControl' : '' " @click="mapEdit(item)" v-for="(item,index) in mapControls" :key="index"><cover-image class="myMap_map__cover-view_mapControls_drawControl_drawicon" :src="item.icon"></cover-image><cover-view class="myMap_map__cover-view_mapControls_drawControl_drawText">{{ item.label }}</cover-view></cover-view></cover-view></cover-view></map>
</view>

data变量:

data(){return{// 地图的相关操作mapData:{//设置地图中心点 lon经度y、lat纬度xlongitude:'119.965238',latitude:'35.916325',infowidth:6,infoheight:6,scale:18,markers:[],polyline:[],polygons:[],},//地图控件mapControls:[// 标绘位置{id:'drawPolygon',check:false,icon:'/static/mapview/drawIcon.png',method:'drawPolygons',label:'标绘位置'},//清除{id:'cleanPolygon',check:false,icon:'/static/mapview/cleanPolygon.png',method:'cleanPolygons',label:'清除'}],}
}

methods方法

mapEdit(item){item.check = !item.check;switch(item.id){// 绘制面case 'drawPolygon':this.drawPolygons();break;//清除case 'cleanPolygon':this.cleanPolygons();break;default:break;}
},
//绘制面
drawPolygons(){uni.$u.toast('点击地图开始绘制!');
},
cleanPolygons(){uni.$u.toast('清除')
},
//点击地图事件
mapAction(e){//判断是否已经点击标绘位置,如果点击标绘位置后开始定位if(this.mapControls[0].check){this.mapData.markers.push({id:this.mapData.markers.length+1,longitude:e.detail.longitude,latitude:e.detail.latitude,iconPath:'/static/mapview/square.png',height:this.mapData.infoheight,width:this.mapData.infowidth})}
},

写到此处,地图上已经实现可以标记点位信息

下边我们需要实现当用户点击两个点的时候,让这两个点连成线。

2.使用polyline将两个点连接成线

需要判断当marker数组中的长度大于等于2的时候,才开始生成线段

//点击地图事件
mapAction(e){//判断是否已经点击标绘位置,如果点击标绘位置后开始定位if(this.mapControls[0].check){this.mapData.markers.push({id:this.mapData.markers.length+1,longitude:e.detail.longitude,latitude:e.detail.latitude,iconPath:'/static/mapview/square.png',height:this.mapData.infoheight,width:this.mapData.infowidth})if(this.mapData.markers.length >=2){this.pointsData = [];for(let i=0;i<this.mapData.markers.length;i++){this.pointsData.push({latitude:this.mapData.markers[i].latitude,longitude:this.mapData.markers[i].longitude})}this.mapData.polyline.push({points:this.pointsData,color:'#00AF99',width:3,})}console.log(this.mapData.polyline)}
},

此时,polyline数组中的存储结构是这样的

每两个点组成一条线段,界面中一共是三条线段。

3.获取点击地图的双击事件,双击后结束标绘

在这里我们需要注意,两个点形成一条线,而三条线段才能形成一个polygon,所以我们需要先判断polyline的长度必须要大于等于3,才能结束标绘。

由于我并没有再官网上找到地图的双击事件,所以在这里我模拟了地图的双击事件。通过两次单击事件的时间差来判断。

首先,需要在data中定义两个变量存储点击的时间

//单击事件时间差
taptimestame:{firsttime:null,lasttime:null
},

然后在单击地图的方法中进行时间的存储与判断

//点击地图事件
mapAction(e){if(this.taptimestame.firsttime == null){//第一次定位,给firsttime赋值this.taptimestame.firsttime = e.timeStamp;}else if(this.taptimestame.lasttime == null){//第二次定位,给lasttime赋值this.taptimestame.lasttime = e.timeStamp;}else{this.taptimestame.firsttime = this.taptimestame.lasttime;this.taptimestame.lasttime = e.timeStamp;}//判断是否已经点击标绘位置,如果点击标绘位置后开始定位if(this.mapControls[0].check){this.mapData.markers.push({id:this.mapData.markers.length+1,longitude:e.detail.longitude,latitude:e.detail.latitude,iconPath:'/static/mapview/square.png',height:this.mapData.infoheight,width:this.mapData.infowidth})if(this.mapData.markers.length >=2){this.pointsData = [];for(let i=0;i<this.mapData.markers.length;i++){this.pointsData.push({latitude:this.mapData.markers[i].latitude,longitude:this.mapData.markers[i].longitude})}this.mapData.polyline.push({points:this.pointsData,color:'#00AF99',width:3,})if(this.mapData.polyline.length >=3){//判断两次单击事件的时间差if(this.taptimestame.lasttime - this.taptimestame.firsttime < 500){uni.$u.toast('这是个双击事件')}}}}
},

目前实现效果:

最后,在双击事件中,新增polygon面图层,如果不需要的话可以将点和线的数据进行清空操作

//点击地图事件
mapAction(e){if(this.taptimestame.firsttime == null){//第一次定位,给firsttime赋值this.taptimestame.firsttime = e.timeStamp;}else if(this.taptimestame.lasttime == null){//第二次定位,给lasttime赋值this.taptimestame.lasttime = e.timeStamp;}else{this.taptimestame.firsttime = this.taptimestame.lasttime;this.taptimestame.lasttime = e.timeStamp;}//判断是否已经点击标绘位置,如果点击标绘位置后开始定位if(this.mapControls[0].check){this.mapData.markers.push({id:this.mapData.markers.length+1,longitude:e.detail.longitude,latitude:e.detail.latitude,iconPath:'/static/mapview/square.png',height:this.mapData.infoheight,width:this.mapData.infowidth})if(this.mapData.markers.length >=2){this.pointsData = [];for(let i=0;i<this.mapData.markers.length;i++){this.pointsData.push({latitude:this.mapData.markers[i].latitude,longitude:this.mapData.markers[i].longitude})}this.mapData.polyline.push({points:this.pointsData,color:'#00AF99',width:2,})if(this.mapData.polyline.length >=3){//判断两次单击事件的时间差if(this.taptimestame.lasttime - this.taptimestame.firsttime < 500){this.pointsData = [];//在双击事件中 生成polygonfor(let i=0;i<this.mapData.markers.length;i++){this.pointsData.push({latitude:this.mapData.markers[i].latitude,longitude:this.mapData.markers[i].longitude})}this.mapData.polygons.push({points:this.pointsData,strokeWidth:2,strokeColor:'#00AF99',fillColor:'#00AF9930'})//最后将点、线段的数据清空this.mapData.markers = [];this.mapData.polyline = [];this.mapControls[0].check = false;}}}}
},

最终实现效果:

最后:这里有个bug哦,最后双击的时候会触发地图等级别缩放。这个地方需要判断以下,如果用户正在标绘位置,可以把这个事件禁用掉。

写到最后,如果大家觉得写的不错,一键三连白,点赞、收藏加关注。大家的点赞就是我不断分享的动力!!!

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

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

相关文章

中职组网络安全-PYsystem003.img(环境+解析)

​ web安全渗透 1.通过URL访问http://靶机IP/1&#xff0c;对该页面进行渗透测试&#xff0c;将完成后返回的结果内容作为flag值提交&#xff1b; 访问该网页后发现F12被禁用&#xff0c;使用ctrlshifti查看 ctrlshifti 等效于 F12 flag{fc35fdc70d5fc69d269883a822c7a53e} …

⭐ Unity + ARKIT ARFace脸部追踪

相比之前的图像物体检测&#xff0c;这脸部检测实现起来会更加的简单。 &#xff08;1&#xff09;首先我们先在场景中的物体上添加一个AR Face Mananger组件&#xff1a; &#xff08;2&#xff09;以上組件的 Face Prefab所代表的就是脸部的模型也就是覆盖在脸部上面的投影模…

通过PS导出样条线到3DMax挤出模型

1、PS制作样条线 PS用钢笔做出路径&#xff0c;导出 把.ai文件拖入3dmax中 2、挤出模型 调整模型在中心点位置&#xff0c;导出

SCT2432QSTER,可替代LMR14030-Q1;3.8V-40V输入、3.5A、高效率同步降压型DCDC转换器、具有内部补偿功能

描述&#xff1a; SCT2432Q是3.5A的同步降压转换器&#xff0c;具有宽输入电压&#xff0c;范围从3.8V到40V&#xff0c;它集成了一个80mΩ的高压侧MOSFET和一个50mQ的低压侧MOSFET&#xff0c;SCT2432Q采用峰值电流模式控制&#xff0c;支持脉冲跳过调制(PSM)&#xff0c;具有…

0基础学习VR全景平台篇第123篇:VR视频航拍补天 - PR软件教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 嗨&#xff0c;大家好&#xff0c;今天我们来介绍【航拍VR视频补天】。之前已经教给了大家如何处理航拍图片的补天&#xff0c;肯定有很多小伙伴也在好奇&#xff0c;航拍的VR视频…

深度学习(一):Pytorch之YOLOv8目标检测

1.YOLOv8 2.模型详解 2.1模型结构设计 和YOLOv5对比&#xff1a; 主要的模块&#xff1a; ConvSPPFBottleneckConcatUpsampleC2f Backbone ----->Neck------>head Backdone 1.第一个卷积层的 kernel 从 6x6 变成了 3x3 2. 所有的 C3 模块换成 C2f&#xff0c;可以发现…

UniPro集成华为云WeLink 为企业客户构建互为联接的协作平台

华为云WeLink是华为开启数字化办公体验、帮助企业实现数字化转型的实践&#xff0c;类似钉钉。UniPro的客户企业中&#xff0c;有使用WeLink作为协作工具的&#xff0c;基于客户的实际业务需求&#xff0c;UniPro实现了与WeLink集成的能力&#xff0c;以帮助客户企业丰富和扩展…

软文营销助力品牌打开市场,提升内在竞争力

当今环境下&#xff0c;企业想要通过传统营销方式打开市场可以说是难度较大&#xff0c;用户如今更偏向于好的内容&#xff0c;而软文营销正是通过好内容吸引用户&#xff0c;助力品牌打开市场&#xff0c;提升内在竞争力&#xff0c;接下来媒介盒子就从以下几个方面和大家聊聊…

库位角点检测之Centernet/CornerNet算法

1.CornerNet CornerNet 那么我们从bounding box左上角(top-left corner)看物体。视线横着的话&#xff0c;物体就在视线的下面&#xff08;那么视线所在位置为the topmost boundary of an object&#xff09;。视线竖着的话&#xff0c;物体就在视线的右边&#xff0c;那么视线…

美团20k软件测试工程师的经验分享

前言 时间真是快&#xff0c;转眼间变成打工人也有三年的时间了&#xff0c;最近几天朋友圈被各个同学的答辩刷屏了。去年自己过年回到家里&#xff0c;再回母学校就是走走瞧瞧&#xff0c;经历了可能是唯一一年的云答辩。学生时代对未来的工作充满了想象&#xff0c;一直想知…

SQL面试题,判断if的实战应用

有如下表&#xff0c;请对这张表显示那些学生的成绩为及格&#xff0c;那些为不及格 1、创建表&#xff0c;插入数据 CREATE TABLE chapter8 (id VARCHAR(255) NULL,name VARCHAR(255) NULL,class VARCHAR(255) NULL,score VARCHAR(255) NULL );INSERT INTO chapter8 (id, n…

测试面试:不明白什么是质量保障

这是我面试经常问的一个问题&#xff0c;很多人并不明白其中的区别。 如上图&#xff0c;整体的质量体系架构图相对简单&#xff0c;主要包含三个部分&#xff1a;愿景&#xff08;高质量交付&#xff0d;快、好&#xff09;、能力&#xff08;中间三层不同的能力&#xff09;和…

如何管理施工现场?一招轻松搞定

随着科技的快速发展&#xff0c;建筑行业正迎来一场革命性的变革&#xff0c;智慧工地成为引领这一变革的关键力量。传统的建筑方式正在被智能化、数字化的解决方案所取代&#xff0c;为项目管理、安全性和效率带来了全新的可能性。 客户案例 建筑公司 山东某建筑公司通过引入…

数据结构算法-选择排序算法

引言 说起排序算法&#xff0c;那可就多了去&#xff0c;首先了解什么叫排序 以B站为例&#xff1a; 蔡徐坤在B站很受欢迎呀&#xff0c;先来看一下综合排序 就是播放量和弹幕量&#xff0c;收藏量 一键三连 都很高这是通过一些排序算法 才能体现出综合排序 蔡徐坤鬼畜 按照播…

map()的用法

JavaScript Array map() 方法 先说说这个方法浏览器的支持&#xff1a; 支持五大主流的浏览器&#xff0c; 特别注意&#xff1a;IE 9 以下的浏览器不支持&#xff0c;只支持IE 9以上的版本的浏览器 特别注意&#xff1a;IE 9 以下的浏览器不支持&#xff0c;只支持IE 9以上的…

Android超简单实现-即时更新Toast(可直接复制)

效果 实现 第一步、封装个工具类ToastUtil.class&#xff08;可直接复制拿走&#xff09; public class ToastUtil {private static Toast mToast null; // toast对象&#xff0c;用于判断是否第一次使用/*** 即时更新Toast* param content content* param message 消息内容…

Nacos作为配置中心的一些知识二

11292327 问&#xff1a;客户端发请求给Nacos服务端&#xff0c;服务端这边会进行哪些处理&#xff1f; 答&#xff1a;客户端发请求给Nacos 服务端 &#xff0c;服务端这边通过ConfigController类的309行的listener方法&#xff0c;进行处理 第一步 获取客户端请求的文件的…

39.从0到上线三天搭建个人网站(第三天)

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 一、第三天主要工作 1.完成detail页面的开发 2.将所有数据以及部分静态资源存在uniCloud&#xff0c;为以后做管理后台做准备 3.创建云对象getData&#xff0c;在beforecreate&#xff08;&#xff09;中获取数据 4.…

SQL server 基线安全加固操作

目录 账号管理、认证授权 ELK-Mssql-01-01-01 ELK-Mssql-01-01-02 ELK-Mssql-01-01-03 ​​​​​​​ ELK-Mssql-01-01-04 ​​​​​​​ ELK-Mssql-01-01-05 ​​​​​​​ELK-Mssql-01-01-06 日志配置 ELK-Mssql-02-01-01 通信协议 ELK-Mssql-03-01-01 ​​​​​…

【MySQL】视图:简化查询

文章目录 create view … as创建视图更改或删除视图drop view 删除视图replace关键字&#xff1a;更改视图 可更新视图with check option子句&#xff1a;防止行被删除视图的其他优点简化查询减小数据库设计改动的影响使用视图限制基础表访问 create view … as创建视图 把常用…