牛骨文教育服务平台(让学习变的简单)

通过微信企业号开发:微信考勤中的方法计算出了用户的地理位置,我们知道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米,

还是可以接受的。