PHP 附近的人

思路:

  首先,我们知道自己的经纬度,知道自己要搜索的范围(半径),我们就可以得到一个已自己为中心的范围圈。然后计算出范围内的经纬度,也就是对于的附近的人。

第一步:我们先声明一个函数,用作计算经纬度的范围:

/**
 * 根据经纬度和半径计算出范围
 * @param string $lat 纬度
 * @param String $lng 经度
 * @param float $radius 半径  单位米
 * @return Array 范围数组
 */
function calcScope($lat, $lng, $radius) {
    $PI = 3.14159265;
    $degree = (24901*1609)/360.0;
    $dpmLat = 1/$degree;
 
    $radiusLat = $dpmLat*$radius;
    $minLat = $lat - $radiusLat;    // 最小纬度
    $maxLat = $lat + $radiusLat;    // 最大纬度
 
    $mpdLng = $degree*cos($lat * ($PI/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;
}

第二步:第一步中返回的数组已经包含了 最大最小的经纬度, 那我们就以此为条件 ,去数据库进行查询。

提供sql语句,根据自己的框架进行修改

'SELECT `字段` FROM `表名` WHERE `Latitude` < '.$scope['maxLat'].' and `Latitude` > '.$scope['minLat'].' and `Longitude` < '.$scope['maxLng'].' and `Longitude` > '.$scope['minLng'];

第三步:获取到附近的人的坐标以后,我们还需要知道自己距离附近的人的距离是多少

/**
 * 获取两个经纬度之间的距离
 * @param string $lat1 纬一
 * @param String $lng1 经一
 * @param String $lat2 纬二
 * @param String $lng2 经二
 * @return float 返回两点之间的距离
 */
function calcDistance($lat1, $lng1, $lat2, $lng2) {
    /** 转换数据类型为 double */
    $lat1 = doubleval($lat1);
    $lng1 = doubleval($lng1);
    $lat2 = doubleval($lat2);
    $lng2 = doubleval($lng2);
    /** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */
    $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);
}

到此,一个简单的附近的人的 程序就算是写好了。可以根据自己的项目需求进行调整,如,运行效率,运行方式等等。

 

posted @ 2019-04-02 14:16  心静,路远  阅读(692)  评论(0编辑  收藏  举报