搜索附近的人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 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
Mar 23 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
php强制运行广告的方法
Dec 01 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
Feb 15 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
Laravel框架实现的使用smtp发送邮件功能示例
Mar 12 PHP
PHP模版引擎原理、定义与用法实例
Mar 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
PHP 数组遍历顺序理解
2009/09/09 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
给Javascript数组插入一条记录的代码
2007/08/30 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Python中装饰器的一个妙用
2015/02/08 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
设置jupyter中DataFrame的显示限制方式
2020/04/12 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
办公室内勤工作职责
2013/12/11 职场文书
给老师的一封建议书
2014/03/13 职场文书
四下基层实施方案
2014/03/28 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
感恩父母的演讲稿
2014/05/06 职场文书
个人总结与自我评价
2015/02/14 职场文书
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers