第二期 微信云开发之位置信息获取(wx.getLocation)

news2024/11/13 14:52:50

很多小伙伴在开发微信小程序的时候,需要获取当前用户位置信息时,都会遇到该如何获取位置详细信息的问题,以下是我的处理方法。
首先,我在生活智打卡小程序使用的是微信小程序自带的获取用户的位置信息的接口(wx.getLocation),但是这个接口不会返回具体的地址信息(比如xxx地名),主要调用方法和返回参数如下:

wx.getLocation({
	type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
	success: function (res) {
		console.log("定位成功", res);
	}
});

//返回结果
{	// 位置的精确度,反应与真实位置之间的接近程度,可以理解成10即与真实位置相差10m,越小越精确
	accuracy: 65
	errMsg: "getLocation:ok"
	// 水平精度,单位 m
	horizontalAccuracy: 65
	latitude: 纬度
	longitude: 经度
	// 速度
	speed: -1
	// 垂直精度,单位 m
	verticalAccuracy: 65
}

要想获取具体位置信息,还需要做下一步处理
首先,进入腾讯地图开发者平台,没有账号的先完成账号注册,随后进入控制台应用管理列表添加应用
在这里插入图片描述
添加key
在这里插入图片描述
最后可查看官方文档进行逆地址解析了,以下是我写的示例,仅供参考:

wx.request({
	url: 'https://apis.map.qq.com/ws/geocoder/v1/?l&get_poi=1',
	data: {
		"key": "你申请的key",
		"location": "39.984154,116.307490"
	},
	method: 'GET',
	success: function (res) {
    	// success
    	console.log(res.data);
        console.log("请求数据:" + address);
    },
    fail: function () {
    	// fail
    	console.log("请求失败");
    },
    complete: function () {
    // complete
    	console.log("请求完成");
    }
});

部分响应结果(详细可查看官方文档)在这里插入图片描述

在这里插入图片描述
如何在地图上展示当前位置图标?请查看以下代码
在这里插入图片描述
// 前端

<!--pages/position/position.wxml-->
<view class="container">
	<view class="map">
		<map id="myMap" longitude="{{longitude}}" latitude="{{latitude}}" scale="16" markers="{{markers}}"
			polyline="{{polyline}}" show-location="true" show-location style="width: 100%; height: 400rpx;font-size:32rpx"></map>
		<view class="address">位置:{{address}}</view>
		<view class="address">详细地址:{{detail}}</view>
		<view class="address" wx:if="{{!isPosition}}" style="color:red;font-size:24rpx;">请打开手机位置服务,才可以打卡</view>
	</view>
	<view class="content" style="{{'margin-top:'+ marginTop +'rpx'}}">
		<scroll-view scroll-y="true">
			<block wx:if="{{clock_in}}">
				<view class="clockinfo" wx:for="{{clock_in}}" wx:key="item">
					<i-card title="地址:{{clock_in[index].address}}">
						<view slot="content">详细地址:{{clock_in[index].detail}}</view>
						<view slot="footer">打卡时间:{{clock_in[index].time}}</view>
					</i-card>
				</view>
			</block>
			<view wx:if="{{!ifData}}" style="text-align: center;">暂无打卡记录</view>
		</scroll-view>
	</view>
	<view class="btn">
		<button class="button" bindtap="onAdd" type='primary'>开始打卡</button>
	</view>
	<view wx:if="{{showCon}}" class="modal-mask" bindtap="changeModalCancel">
		<view class="modal-dialog">
			<view class="modal-title">温馨提示</view>
			<view class="modal-content">
				获取定位失败,请前往设置打开定位权限,我们将用于定位打卡功能。
			</view>
			<view class="modal-footer">
				<view class="btn-cancel" catchtap="changeModalCancel">取消</view>
				<button open-type="openSetting" class="btn-confirm button-on-view" style="padding:16rpx;"
					catchtap="changeModalCancel">设置</button>
			</view>
		</view>
	</view>
</view>

js代码

const app = getApp();
Page({
    /**
     * 页面的初始数据
     */
    data: {
        address: '',
        latitude: '',
        longitude: '',
        detail: '',
        markers: [],
        _openid: '',
        clock_in: '',
        showCon: false,
        marginTop: 0, // 距离顶部高度
        city: '',
        district: '',
        isPosition: true,
        ifData: true
    },
    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh: function () {
        wx.showNavigationBarLoading() //在标题栏中显示加载
        this.getCityNameOFLocation();
        setTimeout(function () {
            wx.hideNavigationBarLoading() //完成停止加载
            wx.stopPullDownRefresh() //停止下拉刷新
        }, 1000);
    },
    changeModalCancel: function () {
        this.setData({
            showCon: false
        })
    },
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {
        wx.startPullDownRefresh() //下拉刷新
        this.setData({
            _openid: app.getOpenid()
        })
        var that = this;
        setTimeout(function () {
            that.onList();
        }, 1000)
    },
    getCityNameOFLocation: function () {
        var that = this;
        wx.getLocation({
            type: 'gcj02', // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标
            success: function (res) {
                console.log("定位成功", res);
                var latitude = res.latitude;
                var longitude = res.longitude;
                var locationString = latitude + "," + longitude;
                wx.request({
                    url: 'https://apis.map.qq.com/ws/geocoder/v1/?l&get_poi=1',
                    data: {
                        "key": "你申请的key",
                        "location": locationString
                    },
                    method: 'GET',
                    // header: {}, 
                    success: function (res) {
                        // success
                        console.log(res.data);
                        var address = res.data.result.address
                        var detail = res.data.result.formatted_addresses.rough
                        console.log("请求数据:" + address);
                        that.setData({
                            markers: [{
                                iconPath: "",
                                id: 0,
                                latitude: latitude,
                                longitude: longitude,
                                width: 50,
                                height: 50
                            }],
                            address: address,
                            detail: detail,
                            latitude: latitude,
                            longitude: longitude,
                            city: res.data.result.ad_info.city,
                            district: res.data.result.ad_info.district
                        })
                    },
                    fail: function () {
                        // fail
                        console.log("请求失败");
                    },
                    complete: function () {
                        // complete
                        console.log("请求完成");
                    }
                })
            },
            fail: function () {
                // fail
                console.log("定位失败");
                wx.getSetting({
                    success: (res) => {
                        if (!res.authSetting['scope.userLocation']) {
                            that.setData({
                                showCon: true,
                                isPosition: false
                            })
                        }
                    }
                })
            },
            complete: function () {
                // complete
                console.log("定位完成");
            }
        })
    },
    //添加位置信息
    onAdd: function () {
        if (this.data.address) {
            var time = util.formatTime(new Date);
            const db = wx.cloud.database();
            db.collection('position').add({
                data: {
                    address: this.data.address,
                    detail: this.data.detail,
                    latitude: this.data.latitude,
                    longitude: this.data.longitude,
                    time: new Date(time),
                    city: this.data.city,
                    district: this.data.district
                },
                success: res => {
                    // 在返回结果
                    wx.showToast({
                        title: '添加成功',
                    })
                    var that = this;
                    setTimeout(function () {
                        that.onList()
                    }, 1000)
                },
                fail: err => {
                    wx.showToast({
                        icon: 'none',
                        title: '添加失败'
                    })
                    console.error('[数据库] [新增记录] 失败:', err)
                }
            })
        } else {
            wx.showToast({
                title: '请打开位置服务,才可以打卡',
                icon: 'none'
            })
        }
    },
    //查询打卡记录
    onList: function () {
        const db = wx.cloud.database();
        db.collection('position').where({
                _openid: this.data._openid
            }).skip(0).orderBy('time', 'desc')
            .get({
                success: res => {
                    console.log(res.data);
                    if (res.data.length > 0) {
                        var info = [{}];
                        for (var i = 0; i < res.data.length; i++) {
                            var date = new Date(res.data[i].time);
                            var date_value = util.formatTime(date);
                            info[i] = {
                                time: date_value,
                                address: res.data[i].address,
                                detail: res.data[i].detail
                            };
                            // console.log(date_value)
                        }
                        this.setData({
                            clock_in: info
                        })
                    } else {
                        this.setData({
                            ifData: false
                        })
                    }
                    // console.log('[数据库] [查询记录] 成功: ', this.data.clock_in)
                },
                fail: err => {
                    wx.showToast({
                        icon: 'none',
                        title: '查询失败',
                    })
                    console.log(' 获取 clock_in 失败,请检查是否有部署云函数,错误信息:', err)
                }
            });
    },
    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady(e) {
        var that = this
        // 页面渲染完成
        setTimeout(() => {
            var query = wx.createSelectorQuery();
            query.select('.map').boundingClientRect();
            query.selectViewport().scrollOffset();
            query.exec((res) => {
                console.log(res)
                var listHeight = res[0].height; // 获取list高度
                that.setData({
                    marginTop: listHeight * 2 + 20
                })
            });
        }, 1000)

    }
})

css代码

page {
	background: #F6F6F6;
}
.address{
	margin: 20rpx 20rpx 20rpx 40rpx;
  font-size:30rpx;
}
.map {
  width: 100%;
  position: fixed;
	top: 0;
  z-index: 1;
	background: white;
	box-shadow: 1px 1px rgba(0, 0, 0, 0.1);
}
.title {
	margin: 20rpx 0 20rpx 0;
	width: 100%;
  text-align: center;
	font-weight: bold;
}
.clockinfo {
	margin-top:20rpx;
  width: 100%;
  float: left;
}
.content {
  font-size: 28rpx;
  margin-bottom: 200rpx;
}
.btn {
	position: fixed;
  height: 140rpx;
  text-align: center;
	width: 100%;
  bottom: 0rpx;
  background-color: white;
}
.button {
  margin-top: 24rpx;
}
.modal-mask {
	width: 100%;
	height: 100%;
	position: fixed;
	top: 0;
	left: 0;
	background-color: rgba(0, 0, 0, 0.5);
	overflow: hidden;
	z-index: 9999;
	display: flex;
	align-items: center;
	justify-content: center;
}
.modal-dialog {
	width: 540rpx;
	overflow: hidden;
	z-index: 9999;
	background: #f9f9f9;
	border-radius: 5rpx;
}
.modal-title {
	padding-top: 30rpx;
	font-size: 32rpx;
	color: #030303;
	text-align: center;
}
.modal-content {
	padding: 20rpx 32rpx;
	font-size: 28rpx;
}
.modal-footer {
	display: flex;
	flex-direction: row;
	height: 86rpx;
	border-top: 1px solid #dedede;
	font-size: 34rpx;
	line-height: 86rpx;
}
.btn-cancel {
	width: 50%;
	color: #abb4bd;
	text-align: center;
	border-right: 1px solid #dedede;
}
.btn-confirm {
	width: 50%;
	color: #6fb64b;
	text-align: center;
	font-weight: 500;
}

好了,在此如果有什么不懂的在评论区留言或者私信联系作者,感谢您的支持!!!

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

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

相关文章

基于JSP技术的猎头公司管理软件的设计和实现——内部事务部分(源代码+论文)

分类号&#xff1a;TP315 U D C&#xff1a;D10621-408-(2007)5978-0 密 级&#xff1a;公 开 编 号&#xff1a;2003031227 成都信息工程学院 学位论文 基于JSP技术的猎头公司管理软件的设计和实现 ——内部事务部分 基于JSP技术的猎头公司管理软件的设计和实现 ——内…

世界杯太精彩了,带大家用Python做个足球游戏,边玩游戏边看比赛

文章目录 Python零基础快速制作足球游戏&#xff08;附源代码&#xff09; 前言 一、Python环境说明 二、游戏程序说明 1、游戏开始界面 2、人物移动规则说明&#xff0c;可支持两位玩家 3、足球规则 4、主方法调取 三、游戏运行效果与比赛结果 1、游戏开始界面 2、…

桥接设计模式

一、桥接模式 1、定义 桥接模式&#xff08;Bridge Pattern&#xff09;又称作桥梁模式&#xff0c;指将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化&#xff0c;属于结构型设计模式。 桥接模式的主要目的是通过组合的方式建立两个类之间的联系&#xff0c…

java计算机毕业设计ssm社区养老服务管理系统iq0w7(附源码、数据库)

java计算机毕业设计ssm社区养老服务管理系统iq0w7&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

海口市美兰区图书馆建筑结构设计(计算书+任务书+建筑结构施工组织设计cad图纸)

【目录】 1目录……………………………………………………………………………………………………….1 2前言……………………………………………………………………………………………………3 3 摘要……………………………………………………………….…………………………1 结…

Java项目:SSM出租车管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 超级管理员角色包含以下功能&#xff1a; 超级管理员管理,公告管理,系统管理员管理,司机管理,车辆管理,维修保养管理,运营里程记录等功能。 普通…

12.4泛型 map set

目录 一,泛型 1 什么是泛型 2 引出泛型 2.1语法 3 泛型类的使用 3.1 语法 3.2 示例 3.3 类型推导(Type Inference) 4.裸类型(Raw Type) 5 泛型如何编译的 5.2 为什么不能实例化泛型类型数组 6 泛型的上界 6.1 语法 6.3 复杂示例 7 泛型方法 7.1 定义语法 二.通…

【数据结构】二分搜索树

集合java.util包下的常用子类&#xff0c;集合无非就是各种数据结构的应用。集合存在的目的就是为了将数据高校进行读写&#xff0c;无论哪种具体的集合无外乎CURD。 Collection->单个元素保存的父接口。 List->可以保存重复的单个元素。 Set->保存单个不重复元素。…

python在centos7.x下建立虚拟环境

(327条消息) python在centos下安装以及配置_雨师的博客-CSDN博客 https://blog.csdn.net/wtt234/article/details/128172281 python离线环境下安装第三方模块的方法&#xff1a; https://blog.csdn.net/wtt234/article/details/128162292 上篇已经把python在centos下的安装以及…

红蓝对抗--sliver 搭建

使用sliver的优点: 1 支持macos、win、linux上线 2 支持丰富的插件加载扩展,功能选择多,CS已经很普遍了,可以尝试sliver做C2 sliver相关构成: Implant:生成植入的木马 sliver-client :C2的控制端 Sliver Server:C2的控制端,客户端通过gRPC接口与server交互 架构: […

【 java 集合】Collection 接口中的常用方法

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

LeetCode刷题复盘笔记—一文搞懂纯完全背包问题(动态规划系列第十一篇)

今日主要总结一下动态规划背包问题的基础——纯完全背包问题 在Leetcode题库中主要都是0-1背包和完全背包的应用问题&#xff0c;所以主要掌握这两个背包问题 题目&#xff1a;纯完全背包问题 题目描述&#xff1a; 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是w…

List——顺序表与链表(二)

文章目录前言一、链表概念及结构二、LinkedList与链表1.什么是LinkedList2.LinkedList的常用方法3.链表的遍历三.实现自己的LinkedList四.ArrayList和LinkedList的区别与优缺点总结前言 上一篇文章中&#xff0c;介绍了List接口以及ArrayList的使用&#xff0c;并且进行了简单…

ByteTrack多目标追踪论文阅读

paper:ByteTrack: Multi-Object Tracking by Associating Every Detection Box code:ByteTrack 一.摘要 多目标追踪的目的是识别视频中物体或对象的位置和身份&#xff0c;也就是说&#xff0c;不同于目标检测的是&#xff0c;追踪问题可以分为两个任务&#xff1a;1&#x…

(附源码)springboot平衡膳食小程序 毕业设计 250859

基于springboot平衡膳食小程序 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;平衡膳食小程序被用户普遍使…

物联网设备WIFI模块实现

问题 如何在设备上进行 Wifi 编程&#xff1f; LwIp (Light Weight IP) 简介 LwIp 是轻量化的 TCP/IP&#xff0c;是一个小型开源的 TCP/IP 协议栈 LwIp 的设计目标是用较少的资源实现较完整的 TCP/IP 协议栈 LwIp 能在操作系统中运行&#xff0c;也能在无操作系统的情况下…

Java—异常体系

文章目录异常和错误java异常的分类&#xff1a;非运行时异常运行时异常受检异常&#xff08;非运行时异常&#xff09;如何处理&#xff1f;1、try catch finally为什么要用try catch finally2、throwsThrow和Throws的区别JVM是如何处理异常的try-catch-finally中哪个部分可以省…

项目管理逻辑:项目经理如何掌控项目生命周期, 才能避免身心俱疲?

目录 1.项目生命周期 2.预测型项目周期 3.迭代型项目周期 3.1.初始阶段 3.2.精化阶段 3.3.构建阶段 3.4.交付阶段 4.增量型生命周期 5.敏捷开发 5.根据具体项目使用合理的开发方式 1.项目生命周期 2.预测型项目周期 预测型项目周期就是软件开发领域的瀑布流模型&…

【Python自然语言处理】概率上下文无关文法(PCFG)及神经网络句法分析讲解(图文解释 超详细)

觉得有帮助或有疑问麻烦点赞关注收藏后评论区私信留言~~~ 一、句法分析 句法分析&#xff08;syntactic parsing或者parsing&#xff09;是识别句子包含的句法成分要素以及成分之间的内在关系&#xff0c;一般以句法树来表示句法分析的结果。实现该过程的应用称作句法分析器&a…

三维模型的简化算法研究(任务书+lunwen+外文翻译+源码+查重报告)

目 录 第1章 绪论 1 1.1 研究背景 1 1.2 内存网格简化算法 1 1.2.1 顶点聚类 1 1.2.2 区域合并 2 1.2.3 迭代式消除 4 1.2.4 随机重采样 5 1.3 三维模型简化算法 6 1.3.1 分片简化 6 1.3.2 使用外部数据结构 7 1.3.3 网格批处理 9 1.3.4 流式简化 10 1.3.5 小结 11 1.4 自适应等…