搜索附近的人PHP实现代码


Posted in PHP onFebruary 11, 2018

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
php 学习资料零碎东西
Dec 04 PHP
基于PHP生成静态页的实现方法
May 10 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 PHP
PHP+redis实现添加处理投票的方法
Nov 14 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
php使用PDO执行SQL语句的方法分析
Feb 16 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 #PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 #PHP
PHP实现的多维数组排序算法分析
Feb 10 #PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 #PHP
PHP实现APP微信支付的实例讲解
Feb 10 #PHP
PHP有序表查找之插值查找算法示例
Feb 10 #PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 #PHP
You might like
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
Yii全局函数用法示例
2017/01/22 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
Python利用ansible分发处理任务
2015/08/04 Python
浅析Python基础-流程控制
2016/03/18 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
英文翻译的自我评价语句
2013/10/04 职场文书
英文自荐信
2013/12/15 职场文书
同学聚会老师邀请函
2014/01/28 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
倡议书的格式写法
2015/04/28 职场文书
php中pcntl_fork详解
2021/04/01 PHP
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python