在自研产品「商图助理」正式全馆普及之后,出现了定位不在范围内的情况,经过埋点后台统计,查看部分机型存在定位偏离,且偏离比较大,起初在限定用户定位范围值设定的比较小,导致这部分用户一直无法使用本系统,最终对实际检测值进行了适中的扩大,下方放出前后端计算两坐标点距离的代码

JS
function GetDistance( lat1,  lng1,  lat2,  lng2){
    var radLat1 = lat1*Math.PI / 180.0;
    var radLat2 = lat2*Math.PI / 180.0;
    var a = radLat1 - radLat2;
    var  b = lng1*Math.PI / 180.0 - lng2*Math.PI / 180.0;
    var 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 *6378.137 ;// EARTH_RADIUS;
    s = Math.round(s * 10000) / 10000;
    return s;
}
// 调用 return的距离单位为km
GetDistance(10.0,113.0,12.0,114.0)PHP
private final static double EARTH_RADIUS = 6378.137;//地球半径
private static double rad(double d) {
    return d * Math.PI / 180.0;
}
/**
 * 计算两点间距离
 * @return double 距离 单位km,精确到米
 */
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 = new BigDecimal(s).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
    return s;
}
