首先,我们应该这样想: 既然我们知道了用户当前位置的经纬度,又知道我们将要搜索的范围,我们可不可以计算出一个范围 ?也就是说,根据一个中心点和半径,计算出符合条件的经纬度的最大值和最小值 。
具体实现:

那么到此,想要独立思考完成的小伙伴可以不要继续往下看了。
上面我们提到该功能的一个实现原理,接下来我们就讲解一下具体的实现步骤。
我们先声明一个函数,用作计算经纬度的范围:

/*** 根据经纬度和半径计算出范围* @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实现搜索附近的人功能相关推荐

  1. java怎么实现查找n功能_java 实现微信搜索附近人功能

    最近给andorid做后台查询数据功能,有一个需求是模仿微信的查找附近人功能. 数据库中存储每个用户的经纬度信息及用户信息,通过当前用户传递过来的经纬度查询这个用户半径N公里以内的用户信息. 数据库表 ...

  2. java 微信定位到市_java 实现微信搜索附近人功能

    最近给andorid做后台查询数据功能,有一个需求是模仿微信的查找附近人功能. 数据库中存储每个用户的经纬度信息及用户信息,通过当前用户传递过来的经纬度查询这个用户半径N公里以内的用户信息. 数据库表 ...

  3. Telegram附近的人功能存在安全风险,可被用于探测用户位置

    近日,有安全研究人员指出,使用著名加密聊天软件Telegram的"附近的人"功能可以暴露用户的确切位置,且该功能长期存在.要知道,Telegram作为一款高度匿名软件,一旦暴露所处 ...

  4. 【沽泡学院07】基于ElasticSearch搜索附近的人

    1. 为什么要选择ElasticSearch 1)ElasticSearch 优点: 分布式.实时的.Push replication 完全支持Apache Lucene的接近实时的搜索 处理多租户( ...

  5. 对抗博弈搜索——吃豆人

    对抗博弈搜索--吃豆人 介绍 项目解决方案 question2:Minimax算法 question3:Alpha-Beta 剪枝 question4:Expectimax question5:优化评 ...

  6. “附近的人”功能是如何实现的?

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群https://juejin.im/post/5da40462f265da5baf410a11 针对"附近的人 ...

  7. 简单音乐播放器html+css+基础vue+含源码,有搜索和播放mv功能,代码可直接复制用。

    题目:html+css+基础vue实现的简单音乐播放器(含源码),有搜索和播放mv功能,代码可直接复制用. 问题描述: 如果vue刚入门,掌握一些基础语法后就可以写一个简单的音乐播放器来练练手~~如果 ...

  8. 使用ElasticSearch完成百万级数据查询附近的人功能

    上一篇文章介绍了ElasticSearch使用Repository和ElasticSearchTemplate完成构建复杂查询条件,简单介绍了ElasticSearch使用地理位置的功能. 这一篇我们 ...

  9. 如何让win7系统发声 win7系统讲述人功能

    如何让win7系统发声 win7系统讲述人功能 win7系统之所以受到那么多用户的喜欢,除了它的唯美界面之外,更多的还是它在功能上得到的升华,今天win7之家小编要讲述的就是win7系统中设置的一款& ...

最新文章

  1. 蓝桥杯知识点归纳-java-API
  2. Linux ls -l文件列表权限详解
  3. .Net Core小技巧 - Hosted Services + Quartz实现定时任务调度
  4. 博客园代码黑色主题高亮设置
  5. 开关问题(模板+高斯消元)
  6. BinderHub 使用简介
  7. 运行Eclipse出错:Failed to load the JNI shared library
  8. python核心编程-第六章-个人笔记(二)
  9. 解决Android的adb命令行报错Permission denied
  10. morhpia(4)-更新
  11. python找到最大最小值、最大最小值的位置、删除最大值最小值
  12. 项目管理(PMP)》项目管理十大知识领域
  13. WPS Office常用快捷键大全
  14. elementui中表格的表头设置背景颜色
  15. 简易数据分析 04 | Web Scraper 初尝--抓取豆瓣高分电影
  16. 蓝凌oa任意文件读取,RCE
  17. install pecl php_pecl安装以前的php版本
  18. Ultra Light Waterproof Jacket 2014 Warm down Coats Cheap
  19. 电脑配置单4(自用勿删)
  20. 小米MIUI或其他手机黑暗深色模式部分控件失效无效

热门文章

  1. 如何清除chrome,firefox浏览器dns缓存
  2. 腾讯拟推出微信聊天记录云存储付费服务,网友质疑:有必要吗?
  3. 科大讯飞CTR预估挑战赛Top3方案总结
  4. css-文字移除显示省略号
  5. MapTask运行机制详解以及Map任务的并行度,ReduceTask 工作机制以及reduceTask的并行度,MapReduce总体工作机制
  6. RSA数字签名?原来这么好理解!!!
  7. windows下rocketMq后台无窗口启动sever和brocker
  8. html 结合3d效果,HTML和CSS3中的2D、3D结合实现动画效果
  9. 手机端和电脑端共用mysql_手机与电脑共用的数据库
  10. docx文档怎么排列图片_pdf怎么快速另存为jpg?有多种方法介绍吗?