一. 依据以后地位计算周围的经纬度

/**公众号:ZERO开发 * 依据以后地位计算周围的经纬度 * @param $lng * @param $lat * @param float $distance * @return array */function returnSquarePoint($lng, $lat, $distance = 0.5){    $earthRadius = 6378138;    $dlng = 2 * asin(sin($distance / (2 * $earthRadius)) / cos(deg2rad($lat)));    $dlng = rad2deg($dlng);    $dlat = $distance / $earthRadius;    $dlat = rad2deg($dlat);        return array(        'left-top' => array('lat' => $lat + $dlat, 'lng' => $lng - $dlng),        'right-top' => array('lat' => $lat + $dlat, 'lng' => $lng + $dlng),        'left-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng - $dlng),        'right-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng + $dlng)    );}

二. 依据经纬度计算范畴

/**公众号:ZERO开发 * 依据经纬度计算范畴 * @param $lat1 * @param $lng1 * @param $lat2 * @param $lng2 * @return float */function getDistance($lat1, $lng1, $lat2, $lng2){    $earthRadius = 6378138;    // 近似地球半径米                          // 转换为弧度    $lat1 = ($lat1 * pi()) / 180;    $lng1 = ($lng1 * pi()) / 180;    $lat2 = ($lat2 * pi()) / 180;    $lng2 = ($lng2 * pi()) / 180;           // 应用半正矢公式  用尺规来计算    $calcLongitude = $lng2 - $lng1;    $calcLatitude = $lat2 - $lat1;    $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);    $stepTwo = 2 * asin(min(1, sqrt($stepOne)));    $calculatedDistance = $earthRadius * $stepTwo;    return round($calculatedDistance);}

三. 通过经纬度依据间隔从近到远排序

/**公众号:ZERO开发 * 通过经纬度依据间隔从近到远排序 * @param $lat * @param $lng * @return mixed */function computePoint($lat, $lng){    $page = 1;    $pageSize = 7;    $EARTH = 6378.137;         // 固定参数 地球半径    $PI = 3.1415926535898;  // 固定参数 圆周率    $list = db('work')->alias('wk')        ->field("        wk.id,wk.work_name,wk.age,wk.teach,wk.gwbqid,wk.start_money,wk.work_description,wk.xz_id,        wk.category,cp.company_id,cp.company_name,cp.la,cp.lo,        (2 * $EARTH* ASIN(SQRT(POW(SIN($PI*(" . $lat . "-cp.la)/360),2)+COS($PI*" . $lat . "/180)* COS(cp.la * $PI/180)*POW(SIN($PI*(" . $lng . "-cp.lo)/360),2)))) as juli        ")        ->order('create_time desc,juli asc')        ->page($page, $pageSize)        ->select()->toArray();    return $list;}

四. 依据经纬度查问地理位置

/**公众号:ZERO开发 * 依据经纬度查问地理位置 * @param $lat * @param $lng */function myLocation($lat, $lng){    $url = "http://api.map.baidu.com/geocoder/v2/?ak=YQH8OyfGcvOsPlHdnssSpkulaSNVgL0N&callback=renderReverse&location=$lat,$lng&output=json&pois=1";    $res = file_get_contents($url);    $lres = ltrim($res, "renderReverse && renderReverse(");    $rres = rtrim($lres, ")");    echo $rres;}

五. 依据经纬度计算直线间隔

/**公众号:ZERO开发 * 依据经纬度计算直线间隔 * @param $lat1 * @param $lng1 * @param $lat2 * @param $lng2 * @return float|int */function getDistances($lat1, $lng1, $lat2, $lng2){    define('PI', 3.1415926535898);    define('EARTH_RADIUS', 6378.137);    $radLat1 = $lat1 * (PI / 180);    $radLat2 = $lat2 * (PI / 180);    $a = $radLat1 - $radLat2;    $b = ($lng1 * (PI / 180)) - ($lng2 * (PI / 180));    $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));    $s = $s * EARTH_RADIUS;    $s = round($s * 10000) / 10000;    return $s * 1000;}

六. 依据经纬度和半径计算出范畴

/**公众号:ZERO开发 * 依据经纬度和半径计算出范畴 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 * @return Array 范畴数组 */function calcScope($lat, $lng, $radius){    $degree = (24901 * 1609) / 360.0;    $dpmLat = 1 / $degree;    $radiusLat = $dpmLat * $radius;    $minLat = $lat - $radiusLat;       // 最小纬度    $maxLat = $lat + $radiusLat;       // 最大纬度    $mpdLng = $degree * cos($lat * (3.141592 / 180));    $dpmLng = 1 / $mpdLng;    $radiusLng = $dpmLng * $radius;    $minLng = $lng - $radiusLng;      // 最小经度    $maxLng = $lng + $radiusLng;      // 最大经度    /** 返回范畴数组 */    $scope = array(        'minLat' => $minLat,        'maxLat' => $maxLat,        'minLng' => $minLng,        'maxLng' => $maxLng    );    return $scope;}

七. 获取两个经纬度之间的间隔

/**公众号:ZERO开发 * 获取两个经纬度之间的间隔 * @param string $lat1 纬一 * @param String $lng1 经一 * @param String $lat2 纬二 * @param String $lng2 经二 * @return float  返回两点之间的间隔 */function calcDistance($lat1, $lng1, $lat2, $lng2){    if (empty($lat1) || empty($lng1) || empty($lat2) || empty($lng2)) {        return false;    }    /** 转换数据类型为 double */    $lat1 = doubleval($lat1);    $lng1 = doubleval($lng1);    $lat2 = doubleval($lat2);    $lng2 = doubleval($lng2);    $theta = $lng1 - $lng2;    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));    $dist = acos($dist);    $dist = rad2deg($dist);    $miles = $dist * 60 * 1.1515;    return ($miles * 1.609344);}