uniapp微信小程序解决绘制polygon结束时的问题

news/2024/7/20 1:33:06 标签: uni-app, 微信小程序, 小程序

目录

一、前言

二、实现思路

三、结束标绘具体代码

1、在地图展示工具栏处判断工具按钮是否展示v-if="item.isshow"

2、data声明的工具按钮中新增结束标绘按钮

3、在按钮的点击事件中新增结束标绘的判断

4、判断绘制的线段个数是否大于等于三条,当满足条件后展示结束标绘按钮

5、结束标绘的事件


一、前言

继上一篇uniapp小程序>微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)在微信开发者工具上操作是没有问题,但是我发现在用手机进行预览的时候,双击事件并没有生效,或者严格意义上来说我点击地图的两次单击事件的时间差并不满足判断要求的500ms。

结合实际情况考虑了下用户在手机端操作地图时,根据两次单击事件的间隔时间来判断是否结束绘制有点强人所难,所以我在这里更改了结束绘制的形式。

先给大家看下最终的效果:

二、实现思路

在这里我判断了下polyline的长度,因为一个面至少是由三个线段组成的,判断polyline的长度大于等于3,将结束标绘的按钮展示在地图左侧工具栏上,然后点击结束标绘,将之前结束绘制的代码移入到这个方法里边,具体方法可以参见:uniapp小程序>微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

三、结束标绘具体代码

1、在地图展示工具栏处判断工具按钮是否展示v-if="item.isshow"

<!-- 展示地图信息  标绘位置情况 -->
<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" :polyline="mapData.polyline">
        <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" v-if="item.isshow">
        			<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>

2、data声明的工具按钮中新增结束标绘按钮

//地图控件
mapControls:[
	// 标绘位置
	{
		id:'drawPolygon',
		check:false,
		isshow:true,
		icon:'/static/mapview/drawIcon.png',
		method:'drawPolygons',
		label:'标绘位置'
	},
        // 结束标绘
	{
		id:'endDraw',
		check:false,
		isshow:false,
		icon:'/static/mapview/endDraw.png',
		method:'endDraws',
		label:'结束标绘'
	},
	// 清除
	{
		id:'cleanPolygon',
		check:false,
		isshow:true,
		icon:'/static/mapview/cleanPolygon.png',
		method:'cleanPolygons',
		label:'清除'
	}
],

3、在按钮的点击事件中新增结束标绘的判断

mapEdit(item){
    switch(item.id){
    	// 绘制面
    	case 'drawPolygon':
    		item.check = !item.check;
    		this.drawPolygons();
    		break;
    	//结束绘制
    	case 'endDraw':
    		item.check = !item.check;
    		this.endDraws();
    		break;
    	//清除
    	case 'cleanPolygon':
    		this.cleanPolygons();
    		break;
    	default:
    		break;
    }
},

4、判断绘制的线段个数是否大于等于三条,当满足条件后展示结束标绘按钮

//点击地图事件
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:1,
    		})
    		
    		if(this.mapData.polyline.length >=3){
    			//当线段的数量为三个的时候,可以点击结束标绘 将结束标绘展示出来 
    			this.mapControls[1].isshow = true;
    		}
    	}
    }
}

5、结束标绘的事件

//结束标绘
endDraws(){
    this.pointsData = [];
    //在双击事件中 生成polygon
    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.polygons.push({
    	points:this.pointsData,
    	strokeWidth:1,
    	strokeColor:'#00AF99',
    	fillColor:'#00AF9930'
    })
    
    //最后将点、线段的数据清空
    this.mapData.markers = [];
    this.mapData.polyline = [];
    this.mapControls[0].check = false;
    //隐藏结束标绘按钮
    this.mapControls[1].isshow = false;
    this.mapControls[1].check = false;
},

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


http://www.niftyadmin.cn/n/5238488.html

相关文章

如何使用Cloudreve搭建本地云盘系统并实现随时远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

UE5 树叶飘落 学习笔记

一个Plane是由两个三角形构成的&#xff0c;所以World Position Offset&#xff0c;只会从中间这条线折叠 所有材质 这里前几篇博客有说这种逻辑&#xff0c;就是做一个对称的渐变数值 这里用粒子的A值来做树叶折叠的程度&#xff0c;当然你也可以用Dynamic Param 这样就可以让…

virtualbox上win7企业微信CPU高问题

问题 linux Opensuse上的Virtualbox安装有win7, win7中跑企业微信CPU占用很高。一杀掉它&#xff0c;CPU占用就立马降下来了。 定位 当cpu占用高时&#xff0c;打开任务管理器&#xff0c;可以定位到svhost.exe占用很高&#xff0c; 优化 右键点击计算机–管理–服务和应用…

数据管理系统-week11-数据完整性

文章目录 前言一、数据完整性?它是什么?二、一致性约束三、一致性约束的验证第一,在数据库应用程序中实现一致性约束的验证第二,可以通过SQL脚本验证一致性约束第三,通过存储的程序来验证一致性约束第四,通过数据库触发器验证一致性约束。四、ROLLBACK和COMMIT语句五、备…

代理IP、Socks5代理与爬虫在跨界电商与游戏领域的网络安全应用

的数据挖掘&#xff0c;企业可以及时调整战略&#xff0c;把握市场机会&#xff0c;实现更好的出海业务。 2. 游戏领域的爬虫应用 在游戏领域&#xff0c;爬虫技术可以用于收集游戏数据、用户行为等信息&#xff0c;为游戏运营提供有力支持。同时&#xff0c;通过分析玩家反馈…

【Wireshark工具使用】Wireshark无法抓取TwinCAT的EtherCAT包(已解决)

写在前面 因项目需要&#xff0c;近期在在深入研究EtherCAT协议&#xff0c;之后会将协议做一个系统的总结&#xff0c;分享在这个分栏。在研究EtherCAT协议帧时&#xff0c;使用了一个网络数据分析工具Wireshark&#xff0c;本文是关于EtherCAT数据帧分析工具使用中遇到的一个…

解密Prompt系列20. LLM Agent之再谈RAG的召回多样性优化

几个月前我们就聊过RAG的经典方案解密Prompt系列14. LLM Agent之搜索应用设计。前几天刚看完openAI在DevDay闭门会议上介绍的RAG相关的经验&#xff0c;有些新的感悟&#xff0c;借此机会再梳理下RAG相关的优化方案。推荐直接看原视频&#xff08;外网&#xff09;A Survey of …

云原生之深入解析如何限制Kubernetes集群中文件描述符与线程数量

一、背景 linux 中为了防止进程恶意使用资源&#xff0c;系统使用 ulimit 来限制进程的资源使用情况&#xff08;包括文件描述符&#xff0c;线程数&#xff0c;内存大小等&#xff09;。同样地在容器化场景中&#xff0c;需要限制其系统资源的使用量。ulimit: docker 默认支持…