前言:目前大多数的公司都在使用钉钉进行签到打卡,使用过的都知道钉钉打卡是基于位置的,也就是说你必须在一个特定的范围内打卡,超过这个范围的只能外勤打卡,这一功能是如何实现的呢?
在读书的时候,大家应该都学过球面两点之间距离的计算,由于我长时间没有学习了,也无心再去拾起数学,因此只是提供一个大致的思路和实现源码。我们可以把地球看做一个不太规则的球体,赤道长度则看做球体的直径。我们都知道在地理坐标系中有两个角值,分别是经度和纬度,他们可以用来代表地球上的某一点。
球面两点之间距离计算公式:d(x1,y1,x2,y2)=r*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2))
咱们假设两地的经纬度已经获取到了(后面单独发表一篇文章记录安卓获取当前经纬度),定义PI值为3.14159265358979323,地球半径取6371229,代码如下:
public double getDistance(double longt1, double lat1, double longt2,double lat2)
{
double x, y, distance;
x = (longt2 - longt1) * PI * R* Math.cos(((lat1 + lat2) / 2) * PI / 180) / 180;
y = (lat2 - lat1) * PI * R / 180;
distance = Math.hypot(x, y);
return distance;
}
PS:经测试,上述代码计算结果与百度地图结果误差在0.02之内