草庐IT

基于微信小程序Map标签及高德地图开源方法实现路径导航

鸢_ 2023-04-05 原文

        微信小程序自带地图map标签,他是基于canvas画图功能进行的地图渲染,同时依赖微信的getlocation获取经纬度,绘制周边地图。地图上可以标点,画线,查看当地地理信息。但是自带的导航功能模块不能对个人开发者公开。

        高德地图提供了基于微信小程序map标签的导航功能,只需要将高德文件导入项目,即可获取周边地理信息及导航、天气等信息。返回数据为微信小程序map标签的markers和linear对象形式,只需要稍加修饰,便可实现类似于官方导航的功能。

主要过程为

本次使用的是uniapp  使用vue+默认小程序模板创建项目,

在manifest.json中开启位置授权

1.获取高德支持文件

在高德开放平台下载libs文件 并存放在项目文件夹内

 微信原生开发直接按上文配置即可,uniapp的话有可能打包不过去,可以放在这里(一般不用),

 然后vue3框架需要修改输出方式

 这样import就可以正常引用

	import  amap from '../../libs/amap-wx.130.js'

2.绘制腾讯地图

在这里我们需要用原生的map先搞一个地图出来,同时wx.getlocation获取用户位置

这里的markers和polyline后面要用,先做个空的容器,其中markers可以先把当前位置标出来

<template>
	<view class="map_container">
	  <map class="map" id="map" 
	  :longitude="longitude" :latitude="latitude" 
	  scale="14" show-location="true" 
	  :markers="markers" bindmarkertap="makertap"
	  :polyline="polyline"
	  v-if="latitude"
	  ></map>
	</view>
	<input type="text" placeholder="起点"  v-model="start">
	<input type="text" placeholder="终点" @input="bindinput" v-model="target">
	<view class="tips" v-for="item in tips" :key="item.id" @click="selectThis(item)" >
		{{item.name}}
	</view>
	<button @click="bindWalk">步行</button>
	<button>驾车</button>
	<button>公交</button>
	
</template>

在onload中初始化地图,并加载高德地图实例

onLoad() {
			// 初始化高德地图对象
			console.log(amap)
			this.amap = new amap.AMapWX({key:'35e208c3050694260e292c0bb9eed6f1'})
			
		
			
			// 初始化地图
			let _this = this
			
			uni.getLocation({
				type: 'wgs84',//北斗
				success: function (res) {
					// _this.setData({
					// 	longitude : res.longitude,
					// 	latitude : res.latitude
					// })
				
					_this.markers =[..._this.markers,{
						id:0,
						longitude: res.longitude,
						latitude:res.latitude,
						height:30,
						width:30,
						iconPath:'../../static/logo.png'
					}]
					
					_this.longitude = res.longitude
					_this.latitude = res.latitude
					
					_this.points = [..._this.points,{
						longitude: res.longitude,
						latitude:res.latitude,
					}]
					console.log('当前位置的经度:' + res.longitude);
					console.log('当前位置的纬度:' + res.latitude);
				}  
			});

3.获取导航信息并渲染

可以注意到我上方的结构是有input框的 ,他用于输入目的地

他的回调可以从高德处获取模糊查询结果,我门将其渲染到input框底部,当点击后选定,并执行后续搜索,点击选定与模糊搜素如下

	bindinput(e){
				console.log(e.target.value)
				let keywords = e.target.value
				// console.log(this.amap)
				this.amap.getInputtips({
					keywords:keywords,
					location :'',
					success:(res)=>{
						if(res.tips[0]){
							this.tips = res.tips
							console.log(this.tips)
						}
					}
				})
			},
			selectThis(item){
				console.log(item)
				// 记录location
				let targetTemp = item.location.split(',')
				this.target = item.name
				this.tips=[]
				// this.points = [...this.points,{
				// 	longitude: targetTemp[0],
				// 	latitude: targetTemp[1],
				// }]
				this.points[1] ={
					longitude: targetTemp[0],
					latitude: targetTemp[1],
				}
				
				this.markers =[...this.markers,{
					id:2,
					longitude: targetTemp[0],
					latitude: targetTemp[1],
					height:30,
					width:30,
					iconPath:'../../static/logo.png'
				}]
			},

html结构

然后我们点击上面的寻路按钮

 他的回调是获取步行线路    this.amap.getWalkingRoute()

bindWalk(){
				// console.log(">>",this.polyline)
				this.polyline=[]
				this.amap.getWalkingRoute(this.getDataObject());
			},

而this.getDataObject()是输入目的地和目前位置的坐标(经纬度),在传入经纬度时我们可以同时传入success回调来处理getWalkingRoute的res,按照下文的方式可以分解为我们需要的画线对象,将其传入准备好的画线容器,大功告成

getDataObject(color){
				let _this = this;
				let colors = color || '#00AC62';
				// console.log("@",this.points)
				return{
					origin:_this.points[0].longitude+','+_this.points[0].latitude,
					destination:_this.points[1].longitude+','+_this.points[1].latitude,
					success:function(data){
						// console.log(">>",data)
						if(!data.paths){
							console.log('search failed')
							return;
						}
						let steps = data.paths[0].steps
						let points = []
						// console.log(">",steps)
						for(let i = 0 ; i <steps.length;i++){
							let polylines = steps[i].polyline.split(';')
							for(let j = 0 ; j <polylines.length;j++){
								let locations = polylines[j].split(',');
								points.push({
									longitude: locations[0],
									latitude: locations[1],
								})
							}
						}
						// 注意这里
						_this.polyline =[{
							points:points,
							color:colors,
							width:6
						}] 
						// _this.polyline =[..._this.polyline,{
						// 	points:points,
						// 	color:colors,
						// 	width:6
						// }] 
						// console.log("@",_this.polyline)
					}
				}
				
			}

演示

 

 再吃输入,这里有一点需要注意,再次寻路时清空线路数组,始发地目前是本地,如果用选择目的地相同的方法选择始发地,替换掉markers的第一项,并将其经纬度替换后传入getWalkingRoute可以获得两点导航,如果只是目的地导航,则要保证markers第一个点不动

还有一点markers第一个本地位置是初始化后就有的,入伙需要动态导航还需要双向绑定第一个标点与本人位置的经纬度,我的方法是当经纬度变化时重新标点,然后将位已规划好的线路按当前位置分为两段(filter),用不同颜色标识。(我正在写,所以不提供代码只提供思路)

 

原始教程出处微信小程序高德地图路线查询_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ek4y1z7hu?spm_id_from=333.337.search-card.all.click&vd_source=764374ab7bfa55ce0f00952d67efc61b

有关基于微信小程序Map标签及高德地图开源方法实现路径导航的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  10. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

随机推荐