微信小程序地图获取地点信息(打卡签到功能为例)-2020-7-26

article/2025/1/11 4:14:44
目录

 

  • 微信小程序地图获取地点信息(打卡签到功能为例)
    • 效果图
    • 前提步骤
      • 首先需要了解的
    • 代码部分
      • 配置性代码
      • 功能性代码
    • demo 下载

微信小程序地图获取地点信息(打卡签到功能为例)

解决方案:利用微信小程序的地图组件获取到用户的地理位置信息(经纬度),再通过腾讯地图 SDK 获取到对应的地理位置(即地名)

效果图

  • 地图已打马赛克

前提步骤

首先需要了解的

  • 微信小程序地图组件

  • 腾讯地图简介(很简短,很重要)

    • (需要小程序负责人去申请,不要用自己账号)跟着教程把 key 申请下来,后文要用
      • 并且要在微信开放平台设置合法域名
    • 我们需要下载 sdk,放在对应文件夹中,去引用它(即 qqmap-wx-jssdk.min.js 文件)

代码部分

配置性代码

app.js 部分关键代码

  • key 需要换成你自己申请的
//app.js
// 引入SDK核心类
var QQMapWX = require('/utils/qqmap-wx-jssdk.min.js')App({globalData: {// ..其他全局变量..patrolForm: {checkaddress: "",},// 实例化API核心类qqmapsdk: new QQMapWX({key: '这个key是你申请下来的key' // 必填}),// ..其他全局变量..},// 其他代码
})

app.json 部分关键代码(permission那个对象)

{"pages":["pages/location_check_in/location_check_in"],"window":{"backgroundTextStyle": "light","navigationBarBackgroundColor": "#3db0fc","navigationBarTitleText": "WeChat","navigationBarTextStyle": "white"},"style": "v2","sitemapLocation": "sitemap.json","permission": {"scope.userLocation": {"desc": "您的位置信息将用于小程序签到功能"}}
}

https://apis.map.qq.com 添加到小程序后台-开发-开发设置-服务器域名中

  • 这个操作需要小程序管理员进到后台去配置
  • 我们只需要在开发工具右上角 详情-本地设置 勾上 不校验合法域名........ 即可继续开发

功能性代码

页面代码:location_check_in.wxml

<!--location_check_in/location_check_in.wxml-->
<view class="wholeContinaer"><map id="myMap" markers="{{markers}}" style="width:100%;height:100vh;" longitude="{{poi.longitude}}" latitude="{{poi.latitude}}" scale='16' show-location></map><view class="checkInPanel"><!-- <view class="checkInBtn" bindtap="checkIn" style="background:url('../../images/zcxj/checkInBj.png') center / contain no-repeat"> --><view class="checkInBtn {{canClick ? '' : 'disableClick'}}" bindtap="checkIn"><view class="checkInTitle">签到</view><view class="checkInTime">{{time}}</view></view><!-- <view class="whitePositionPanel" style="background:url('../../images/zcxj/jxk.png') center / contain no-repeat"> --><view class="whitePositionPanel"><view class="positonTextRow"><image class="positionIcon" src="../../images/zcxj/positionIcon.png"></image><view class="positionFont">{{addressName}}</view></view></view><view class="rePosition" bindtap="rePosition"><image class="positionIcon" src="../../images/zcxj/rePosition.png"></image><view class="positionFont">重新定位</view></view></view>
</view>

样式代码:location_check_in.wxss

/* location_check_in/location_check_in.wxss */
Page{background-color: #f2f2f2;
}
.wholeContinaer{position: relative;height: 100vh;
}.mapContianer{background-color: turquoise;width: 100vw;height: 100vh;
}.checkInPanel{position: absolute;width: 705rpx;height: 520rpx;bottom: 25rpx;left: 25rpx;/* background-color: #ffffff; */
}
.checkInBtn{width: 280rpx;height: 280rpx;display: flex;align-items: center;justify-content: center;flex-direction: column;position: absolute;left: calc(50% - 140rpx);z-index: 12;border-radius: 50%;background-image: linear-gradient(180deg, #00a0e9 0%, #0095e9 73%, #0089e9 100%);box-shadow: 0 0 10rpx 0rpx #0089e9;/* margin: 0 auto; */
}
.disableClick{pointer-events: none;
}
.checkInTitle{font-size: 36rpx;line-height: 34rpx;color: #ffffff;
}
.checkInTime{font-size: 24rpx;line-height: 34rpx;color: #8cd7fe;margin-top: 10rpx;
}.whitePositionPanel{width: 100%;height: 412rpx;position: absolute;bottom: 0rpx;background-color: #ffffff;border-radius: 10rpx;display: flex;align-items: center;justify-content: center;
}.positonTextRow{display: flex;align-items: center;justify-content: center;margin-top: 80rpx;
}
.positonTextRow .positionIcon{width: 20rpx;height: 26rpx;margin-right: 10rpx;
}
.positonTextRow .positionFont{font-size: 22rpx;line-height: 29rpx;color: #9c9c9c;
}.rePosition{width: 130rpx;height: 35rpx;background-color: #ffffff;border-radius: 10rpx;display: flex;align-items: center;justify-content: center;position: absolute;top: 60rpx;
}
.rePosition .positionIcon{width: 24rpx;height: 24rpx;margin-right: 10rpx;
}
.rePosition .positionFont{font-size: 18rpx;color: #333333;line-height: 35rpx;
}

逻辑代码:location_check_in.js

  • 逆地址解析(坐标位置描述)函数官方文档:reverseGeocoder(options:Object)
  • realyCheckIn 函数为业务逻辑代码,此前已经获取到了地理位置,缺少了部分前置业务代码,会导致代码报错,改成你自己的就好
// location_check_in/location_check_in.js
const util = require('../../utils/util')
const app = getApp()
const urlList = require("../../utils/api.js")  // 根据实际项目自己配置// 实例化API核心类
const qqmapsdk = app.globalData.qqmapsdkPage({/*** 页面的初始数据*/data: {markers: '',poi: {latitude: '',longitude: ''},addressName: '',time: '',timer: '',timer2: '',  // 用来每个一段时间自动刷新一次定位canClick: true},getAddress(e) {var that = this;qqmapsdk.reverseGeocoder({//位置坐标,默认获取当前位置,非必须参数/*** location: {latitude: 39.984060,longitude: 116.307520},*/// 成功后的回调success: function(res) {// console.log(res);that.setData({addressName: res.result.address})var res = res.result;var mks = [];//当get_poi为0时或者为不填默认值时,检索目标位置,按需使用mks.push({ // 获取返回结果,放到mks数组中title: res.address,id: 0,latitude: res.location.lat,longitude: res.location.lng,iconPath: '../../images/zcxj/myPosition.png', // 图标路径width: 21,height: 28,// callout: { //在markers上展示地址名称,根据需求是否需要//   content: res.address,//   color: '#000',//   display: 'ALWAYS'// }});that.setData({ // 设置markers属性和地图位置poi,将结果在地图展示markers: mks,poi: {latitude: res.location.lat,longitude: res.location.lng}});},fail: function(error) {console.error(error);},complete: function(res) {console.log(res);}})},getTime: function () {let that = thislet time = that.data.timethat.setData({timer: setInterval(function () {time = util.formatTime(new Date())that.setData({time: time.substr(-8)});if (time == 0) {// 页面跳转后,要把定时器清空掉,免得浪费性能clearInterval(that.data.timer)}}, 1000)})},rePosition: function () {console.log('用户点了重新定位')this.getAddress()},checkIn: function () {this.setData({canClick: false})console.log('用户点击了签到')var that = thisvar nowTime = util.formatTime(new Date())wx.showModal({title: '请确认打卡信息',// content: '请确认待整改项已整改完毕!',content: `地点:${this.data.addressName}\n时间:${nowTime}`,  // 开发者工具上没有换行,真机调试时会有的confirmText: '确认',success (res) {if (res.confirm) {console.log('用户点击确定')// 调起签到接口that.realyCheckIn()} else if (res.cancel) {console.log('用户点击取消')that.setData({canClick: true})}}})},realyCheckIn: function() {var that = thisvar patrolForm = app.globalData.patrolForm  // 其他需要一并提交过去的业务数据console.log(app.globalData)// debugger// 要在这里给 patrolForm 补充其他的参数patrolForm.checkaddress = this.data.addressNamepatrolForm.searchtime = util.formatTime(new Date())// 应该先判断用户有没有登录,没登录就授权登录patrolForm.searchuser = app.globalData.user ? app.globalData.user.UserName : app.globalData.userInfo.nickNameconsole.log("传给后台的 searchuser:", patrolForm.searchuser)// 拼接:"经度,纬度"patrolForm.latandlon = this.data.poi.longitude + "," + this.data.poi.latitudeconsole.log(patrolForm)console.log("↑ 签到提交的post参数")var tmpNumber = 0wx.request({url: urlList.submitCheckInInfo,data: patrolForm,method: "POST",header: {'content-type': 'application/x-www-form-urlencoded'},success: function (res) {console.log(res)if(res.data.IsSuccess) {console.log(res.data.IsSuccess, typeof(res.data.IsSuccess))console.log("请求成功")var patrolId = res.data.ReturnData[0].id// // 看怎么取到返回的id// debuggerif (patrolForm.img_arr1.length > 0) {for (var i = 0; i < patrolForm.img_arr1.length; i++){tmpNumber = iwx.uploadFile({// 图片上传的接口地址url: urlList.submitCheckInPhoto + "?patrolid=" + patrolId,filePath: patrolForm.img_arr1[i],name: 'content',// formData: {//   // 这里面可以携带一些参数一并传过去//   patrolId: patrolId// },// header: {//   Authorization: token// },success: function (res) {console.log(res)},fail: function (res) {that.setData({canClick: true})},complete: function () {// 因为上传图片是异步操作,所以会导致这里的 i 会取不到,故需要用个作用域更大点的变量来标识,否则 if 里面的代码不会执行if(tmpNumber === patrolForm.img_arr1.length - 1) {// 有图片就等图片上传完了再返回首页wx.showToast({title: '巡查签到成功!',icon: 'success',duration: 2000,complete: function(){wx.navigateBack({delta: 2  // 回退两层页面})}})}}})}} else{wx.showToast({title: '巡查签到成功!',icon: 'success',duration: 2000,complete: function(){wx.navigateBack({delta: 2})}})}}},fail: function(res) {that.setData({canClick: true})}})},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {var that = thisthat.getTime()that.getAddress()that.setData({canClick: true, // 允许用户点击,防止多次提交timer2: setInterval(function () {that.getAddress()}, 20000)  // 每20秒刷新一次定位})},/*** 生命周期函数--监听页面卸载*/onUnload: function () {clearInterval(this.data.timer)clearInterval(this.data.timer2)console.log("定时器已被清除")},/*** 生命周期函数--监听页面初次渲染完成*/onReady: function () {},/*** 生命周期函数--监听页面显示*/onShow: function () {},/*** 生命周期函数--监听页面隐藏*/onHide: function () {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: function () {},/*** 页面上拉触底事件的处理函数*/onReachBottom: function () {},/*** 用户点击右上角分享*/onShareAppMessage: function () {}
})

demo 下载

gitee地址:微信小程序打卡定位签到: 微信小程序打卡定位签到代码

如果对你有帮助,还请帮忙点个 star!


http://chatgpt.dhexx.cn/article/qi3NyudG.shtml

相关文章

IOS高德地图逆地理编码定位+网络判断

先说下这功能的流程&#xff0c; 流程:判断用户是否联网--->获取用户地理位置经纬度--->通过经纬度去查询地理位置名称 //高德地图 property (nonatomic, strong) MAMapView *mapView;//高德地图 property (nonatomic, strong) AMapSearchAPI *search; property(nonatom…

如何制作专业的手绘地图(电子地图、智慧导览系统)

一、智慧导览系统介绍 手绘电子地图&#xff0c;就是把手绘地图覆盖到地图上&#xff0c;游客或者普通用户&#xff0c;可以在手机上通过地图的链接&#xff08;或者现在流行的小程序&#xff09;打开使用。是一种使用非常方便&#xff0c;集**“视、听、路径规划、实时导航”*…

js技术调用高德api实现精准定位

我先说下写这个程序的起因&#xff0c;昨天晚上我的一个朋友在淘宝上卖它玩了两年的光遇号。 号给淘宝商家了就不理人也不给钱了&#xff0c;因为没有订单记录淘宝官方不管。这种回收游戏账号的微信账号的十有九骗。在黑猫上就能查到各种回收账号的诈骗案件。 于是我给我朋友写…

vue + 高德精准定位(示例)

鱼弦:CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen) 使用Vue和高德精准定位可以实现基于Vue框架的精准定位功能。下面是对该方法的原理、使用场景、文献材料链接以及当前使…

CocosCreator系列——接入高德地图sdk获取经纬度信息图文详解

CocosCreator接入高德地图sdk获取经纬度信息图文详解 先看效果 1.首先去 高德开放平台.申请key 接下来该获取发布版和调试版的SHA1了&#xff0c;首先打开cmd命令窗口 输入命令&#xff1a;cd .android(首先进入用户系统的安卓文件夹) 然后输入命令&#xff1a;keytool -li…

反应式编程框架设计:如何使得程序调用不阻塞等待

前言&#xff1a; 程序在高并发的情况下&#xff0c;程序容易崩溃。主要的原因是&#xff1a;在高并发的情况下&#xff0c;有大量用户请求需要程序计算处理&#xff0c;而目前的处理方式是&#xff0c;为每个用户请求分配一个线程&#xff0c;当程序内部因为访问数据库等原因…

TensorFlow编程框架基础

一、为什么要使用编程框架 深度学习的算法具有多层结构&#xff0c;每层的运算由一些基本操作构成&#xff0c;这些基本操作中存在大量共性运算&#xff0c;如卷积、池化、激活等。 将这些共性运算操作封装起来&#xff0c;可以提高编程实现效率。 面向这些封装起来的操作&am…

c语言编程框架_编程语言和框架的状态

c语言编程框架 作为专业的软件交付人员&#xff0c;我喜欢掌握技术趋势和“市场可能走向何方”。 在过去的十五年中&#xff0c;已经出现了许多语言和框架&#xff0c;并且几乎没有任何真正的持久力。 为了在“人们想知道的事情”上适销对路&#xff0c;使我知识广博&#xff0…

MFC编程框架总结

简介 MFC是一种C类库&#xff0c;利用面向对象的方法封装了Windows API&#xff0c;为Windows应用程序的开发带来了极大便利。本文总结了使用MFC进行编程的基本方法&#xff0c;编程环境为VS2008 SP1。 搭建MFC开发环境 由于使用MFC应用程序向导后VS会自动生成应用程序框架&am…

并发编程框架----disruptor框架(一)

背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列&#xff0c;研发的初衷是解决内存队列的延迟问题&#xff08;在性能测试中发现竟然与I/O操作处于同样的数量级&#xff09;。基于Disruptor开发的系统单线程能支撑每秒600万订单&#xff0c;2010年在QCon演讲后&…

网络编程框架

网络编程 Socket网络通信编程 Socket主要解决一个网间进程通信&#xff08;不同主机进程间的相互通信问题&#xff09;。 提供进程通信的端点&#xff0c;一个程序将一段信息写入Socket中&#xff0c;该Socket将这段信息发送给另外一个Socket中&#xff0c;使这段信息能传送到…

您所应了解的Python四大主流网络编程框架

**本文内容摘录自《Python高效开发实战——Django、Tornado、Flask、Twisted》一书。**该书分为三部分&#xff1a;第1部分是基础篇&#xff0c;带领初学者实践Python开发环境和掌握基本语法&#xff0c;同时对网络协议、Web客户端技术、数据库建模编程等网络编程基础深入浅出地…

常见编程/框架介绍

文章大纲 一、C/C二、C#三、cocos2d-x四、go语言五、Hadoop六、HBase七、PHP八、python九、Spark十、Storm十一、Unity3D十二、Java十三、Android十四、Object-C与swift十五、.NET十六、R语言 一、C/C 1. 简介 C语言是目前世界上流行、使用最广泛的高级程序设计语言。C语言对操…

Linux 应用编程框架

粗略的复习下linux应用编程的一些知识&#xff0c;画个导图记录总结下&#xff1a;

Python 四大主流 Web 编程框架

目前Python的网络编程框架已经多达几十个&#xff0c;逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处&#xff0c;本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Python网络框架&#xff1a;Django、Tornado、Flask、Twisted。 …

【常见编程/框架介绍】

目录 一、C/C 1. 简介 2. 特点 3. 优点 4. 缺点 5. 常见使用场景 二、C# 三、cocos2d-x 四、go语言 1. 简介 2. 优点 3. 缺点 4. 就业方向 五、Hadoop 1. 简介 2. 优势 3. 应用场景 六、HBase 七、PHP 1. 简介 2. 优点 3. 缺点 4. 就业方向 八、python …

mac命令行查看dSYM文件的UUID

通过命令行查看 *.dSYM 文件的UUID值&#xff0c;标准范式&#xff1a; xcrun dwarfdump --uuid dSYM文件 实例演示&#xff1a; 想查看 Electron Framework.dSYM 的UUID值&#xff1a; 结果&#xff1a;5BE9E0C9-3946-3E4D-B12A-595EDA5170AF

dSYM的简单介绍

通过http://www.cocoachina.com/ios/20100427/1222.html 这篇文章&#xff0c;结合自己日常工作的理解&#xff0c;提炼了一下主要内容 一、dsym是什么&#xff1f; 在XCODE编译项目之后,会在app旁看见一个同名的dSYM文件.&#xff08;rd称之为 符号文件&#xff09;他是一个编…

dSYM 文件分析工具

我在项目中使用了百度统计&#xff0c;友盟统计也可以&#xff0c;上线项目出bug的时候&#xff0c;错误信息统计中能比较方便的找出客户端异常的信息&#xff0c;可是很多像数组越界却只给出了 *** -[__NSArrayM objectAtIndex:]: index 50 beyond bounds [0 .. 39] 这类错误信…