搜索附近的人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简介
Oct 09 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP7匿名类用法分析
Sep 26 PHP
PHP精确计算功能示例
Nov 29 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
PHP常见的序列化与反序列化操作实例分析
Oct 28 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
详解Laravel服务容器的优势
May 29 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
Twig模板引擎用法入门教程
2016/01/20 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
js函数般调用正则
2008/04/08 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
浅析BootStrap Treeview的简单使用
2016/10/12 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
python字典的遍历3种方法详解
2019/08/10 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
django form和field具体方法和属性说明
2020/07/09 Python
Python 爬虫性能相关总结
2020/08/03 Python
Python实现壁纸下载与轮换
2020/10/19 Python
python实现三种随机请求头方式
2021/01/05 Python
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
医学生职业生涯规划书范文
2014/03/13 职场文书
消防工作实施方案
2014/06/09 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
义诊活动通知
2015/04/24 职场文书
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
 python中的元类metaclass详情
2022/05/30 Python