搜索附近的人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 相关文章推荐
第五节--克隆
Nov 16 PHP
PHP+ACCESS 文章管理程序代码
Jun 21 PHP
php中json_encode中文编码问题分析
Sep 13 PHP
php全排列递归算法代码
Oct 09 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 PHP
php判断页面是否是微信打开的示例(微信打开网页)
Apr 25 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
Dec 09 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
PHP实现的日历功能示例
Sep 01 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 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防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
深入理解Python分布式爬虫原理
2017/11/23 Python
Python callable()函数用法实例分析
2018/03/17 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
基于python中__add__函数的用法
2019/11/25 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
平面设计求职信
2014/03/10 职场文书
励志演讲稿大全
2014/08/21 职场文书
研修心得体会
2014/09/04 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
英语教学课后反思
2016/02/15 职场文书