搜索附近的人PHP实现代码
发布:smiling 来源: PHP粉丝网 添加日期:2021-09-03 11:32:52 浏览: 评论:0
本文实例为大家分享了PHP实现搜索附近的人具体代码,供大家参考,具体内容如下
实现思路:
首先,我们应该这样想: 既然我们知道了用户当前位置的经纬度,又知道我们将要搜索的范围,我们可不可以计算出一个范围 ?也就是说,根据一个中心点和半径,计算出符合条件的经纬度的最大值和最小值 。
具体实现:
那么到此,想要独立思考完成的小伙伴可以不要继续往下看了。
上面我们提到该功能的一个实现原理,接下来我们就讲解一下具体的实现步骤。
我们先声明一个函数,用作计算经纬度的范围:
- /**
- * 根据经纬度和半径计算出范围
- * @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;
- $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;
- }
扩展:
直到现在,我们已经知道了如何计算出附近的人,但在实际需求中,我们往往需要计算出每一个人与当前中心点的实际距离。
接着,我们再来看一个方法:
- /**
- * 获取两个经纬度之间的距离
- * @param string $lat1 纬一
- * @param String $lng1 经一
- * @param String $lat2 纬二
- * @param String $lng2 经二
- * @return float 返回两点之间的距离
- */
- public 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);
- }
Tags: PHP搜索附近的人
- 上一篇:PHP的RSA加密解密方法以及开发接口使用
- 下一篇:PHP长连接实现与使用方法详解
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)