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); }
到此,一个简单的附近的人的 程序就算是写好了。可以根据自己的项目需求进行调整,如,运行效率,运行方式等等。