搜索附近的人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获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
PHP中的插件机制原理和实例
Jul 08 PHP
php生成随机颜色方法汇总
Dec 03 PHP
PHP加密技术的简单实现
Sep 04 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
PHP 实现缩略图
Mar 09 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
php 文件上传系统手记
2009/10/26 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
Python正则表达式教程之二:捕获篇
2017/03/02 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
上海世博会口号
2014/06/19 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书
祝酒词范文
2015/08/12 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
php 原生分页
2021/04/01 PHP
Golang数据类型和相互转换
2022/04/12 Golang
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android