搜索附近的人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 Sql Server连接失败问题及解决办法
Aug 07 PHP
php下关于中英数字混排的字符串分割问题
Apr 06 PHP
php 函数使用方法与函数定义方法
May 09 PHP
PHP 第二节 数据类型之字符串类型
Apr 28 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
May 28 PHP
php实现的双向队列类实例
Sep 24 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 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在线生成ico文件的代码
2007/10/09 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
VUE 全局变量的几种实现方式
2018/08/22 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
python实现从ftp服务器下载文件的方法
2015/04/30 Python
Python中规范定义命名空间的一些建议
2016/06/04 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
TensorFlow实现Logistic回归
2018/09/07 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
python利用线程实现多任务
2020/09/18 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
揠苗助长教学反思
2014/02/04 职场文书
爱与责任演讲稿
2014/05/20 职场文书
财务总监岗位职责
2015/02/03 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
详解Vue的列表渲染
2021/11/20 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js