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

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

还是可以接受的。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/app/5300.html

(0)
上一篇 2021年7月16日 23:41
下一篇 2021年7月16日 23:41

相关推荐

发表回复

登录后才能评论