• 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);
    }

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

  • 相关阅读:
    省常中模拟 Test4
    省常中模拟 Test3 Day1
    省常中模拟 Test3 Day2
    省常中模拟 Test1 Day1
    树型动态规划练习总结
    noip2010提高组题解
    noip2003提高组题解
    noip2009提高组题解
    noip2004提高组题解
    noip2002提高组题解
  • 原文地址:https://www.cnblogs.com/zheart/p/10642347.html
Copyright © 2020-2023  润新知