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

news2024/11/15 19:25:32

📢 大家好,我是 【战神刘玉栋】,有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 = this
    wx.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 = this
    wx.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 = this
    let 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.staffId
                newArr.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 || false
    if (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.coloradmin.cn/o/2161363.html

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

相关文章

seL4 Mapping(三)

官网链接: Mapping Mapping 这节课程主要是介绍seL4的虚存管理。 虚存 Virtual memory 除了用于操作硬件分页结构的内核原语之外&#xff0c;seL4不提供虚拟内存管理。用户必须为创建中间级分页结构&#xff0c;映射页面以及取消映射页面提供服务。 用户可以随意的定义他们…

Python图表显示添加中文

import re import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 动态加载字体文件 font_path /usr/local/sunlogin/res/font/wqy-zenhei.ttc # 替换为实际字体路径 my_font FontProperties(fnamefont_path)# 定义日志…

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录 Linux环境下配置安装VScode并配置Go语言开发环境Go语言源码的组织方式Go语言源码安装后的结果Go程序构建和安装的过程go build扩展go get 命令详解 之前学习过Go语言&#xff0c;学习的时候没有记录笔记&#xff0c;最近找了个极客时间的Go语言36讲&#xff0c;打算时间学…

影响RPA流程稳定运行的若干因素|实在RPA研究

RPA发展现状 当前&#xff0c;中国正处于实现高质量发展、数字化转型升级的关键时期。RPA作为数字化转型的一项重要工具&#xff0c;已经开始在许多领域发挥积极作用。 RPA&#xff08;Robotic Process Automation 机器人流程自动化&#xff09;是一种通过软件机器人自动执行…

stm32 keil有一些别人的工程在你这打开为什么会乱码?如何解决的

因为别人编辑代码使用的编辑器和你的不一样&#xff0c;要更正可以调一下自己的翻译器编码格式 也可以直接换掉文件的格式&#xff0c; 用记事本打开文件&#xff0c;然后点会另存为&#xff0c;下面有个编码格式选择&#xff0c;换成你自己的就行

Neko一个在Docker环境下的虚拟浏览器

Neko是一个在 Docker 中运行并使用 WebRTC 技术的自托管虚拟浏览器。Neko 是一个强大的工具&#xff0c;可让您在虚拟环境中运行功能齐全的浏览器&#xff0c;使您能够从任何地方安全、私密地访问互联网。使用 Neko&#xff0c;您可以像在常规浏览器上一样浏览 Web、运行应用程…

Python接口测试实践—参数化测试、数据驱动测试和断言的使用

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在Python接口测试实践中&#xff0c;参数化测试、数据驱动测试和断言是常用的技术手段。 参数化测试 参数化测试是指将测试用例中的某些部分&#xff08;如输入数…

蓝桥杯算法之暴力

暴力 1.十进制数转换成罗马数字 2.判断给出的罗马数字是否正确 小知识 %&#xff08;模除&#xff09;&#xff1a; % 符号用作模除&#xff08;或取模&#xff09;运算符。模除运算是一种数学运算&#xff0c;它返回两个数相除的余数。 具体来说&#xff0c;如果 a 和 b 是…

初识 C++ ( 1 )

引言&#xff1a;大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言&#xff0c;而C是面向对象语言&#xff0c;说C和C的区别&#xff0c;也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…

自然语言处理实战项目:从理论到实现

一、引言 自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学交叉的领域&#xff0c;旨在让计算机能够理解、处理和生成人类语言。随着互联网的飞速发展&#xff0c;大量的文本数据被产生&#xff0c;这为自然语言处理技术的发展提供了丰富的素材&#xf…

【动态规划】(五)动态规划——子序列问题

动态规划——子序列问题 子序列问题☆ 最长递增子序列&#xff08;离散&#xff09;最长连续递增序列&#xff08;连续&#xff09;最大子序和&#xff08;连续&#xff09;最长重复子数组&#xff08;连续&#xff09;☆ 最长公共子序列&#xff08;离散-编辑距离过渡&#xf…

【驱动】修改USB转串口设备的属性,如:Serial

1、查看串口信息 在Windows上,设备管理窗口中查看设备号 2、修改串口号工具 例如使用:CH34xSerCfg.exe 使用步骤:恢复默认值 - -> 修改 Serial String(或者Product String等属性)–> 写入配置 3、查看设备节点 在linux上使用lsub查看新增的设备信息,如下这个…

python多线程开发的具体示例

用一个具体的示例&#xff0c;展示如何使用 ThreadPoolExecutor 和 asyncio 来并行运行多个任务&#xff0c;并输出结果。 代码&#xff1a; import asyncio import time from concurrent.futures import ThreadPoolExecutorclass WorkJob:def __init__(self, job_id):self.j…

报表做着太费劲?为你介绍四款好用的免费报表工具

1. 山海鲸可视化 介绍&#xff1a; 山海鲸可视化是一款免费的国产可视化报表软件&#xff0c;与许多其他宣传免费的软件不同&#xff0c;山海鲸的报表功能完全免费并且没有任何限制&#xff0c;就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化…

11.安卓逆向-安卓开发基础-api服务接口设计2

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

云手机推荐:五款热门云手机测评!

在云手机市场中&#xff0c;各个品牌层出不穷&#xff0c;让人难以选择。为了帮助你更好地找到适合的云手机应用&#xff0c;我们整理了五款最受欢迎的云手机进行测评。2024年&#xff0c;哪款云手机是你的不二之选&#xff1f;且慢下结论&#xff0c;看看这五款云手机的真实表…

【深度学习】深度卷积神经网络(AlexNet)

在 LeNet 提出后&#xff0c;卷积神经网络在计算机视觉和机器学习领域中很有名气&#xff0c;但并未起到主导作用。 这是因为 LeNet 在更大、更真实的数据集上训练的性能和可行性还有待研究。 事实上&#xff0c;在 20 世纪 90 年代到 2012 年之间的大部分时间里&#xff0c;…

Windows系统的Tomcat日志路径配置

文章目录 引言I Windows系统的Tomcat日志路径配置配置常规日志路径访问日志路径配置,修改server.xmlII 日志文件切割:以分隔割tomcat 的 catalina.out 文件为例子通过Linux系统自带的切割工具logrotate来进行切割引言 需求:C盘空间不足,处理日志文件,tomcat日志迁移到D盘…

中国科学院云南天文台博士招生目录

中国科学院云南天文台是专业基础研究与应用研究结合的综合性天文研究机构&#xff08;其前身是1938年中央研究院天文研究所在昆明东郊凤凰山创建的凤凰山天文台&#xff09;&#xff0c;总部在云南省昆明市&#xff0c;设有两个观测站&#xff08;丽江高美古天文观测站和澄江抚…

Boruta 的库的初识

我在一个kaggle比赛时间预测中发现Boruta我并不熟悉与是我学习了一下 Boruta 的工作原理&#xff1a; 影子特征&#xff08;Shadow Features&#xff09;: Boruta 首先创建一组影子特征&#xff0c;这些影子特征是通过随机打乱原始特征的值生成的。影子特征的目的是作为对照组…