php实现搜索附近的人的方法:首先声明一个函数,用作计算经纬度的范围;然后从数据库中查找所有在这个经纬度范围内符合条件的记录;最后查询经纬度在“$radius”范围内的电站的详细地址即可。
推荐:《PHP视频教程》
最近的一个项目要求根据用户当前位置的经纬度来查询该用户方圆十公里以内的人,这个功能并不是什么很有技术含量的实现(当然,我们仅仅指的是该功能本身和数据量较小的时候,并不包括长期以来其派生出来的其他问题 ),但由于种种考虑,我还是决定将其记录下来。
以后不管我们从事APP服务端开发,还是做WEB开发,可能经常会有客户要求实现这样的功能,所以我们还是要掌握其原理。
【问题的提出】
我们该如何思考这个问题 ? 可能有的小伙伴要说了:“ 既然我们已经知道了当前用户的经纬度,我们从数据库里面查询用户的经纬度,然后一一计算,筛选出所有符合条件的用户。”
我也曾想当然的这样认为,并没有考虑到数据库的感受,当你操作的是一个十万,百万级别的数据库时,这样的做法带来的问题将是灾难性的,那么我们到底该如何做呢 ?
【实现思路】
首先,我们应该这样想: 既然我们知道了用户当前位置的经纬度,又知道我们将要搜索的范围,我们可不可以计算出一个范围 ?也就是说,根据一个中心点和半径,计算出符合条件的经纬度的最大值和最小值 。
【具体实现】
那么到此,想要独立思考完成的小伙伴可以不要继续往下看了。
上面我们提到该功能的一个实现原理,接下来我们就讲解一下具体的实现步骤。
我们先声明一个函数,用作计算经纬度的范围:
/** * 根据经纬度和半径计算出范围 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 * @return Array 范围数组 */private function calcScope($lat, $lng, $radius) { $degree = (24901*1609)/360.0; $dpmLat = 1/$degree; $radiusLat = $dpmLat*$radius; $<mark style="color:transparent">来源gaodaimacom搞#代%码网</mark>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; }
返回的数组中包含了在 $radius 范围内,符合条件的最大最小经纬度。
既然我们已经获取到了范围,那么我们就可以开始从数据库中查找所有在这个经纬度范围内符合条件的记录:
/** * 根据经纬度和半径查询在此范围内的所有的 * @param String $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 * @return Array 计算出来的结果 */public function searchByLatAndLng($lat, $lng, $radius) { $scope = $this->calcScope($lat, $lng, $radius); // 调用范围计算函数,获取最大最小经纬度 /** 查询经纬度在 $radius 范围内的电站的详细地址 */ $sql = 'SELECT `字段` FROM `表名` WHERE `Latitude` < '.$scope['maxLat'].' and `Latitude` > '.$scope['minLat'].' and `Longitude` < '.$scope['maxLng'].' and `Longitude` > '.$scope['minLng']; $stmt = self::$db->query($sql); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); // 获取查询结果并返回 return $res; }