《微信小程序实战(4) · 地图导航功能》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 海报生成
      • 需求简介
      • 地图组件介绍
      • 后台位置共享
      • 足迹绘制
      • 选点绘制
      • 其他功能
    • 总结陈词

写在前面的话

本篇文章是微信小程序系列的第四篇,本着介绍地图导航小程序的核心地图功能。

相关文章
《微信小程序实战(1)· 开篇示例 》
《微信小程序实战(2) · 组件封装》
《微信小程序实战(3) · 推广海报制作》


海报生成

需求简介

要求实现微信小程序的地图功能清单如下:
1、用户可以共享位置信息,也可以看见他人的位置信息;

2、移动过程中要可以描绘足迹,同时保存后可以查看;

3、地图支持选点画线功能,同样支持保存分享;

上述三个需求点,分别对应地图的三个功能,下面一一展开。


地图组件介绍

微信小程序的地图组件是一个非常实用的功能,允许开发者在小程序中嵌入地图,展示地理位置、标记点、路线等信息。

1、地图组件基本用法

在小程序的 WXML 文件中使用 <map> 标签来创建地图组件:

<map longitude="{{longitude}}" latitude="{{latitude}}" scale="14" markers="{{markers}}" />

2、主要属性

longitude: 地图中心的经度。

latitude: 地图中心的纬度。

scale: 地图缩放级别,范围通常是 5 到 18。

markers: 地图上的标记点,通常是一个数组,包含多个标记的经纬度和其他信息。

3、标记点(Markers)

标记点是地图上显示的位置,可以通过设置 markers 属性来添加。每个标记点是一个对象,包含以下属性:

latitude: 标记点的纬度。

longitude: 标记点的经度。

title: 标记点的标题。

iconPath: 自定义标记图标的路径。

width: 图标的宽度。

height: 图标的高度。

this.setData({markers: [{id: 1,latitude: 23.099994,longitude: 113.324520,title: '标记点1',iconPath: '/images/marker.png',width: 50,height: 50}]
});

4、事件处理

地图组件支持多种事件,例如:

regionchange: 地图区域变化时触发。

markertap: 点击标记点时触发。

maptap: 点击地图时触发。

<map bindmarkertap="onMarkerTap" bindregionchange="onRegionChange" />
onMarkerTap(e) {console.log('点击了标记点', e.markerId);
},onRegionChange(e) {console.log('地图区域变化', e.type);
}

5、获取用户位置

可以使用微信小程序的 API 获取用户的地理位置,并将其设置为地图的中心:

wx.getLocation({type: 'wgs84',success: (res) => {this.setData({latitude: res.latitude,longitude: res.longitude});}
});

后台位置共享

前面介绍的都是基础用法,比较简单,可忽略,接下来开始正篇。

这个需求要拆解为两个部分:

1、共享自己的位置(上传位置信息);

2、显示所有人的位置(定时获取);

先看第一点,要共享自己的位置,同时要支持微信小程序切换至后台,仍然可以监听到位置变化。

需要借助小程序的onLocationChange支持位置变更,先看示例代码。


openLocationHandle() {let that = thiswx.getSetting({success(res) {if (res.authSetting['scope.userLocationBackground']) {that.startLocationUpdateBackground()app.globalData.hasStart = true} else {wx.authorize({scope: 'scope.userLocationBackground', success() {that.startLocationUpdateBackground()app.globalData.hasStart = true}, fail(err) {console.log('userLocationBackground失败,错误信息:', err)that.openSetting()}})}}})
},/*** 位置处理 - 开启小程序监听动作*/
startLocationUpdateBackground: function () {let that = thiswx.setStorageSync('oldLocation', -1);wx.setStorageSync('oldTime', -1);    // 开启小程序在前后台时均可接收位置消息wx.startLocationUpdateBackground({type: 'gcj02', success: function () {            // 监听实时地理位置变化事件// 需结合 wx.startLocationUpdateBackground、wx.startLocationUpdate使用wx.onLocationChange(that.onLocationChangeHandle)}, fail: function (err) {ace.msg('startLocation失败')console.log('startLocationUpdateBackground失败,错误信息:', err)that.openSetting()},})
},

首先,先授权一下scope.userLocationBackground后台监听权限,授权成功则可以调用wx.startLocationUpdateBackground打开后台位置变化监听功能,同时使用wx.onLocationChange监听微信变化,传入的回调函数里面可以将获取到的位置信息,不断上报。

要使用后台授权功能,app.json还需要添加配置如下,按需添加需要的API即可。

"requiredPrivateInfos": ["getLocation","chooseAddress","onLocationChange","startLocationUpdate","startLocationUpdateBackground"
]

核心的onLocationChangeHandle逻辑里面,可以将回传的经纬度不断上报到后端,部分代码如下。

下方代码可以通过位置变化和坐标变化幅度判断,避免频繁处理请求(还不够的话可以添加距离变化判断)。

onLocationChangeHandle: function (res) {let {latitude, longitude} = res//省略部分逻辑。。。// 获取上次保存的位置信息let oldLocation = wx.getStorageSync('oldLocation')// 获取这次获取的位置信息let nowLocation = latitude + ',' + longitude// 位置一样则退出,坐标没变化if (nowLocation === oldLocation) {return;}// 获取上次执行的时间let oldTime = wx.getStorageSync('oldTime')// 获取当前时间let currentTime = new Date().getTime()// 间隔时间小于6S退出if (!oldTime || currentTime - oldTime < 6000) {return;}// 上传位置信息,调后端逻辑。。。// 修改缓存数据wx.setStorageSync('oldLocation', nowLocation);wx.setStorageSync('oldTime', currentTime);
}

第二个点就简单多了,就写一个定时器,然后不断获取位置,利用map组件的标记功能即可。

核心代码如下:

// 定时获取所有人的实时位置
that.timeHandleGet();
shareIntervalNum = setInterval(function () {that.timeHandleGet();
}, 2000);
timeHandleGet() {let that = thislet payNo = that.data.payNo// 获取其他在线用户的位置ace.sendGet('xjStaffDict/locationShareList', function (data) {let newArr = [] //所有人的标记信息data.forEach(function (v, i) {// 非本人则渲染共享标记信息if (v.remark && v.staffId !== payNo) {let nowPositionArr = v.remark.split(',')let tempMark = that.markHandle("位置共享", nowPositionArr[1], nowPositionArr[0], v.realyName, "", i, v.staffId, v.realyImg);tempMark.payNo = v.staffIdnewArr.push(tempMark)}})that.setData({markers: newArr})}, "no");
},

足迹绘制

足迹绘制也是基于第一个需求,自身位置不断变化的过程中,把经纬度暂存下来,然后利用map组件的polyline属性,绘制路线,部分代码如下:

// 路线信息拼接
points.push({longitude: longitude, latitude: latitude})
let polyline = [{points: points, color: "#FF0000DD", width: 2, dottedLine: false
}];//更新路线和自己的坐标
that.setData({longitude: longitude, latitude: latitude
})
if (points.length > 1) {that.setData({polyline: polyline})
}
ace.msg('逻辑成功,节点数:' + points.length);//放入缓存,后续加载
wx.setStorageSync('pointsData', JSON.stringify(points));

过程示例图如下:

足迹保存后查看效果如下:

选点绘制

这项功能就更简单了,利用map组件的地图坐标点击监听方法bindtap实现。

部分代码如下:

mapClick(e) {let that = this;let pointHandleFlag = that.data.pointHandleFlag || falseif (pointHandleFlag) {//获取当前地图选点let markers = that.data.markers;let id = ace.generateUUID();let name = `选点${markers.length + 1}`let tempMark = that.markHandle('选点', e.detail.longitude, e.detail.latitude, '', name, markers.length, id);points.push(e.detail)markers.push(tempMark)if (points.length > 1) {let polyline = [{points: points, color: "rgba(5,197,95,0.87)", width: 2, dottedLine: false}];that.setData({markers, polyline})} else {that.setData({markers})}} else {console.log('当前非地图选点模式!')}
},

示例图如下:

其他功能

有了前面marker的基础,想实现打标记功能就很简单了。

制作一个表单页面,如下所示:

创建完成后,将坐标信息在地图加载出来,也可以增加坐标过滤功能,或者增加点击展示详情。


总结陈词

此篇文章是《微信小程序实战》系列的第四篇,实际代码量较大,由于篇幅所限,没有贴出全部代码,主要学习一个地图功能思想,感兴趣的可以留言交流,希望可以帮助到大家。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

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

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

相关文章

Python(六)-拆包,交换变量名,lambda

目录 拆包 交换变量值 引用 lambda函数 lambda实例 字典的lambda 推导式 列表推导式 列表推导式if条件判断 for循环嵌套列表推导式 字典推导式 集合推导式 拆包 看一下在Python程序中的拆包&#xff1a;把组合形成的元组形式的数据&#xff0c;拆分出单个元素内容…

电商大变革!TikTok携手亚马逊重塑购物边界,开启海外即看即买新篇章

在电商界&#xff0c;亚马逊还是一众电商平台难以超越的存在。据外媒报道&#xff0c;最新预测显示&#xff0c;预计到2024年底&#xff0c;亚马逊全球将拥有970万卖家&#xff0c;活跃卖家将达到190万。 TikTok携手亚马逊重塑购物边界&#xff0c;开启海外即看即买新篇章 在数…

RK3568 android11 适配鼎桥MT5710-CN 5G模块

一,概述 鼎桥MT571X设备和Android系统主要通过USB接口进行数据通信,Android系统上的Linux内核需要根据鼎桥模块设备上报的USB设备接口加载USB驱动,USB驱动正确加载后,鼎桥模块才能正常工作。 Android系统中支持鼎桥模块设备相关的Linux内核驱动架构,如下图所示: 在Lin…

动手学深度学习(李沐)PyTorch 第 4 章 多层感知机

4.1 多层感知机 隐藏层 我们在 3.1.1.1节中描述了仿射变换&#xff0c; 它是一种带有偏置项的线性变换。 首先&#xff0c;回想一下如 图3.4.1中所示的softmax回归的模型架构。 该模型通过单个仿射变换将我们的输入直接映射到输出&#xff0c;然后进行softmax操作。 如果我们…

21天全面掌握:小白如何高效学习AI绘画SD和MJ,StableDiffusion零基础入门到精通教程!快速学习AI绘画指南!

‍‍大家好&#xff0c;我是画画的小强。 今天给大家分享一些我长期以来总结的AI绘画教程和各种AI绘画工具、模型插件&#xff0c;还包含有视频教程 AI工具&#xff0c;免费送&#x1f447;&#x1f447;‍‍ 这份完整版的AI绘画全套学习资料已经上传CSDN&#xff0c;朋友们如…

Word:表格公式计算

一、求和公式 以下演示是在windows操作系统环境&#xff0c;office软件进行操作的 SUM(LEFT) 全部步骤图如下&#xff1a; 步骤一 光标置于单元格&#xff0c;依次单击【表格工具-布局】→【数据】→【公式】 步骤二 在【公式】一栏中&#xff0c;默认的是“SUM(LEFT)”求和…

AI产品经理学习路径:从零基础到精通,从此篇开始!

一、AI产品经理和和通用型产品经理的异同&#xff1a; 市面上不同的公司对产品经理的定位有很大的差别&#xff0c;一名合格的产品经理是能对软件产品整个生命周期负责的人。 思考框架相同&#xff1a; AI产品经理和通用型软件产品经理的底层思考框架是一样的&#xff0c;都是…

叉车高位显示器无线摄影,安装更加便捷!

叉车叉货&#xff0c;基本功能&#xff0c;但货叉升降高度确不一定&#xff0c;普通的3米左右&#xff0c;高的十几米&#xff0c;特别是仓储车&#xff0c;仓库叉货空间小&#xff0c;环境昏暗&#xff0c;视线受阻严重&#xff0c;司机叉货升的那么高怎么准确无误的插到货呢&…

【Mysql】Mysql数据库基本操作-------DDL(上)

1、DDL解释 DDL&#xff08;Data Definition Language&#xff09;&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff0c; &#xff08;1&#xff09;对数据库的常用操作 &#xff08;2&#xff09;对表结构的常用操作 &#xff08;3&#xff09;修…

详解位示图计算方法、代码

位示图 位示图的核心思想计算过程与位操作假设问题场景&#xff1a; 实际操作与计算&#xff1a;1. 位示图的初始化2. 设置某一位&#xff08;标记资源占用&#xff09;3. 清除某一位&#xff08;释放资源&#xff09;4. 查询某一位&#xff08;检查资源状态&#xff09; 示例问…

SpringBoot文档管理系统:架构与功能

第2章相关技术 2.1 Java技术介绍 Java语言擅长开发互联网类应用和企业级应用&#xff0c;现在已经相当的成熟&#xff0c;而且也是目前使用最多的编程语言之一。Java语言具有很好的面向对象性&#xff0c;可以符合人的思维模式进行设计&#xff0c;封装是将对象的属性和方法尽可…

Ansible流程控制-条件_循环_错误处理_包含导入_块异常处理

文章目录 Ansible流程控制介绍1. 条件判断2. 循环3. 循环控制4. 错误处理5. 包含和导入6. 块和异常处理7. 角色的流程控制*include_tasks、import_tasks_include之间的区别 条件语句再细说且、或、非、是模糊条件when指令的详细使用方法 循环语句再细说如何使用使用item变量结合…

SpringBoot集成Redis及SpringCache缓存管理

1.集成Redis 1.导入依赖 <!--spirngboot springdata对redis支持--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.配置信息 #数据源配置…

08-Registry搭建docker私仓

08-Registry搭建docker私仓 Docker Registry Docker Registry是官方提供的工具&#xff0c;用于构建私有镜像仓库。 环境搭建 Docker Registry也是Docker Hub提供的一个镜像&#xff0c;可以直接拉取运行。 步骤&#xff1a; 拉取镜像 docker pull registry启动Docker R…

Doris安装部署指南

Doris安装部署指南 一、环境准备二、下载并解压安装包三、配置FE和BEFE配置BE配置四、验证集群状态五、集群扩容与缩容六、总结Apache Doris(原百度Palo)是一款基于MPP架构的高性能、实时的分析型数据库。它支持标准SQL,高度兼容MySQL协议,能够运行在绝大多数主流的商用服务…

1.1.5 计算机网络的性能指标(下)

时延&#xff1a; 指数据从网络的一端传送到另一端所需的时间。有时候也称为延迟或迟延。 总时延发送时延传播时延处理时延排队时延 发送时延&#xff1a; 又名传输时延&#xff0c;节点将数据推向信道所花的时间 数据长度/发送速率 传播时延&#xff1a; 电磁波在信道…

20.指针相关知识点1

指针相关知识点1 1.定义一个指针变量指向数组2.指针偏移遍历数组3.指针偏移的补充4.指针和数组名的见怪不怪5.函数、指针、数组的结合 1.定义一个指针变量指向数组 指向数组首元素的地址 指向数组起始位置&#xff1a;等于数组名 #include <stdio.h>int main(){int ar…

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元&#xff08;GRU&#xff09;门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元&#xff08;GRU&#xff09; 之前我们讨论了如何在循环神经网络中计算梯…

爬取元气手机壁纸简单案例(仅用于教学,禁止任何非法获利)

爬虫常用的库 爬虫&#xff08;Web Scraping&#xff09;是一种从网页上提取数据的技术。在 Python 中&#xff0c;有许多库可以帮助实现这一目标。以下是一些常用的爬虫库&#xff0c;以及对 BeautifulSoup 的详细介绍。 常用爬虫库 1.Requests ​ a.功能&#xff1a;用于发…

Mysql优化(常见优化)

插入数据 批量插入&#xff1a;因为一条条插入时&#xff0c;每一条数据的插入都要与数据库建立连接&#xff0c;并且关闭连接 手动提交事物&#xff1a; 主键顺序插入 大批量数据插入 如果一次性需要插入大批量数据&#xff0c;使用insert语句插入性能较低&#xff0c;此时可…