搜索附近的人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高级对象构建 工厂模式的使用
Feb 05 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
Jun 07 PHP
PHP手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
php session_start()出错原因分析及解决方法
Oct 28 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
php创建无限级树型菜单
Nov 05 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
如何在PHP中使用数组
Jun 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
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
python实现字符串和日期相互转换的方法
2015/05/13 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
python flask实现分页的示例代码
2018/08/02 Python
在python里面运用多继承方法详解
2019/07/01 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Opencv求取连通区域重心实例
2020/06/04 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
公司财务总监岗位职责
2013/12/14 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
党组织公开承诺书
2014/03/29 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
2014企业年终工作总结
2014/12/23 职场文书
老龙头导游词
2015/02/11 职场文书
早会开场白台词大全
2015/06/01 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android