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

这篇具有很好参考价值的文章主要介绍了uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

实现最终界面:

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

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

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

目录

一、创建context 对象

二、开始绘制面图层

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

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

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


一、创建context 对象

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

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

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

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

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

<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纬度x
	longitude:'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纬度x
        	longitude:'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
    	})
    }
},

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

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

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

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)
    }
},

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

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

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

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

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('这是个双击事件')
    			}
    			
    		}
    	}
    }
},

目前实现效果:

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

最后,在双击事件中,新增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 = [];
    				//在双击事件中 生成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:2,
    					strokeColor:'#00AF99',
    					fillColor:'#00AF9930'
    				})
    				
    				//最后将点、线段的数据清空
    				this.mapData.markers = [];
    				this.mapData.polyline = [];
    				this.mapControls[0].check = false;
    			}
    			
    		}
    	}
    }
},

最终实现效果:

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!),微信小程序,uniapp,uni-app,微信小程序,前端

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

写到最后,如果大家觉得写的不错,一键三连白,点赞、收藏加关注。大家的点赞就是我不断分享的动力!!!文章来源地址https://www.toymoban.com/news/detail-759579.html

到了这里,关于uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp微信小程序获取当前位置信息、经纬度转换、导航地图实现

    1、调用接口,官网文档是这样写的 2、将经纬度转化为位置信息 需要开通腾讯位置服务,开发者每天有一万次的免费转化次数。开通地址  记住当前申请的key值,然后下载微信小程序JavaScriptSDK 然后安全域名设置,在小程序管理后台 - 开发 - 开发管理 - 开发设置 - “服务器域

    2024年02月11日
    浏览(42)
  • 【微信小程序】微信小程序集成高德卫星地图完成多边形绘制与截图保存

    目录 功能需求 使用的技术点 注意点 实现步骤 代码 微信小程序-地图所在的wxml 微信小程序-地图所在的js 微信小程序-展示截图结果的wxml 微信小程序-展示截图结果的js H5-地图所在的html 完成效果  参考文档 感谢阅读,欢迎讨论 打开页面展示卫星地图,用户自行在地图上绘制

    2024年02月06日
    浏览(70)
  • 微信小程序之绘制多个marker以及调用手机地图软件导航

    此文章是为了说明使用微信小程序在腾讯地图上绘制多个marker地图点;然后点击某一个marker进行导航的信息;具体的功能演示如下: 一、功能演示 二、前端布局代码 view style=\\\"display: flex;flex-direction: column;\\\" //地图的布局文件信息   map class=\\\"mapUI\\\" id=\\\"myMap\\\" scale=\\\"13\\\" bindmarke

    2024年02月06日
    浏览(39)
  • UniApp微信小程序地图使用指南

    在UniApp中集成微信小程序的地图功能,可以为用户提供位置展示、导航、路线规划等丰富的交互体验。本技术文档将指导你如何在UniApp微信小程序中集成和使用地图功能。 确保你已经完成了以下环境准备: 安装Node.js:确保你的开发环境中安装了Node.js。 安装HBuilderX:下载并

    2024年04月28日
    浏览(24)
  • uniapp微信小程序使用地图选点插件

    效果图 1. 在公众平台申请插件 “微信小程序官方后台- 设置 -第三方服务-插件管理” 里点击 添加插件 ,搜索 腾讯位置服务地图选点 申请,审核通过后,小程序开发者可在小程序内使用该插件。 2. 引入插件 在 pages.json 中引入插件,根据个人需求,这里是在分包中引入插件

    2024年02月16日
    浏览(45)
  • uniapp - 微信小程序利用腾讯地图插件实现搜索地点/位置功能,uniapp小程序平台端使用腾讯地图做搜索城市位置+底部自动根据关键字联想其他相关位置(详细示例源码,一键复制开箱即用!)

    在uniapp微信小程序开发中,安装使用腾讯地图插件,并利用腾讯地图功能完成目的地、城市位置、名称等搜索功能,并且在下拉框中自动 “联想” 相关的地点位置。 最终效果图有点模糊,你可以按照教程一路复制就可以搞定了。

    2024年02月03日
    浏览(61)
  • 在uniapp微信小程序中使用百度地图

    **第一步:**申请秘钥AK,这个自行百度申请。 **第二步:**引入百度地图js模块 微信小程序JSAPI下载 下载js文件后,解压,并放到项目中。 **第三步:**在项目中导入js API , html代码:复制百度地图官网的。最主要是js代码。 js首先需要导入js api 请求定位,当不传参数的时候,会

    2024年04月11日
    浏览(29)
  • uniapp微信小程序使用腾讯地图选点插件

    在A页面获取当前经纬度之后跳转至B页面打开腾讯地图选点插件 注意需要把微信开发者工具中的本地设置中的版本改为2.17.0,不然会报错 2.1使用腾讯地图 lbs.qq.com,控制台-应用管理-我的应用中,创建应用,并在相应的应用中创建Key。 注意勾选WebServiceAPI和微信小程序 web配置

    2024年02月09日
    浏览(35)
  • Uniapp,vue拉起地图导航(微信小程序)

    wx.getLocation()方法 这个方法需要在首页调用一下 还需要再 app.json 里面加入 不然上线的时候审核不过 然后在你点击拉起按钮方法里面写入这个wx.openLocation()方法 切记里面的经纬度需要转成数字( Number 类型)例如: 按钮 方法 Markdown 图标 快捷键 撤销 Ctrl /⌘+Z 重做 Ctrl /⌘+Y 加

    2024年02月10日
    浏览(38)
  • uniapp 配置chooseLocation微信小程序腾讯地图选点

    在uniapp中使用地图选点 搜索功能,回显功能,移动选点功能 使用到的API是 uni.chooseLocation 详细看一下都有哪些属性 latitude :目标地纬度 Number longitude :目标地经度Number keyword:搜索,仅App平台支持 String success:接口调用成功的回调函数 Function success 返回参数说明 name

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包