微信企业号开发:微信考勤2如何计算距离

来源:互联网 发布:python cuda 安装 编辑:程序博客网 时间:2024/05/16 19:06

    通过微信企业号开发:微信考勤中的方法计算出了用户的地理位置,我们知道GPS会有一定偏差,但如何把这个偏差考虑进去呢?例如在500米的偏差内都认为是在办公室内呢?

有两种方法,一种是使用根据两点经纬度计算距离的方法,一种是调用地图的API,


1根据两点经纬度计算距离的方法


核心代码:

 private const double EARTH_RADIUS = 6378.137*1000;//地球半径,单位为米    private static double rad(double d)    {        return d * Math.PI / 180.0;    }    /// <summary>    /// 返回两点之间的距离,单位为米    /// </summary>    /// <param name="lat1"></param>    /// <param name="lng1"></param>    /// <param name="lat2"></param>    /// <param name="lng2"></param>    /// <returns></returns>    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)    {        double radLat1 = rad(lat1);        double radLat2 = rad(lat2);        double a = radLat1 - radLat2;        double b = rad(lng1) - rad(lng2);        double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +         Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));        s = s * EARTH_RADIUS;        s = Math.Round(s * 10000) / 10000;        return s;    }
具体原理参考
2调用地图的API

因为我调用的是百度地图,因此应该使用百度地图计算距离的方法

核心方法:

// 百度地图API功能var map = new BMap.Map("allmap");map.centerAndZoom("重庆",12);  //初始化地图,设置城市和地图级别。var pointA = new BMap.Point(106.486654,29.490295);  // 创建点坐标A--大渡口区var pointB = new BMap.Point(106.581515,29.615467);  // 创建点坐标B--江北区alert('从大渡口区到江北区的距离是:'+(map.getDistance(pointA,pointB)).toFixed(2)+' 米。');  //获取两点距离,保留小数点后两位var polyline = new BMap.Polyline([pointA,pointB], {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5});  //定义折线map.addOverlay(polyline);     //添加折线到地图上

具体参考

这两种方法会有一定的偏差,但可以接受。我个人认为百度计算出来的会更准确一些,毕竟地球不是标准的球形,百度应用这么广泛,应该已经修正了部分偏差。

例如对于点,Point(106.486654,29.490295),Point(106.581515,29.615467),百度计算出来的距离16670.90 米,通过经纬度计算出来的距离为16689.5796,偏差为20米,

还是可以接受的。

1 0