搜索附近的人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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
中英文字符串翻转函数
Dec 09 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
smarty中js的调用方法示例
Oct 27 PHP
php实现的日历程序
Jun 18 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
php生成网页桌面快捷方式
May 05 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
laravel5.2表单验证,并显示错误信息的实例
Sep 29 PHP
laravel withCount 统计关联数量的方法
Oct 10 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
php实现zip文件解压操作
2015/11/03 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
js动态创建、删除表格示例代码
2013/08/07 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
js轮播图代码分享
2016/07/14 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
jquery插件开发模式实例详解
2019/07/20 jQuery
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
详细讲解Python中的文件I/O操作
2015/05/24 Python
python类继承用法实例分析
2015/05/27 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
Python3运算符常见用法分析
2020/02/14 Python
教师党员岗位承诺书
2014/05/29 职场文书
企业文化口号
2014/06/12 职场文书
中队活动总结
2014/08/27 职场文书