在许多场景中,都使用到了定位,比如上班打卡的时候需要在公司内进行,如果定位显示不在公司,则无法进行打卡。以此为启发,为了增加打卡的趣味性,开发了一个预埋答题点,以答题点为中心,100米半径为有效范围的答题小程序。
预埋答题点,若干个答题点组成一条线路,
这和核电厂里运行巡检路线有点相似了,在开发这个小程序的时候,极大程度上借鉴了在运行巡检路线的思想,而比巡检路线有所优化的地方是可以借助GPS定位确保人员一定是到达了预埋的答题点,这种强约束是在程序里固化下来的。
以设备定位或人员定位为核心的应用场景,关键需要解决定位的技术问题,在电厂厂区暂时解决不了定位的问题,所以之前的一些想法没有完全实现,通过这次微信小程序开发定位功能,算是把之前《工单地图》里的定位想法形成闭环。
预埋答题点
答题点实际上是一个GPS定位,通过小程序的地图组件可以标注出位置的经纬度坐标,在统一的标准坐标体系下,这个位置点是唯一的。在地图上选择一系列的位置,形成一条路线。
生成小程序码
生成小程序码,将小程序码贴在指定的位置,方便于用户扫描。使用微信的扫一扫功能,扫描之后直接接入到小程序页面,小程序页面通过微信定位接口获取到该手机所在的GPS位置,经过距离计算,确定是不是在100米半径范围的答题圈内,如果在,则显示答题的内容。
答题操作
这种场景主要是增加趣味性,所以题目都是一些非常简单的题目,从预先准备的一些题目中随机抽一道题目进行作答,在答对或答错后可以进行相应的奖励,如此完成一个闭环。
选择答案,点击提交按钮,会有一次与服务器的交互,将本次答题记录保存在服务器上。
在逻辑上设置了每个月只允许在这个答题点答一次,如果检测到这个月内多次答题的话,这会出现答题无效的情况。 开发过程简要介绍 开发分为微信小程序开发和后端PHP程序开发。核心的计算两个点直接的距离算法如下:distance: function (la1, lo1, la2, lo2) { var La1 = la1 * Math.PI / 180.0; var La2 = la2 * Math.PI / 180.0; var La3 = La1 - La2; var Lb3 = lo1 * Math.PI / 180.0 - lo2 * Math.PI / 180.0; var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2))); s = s * 6378.137; s = Math.round(s * 10000) / 10000; s = s.toFixed(6); return s; },
后端PHP程序有一些数据库的操作,需要对传递的一些参数做好校验和过滤,杜绝安全方面的风险。