通過[微信企業號開發:微信考勤](http://blog.csdn.net/xuexiaodong009/article/details/47952239)中的方法計算出了用戶的地理位置,我們知道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;
}
~~~
[具體原理參考](http://www.cnblogs.com/ycsfwhh/archive/2010/12/20/1911232.html)
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); //添加折線到地圖上
~~~
[具體參考](http://developer.baidu.com/map/jsdemo.htm#a6_1)
這兩種方法會有一定的偏差,但可以接受。我個人認為百度計算出來的會更準確一些,畢竟地球不是標準的球形,百度應用這么廣泛,應該已經修正了部分偏差。
例如對于點,Point(106.486654,29.490295),Point(106.581515,29.615467),百度計算出來的距離16670.90 米,通過經緯度計算出來的距離為16689.5796,偏差為20米,
還是可以接受的。