基于腾讯地图实现上下班打卡

前言:

             项目需求是用人单位设置目标打卡点,之后程序基于目标当前经纬度计算与目标经纬度的距离。此项目基于微信JSSDK,以及腾讯地图(腾讯地图的使用方式此处不做赘述,自行参考API,日后有空本人会更新一篇);

正文:

           1、  首先我们的项目需要配置公众号的安全域名,具体步骤是:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。值得一提的是,如果想微信不弹出以下这种提示的话,可以顺便设置公众号的业务域名


           2、设置安全域名后我们可以接入 JSSDK ,从而简单的实现一些较复杂的功能;

                1、在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js;

                2、所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每 次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

                       wx.config({

                                       debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数 信息会通过log打出,仅在pc端时才会打印。

                                       appId: '', // 必填,公众号的唯一标识

                                       timestamp: , // 必填,生成签名的时间戳

                                      nonceStr: '', // 必填,生成签名的随机串

                                      signature: '',// 必填,签名,见附录1

                                      jsApiList: [  getLocation ] // 必填,需要使用的JS接口列表我们这里需要使用的是地理位置

                      });

              3、wx.ready(function(){

                         // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如  果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

                            wx.getLocation({

                                    type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给                                                                                openLocation用的火星坐标,可传入'gcj02'

                                    success: function (res) {

                                            var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90

                                            var longitude = res.longitude; // 经度,浮点数,范围为180 ~-180。

                                            var speed = res.speed; // 速度,以米/每秒计

                                            var accuracy = res.accuracy; // 位置精度

                                 }

                         });

                   });


至此,我们的准备工作基本已经做完,getLocation方法会返回用户当前位置的经纬度以及一些其他的参数;下面我们来计算用户的当前位置和目标位置距离;



3、我们可以在网上轻易的找到这种根据两点经纬度计算距离的方式,下面例举一个亲测误差较小       的demo:

    function getFlatternDistance(lat1,lng1,lat2,lng2){

                var f = getRad((lat1 + lat2)/2);

                var g = getRad((lat1 - lat2)/2);

                var l = getRad((lng1 - lng2)/2);

                 var sg = Math.sin(g);

                 var sl = Math.sin(l);

                 var sf = Math.sin(f);

                 vars,c,w,r,d,h1,h2;

                 var a = EARTH_RADIUS;

                 var fl =1/298.257;

                 sg = sg*sg;

                 sl = sl*sl;

                 sf = sf*sf;s= sg*(1-sl) + (1-sf)*sl;

                  c = (1-sg)*(1-sl) + sf*sl;

                  w = Math.atan(Math.sqrt(s/c));

                  r = Math.sqrt(s*c)/w;

                  d = 2*w*a;

                  h1 = (3*r -1)/2/c;

                  h2 = (3*r+1)/2/s;

                 returnd*(1+ fl*(h1*sf*(1-sg) - h2*(1-sf)*sg));

}

我们只需要简单的将两个点的经纬度作为参数传入参数内即可;


但是,腾讯给我们提供了更简单的方法(使用此方法的前提是已经当前页面已经接入腾讯地图):

                  1、var e = new qq.maps.LatLng(latitude,longitude);//括号里是 目标打卡点的纬度经度

                  2、var f=   new qq.maps.LatLng(latitude,longitude);//用户当前位置的纬度经度;

                  3 var distance=                                                                  parseInt(qq.maps.geometry.spherical.computeDistanceBetween(e, f)) //此时此刻 计算出的 distance,即为两点间的直线距离

                  4、我们假设我们允许在目标打卡点五十米以内打卡,

                          if(distance<=50){

                                  alert("打卡成功了")

                          }else if(distance>50){

                                 alert("距离打卡点超过五十米,打卡失败")

                         }else{

                                 alert("出错了")

                         }


至此,一个简单的考勤系统即算完成了,第一次写简书,语句可能啰嗦繁杂了些,我们可以来看一下最终的效果图:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容