搜索
博主信息
博文 142
粉丝 5
评论 0
访问量 157131
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
搜索附近的人PHP实现代码
php开发大牛
原创
838人浏览过

文实例为大家分享了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);
}


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学