搜索附近的人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中的Class的几点个人看法
Oct 09 PHP
php实现文件下载更能介绍
Nov 23 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 PHP
完整删除ecshop中获取店铺信息的API
Dec 24 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
php动态函数调用方法
May 21 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 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增加openssl模块的方法
2011/06/14 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
javascript常用方法总结
2015/05/14 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
利用aardio给python编写图形界面
2017/08/21 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
python实现简单飞行棋
2020/02/06 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
总经理司机职责
2014/02/02 职场文书
高中生班主任评语
2014/04/25 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
年度评优评先方案
2014/06/03 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
黄河绝恋观后感
2015/06/08 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书