问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php怎么实现得到近距离的用户的,就想58同城交友的那样。

发布网友 发布时间:2022-04-28 01:07

我来回答

4个回答

懂视网 时间:2022-04-28 05:28

php实现搜索附近的人的方法:首先声明一个函数,用作计算经纬度的范围;然后从数据库中查找所有在这个经纬度范围内符合条件的记录;最后查询经纬度在“$radius”范围内的电站的详细地址即可。

推荐:《PHP视频教程》

最近的一个项目要求根据用户当前位置的经纬度来查询该用户方圆十公里以内的人,这个功能并不是什么很有技术含量的实现(当然,我们仅仅指的是该功能本身和数据量较小的时候,并不包括长期以来其派生出来的其他问题 ),但由于种种考虑,我还是决定将其记录下来。
以后不管我们从事APP服务端开发,还是做WEB开发,可能经常会有客户要求实现这样的功能,所以我们还是要掌握其原理。

【问题的提出】

我们该如何思考这个问题 ? 可能有的小伙伴要说了:“ 既然我们已经知道了当前用户的经纬度,我们从数据库里面查询用户的经纬度,然后一一计算,筛选出所有符合条件的用户。”

我也曾想当然的这样认为,并没有考虑到数据库的感受,当你操作的是一个十万,百万级别的数据库时,这样的做法带来的问题将是灾难性的,那么我们到底该如何做呢 ?

【实现思路】

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

【具体实现】

那么到此,想要独立思考完成的小伙伴可以不要继续往下看了。

上面我们提到该功能的一个实现原理,接下来我们就讲解一下具体的实现步骤。

我们先声明一个函数,用作计算经纬度的范围:

/**
 * 根据经纬度和半径计算出范围
 * @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);
}

我们在之前已经计算出了附近符合条件的所有人的经纬度,那么我们可以将每一个人的经纬度和当前中心点的经纬度作为参数传入该函数,最终计算出每个人符合条件的人与该中心点的距离。

为了保证程序的严谨性,我必须做出以下说明:

经纬度范围的计算方法是在百度上查找的,目前尚没有找到标准的计算工具,因此该算法无法求证,但大多数帖子基本上采用的这种计算方式。
经纬度距离的计算方式是在 Google 上查找的,计算结果与大多数计算工具结果相近。之所以在 Google 中查找,是因为我曾在百度上查找过多种计算方式,结果都不尽人意。
通过半径和经纬度计算范围时,半径的单位是m;计算距离时,得到的结果是km。因此,要注意单位变化。
我依然在努力求证,寻求有关专业的帮助,获得更精确的计算结果。

热心网友 时间:2022-04-28 02:36

首先告诉你,这个用程序是实现不了的;
然后告诉你,怎么实现;
一般定为手段有
gps(就是全球定为系统):通过经纬度来确定你的位置
cid :基站位置,也就是通过你的通讯基站来知道你的大概位置
再就是你的ip,通过路由器的位置来估计你的位置

如果是pc上,58估计是通过ip的方式

热心网友 时间:2022-04-28 03:54

我没有上面那么高地技术,提供一个更简单的不设计技术层面的方法。
你设置用户注册信息的时候,地址栏中具体到县一级或者乡镇一级,如果乡镇或者县同,那么一定是近距离的用户了。

热心网友 时间:2022-04-28 05:29

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 Windows10的分辨率调错了,结果电脑屏幕就黑屏了 win10如何切换vga输出 Win7安全模式vga怎么进 win10分辨率调高了黑屏不能进安全模式怎么弄 坐等大神解决 win10连接vga显示里为什么不出现子屏幕 VGA模式怎么进 win10怎么进入vga模式 请问,我的谷歌浏览器安装后为什么不能使用,界面如下,系统为Win7sp1,浏览器版本为最新版 为什么win7 64位用64位谷歌浏览器 google chrome要求操作系统必须为win7或更高版本!!! 怎么弄! 谷歌浏览器和win7不兼容,浏览器高手,懂的说,看问题。别说没用的 win7系统,使用不了google 和 firefox浏览器,能正常安装,但是一碰就死。系统重装也不行 win7系统google浏览器打不开网页的处理方法 谷歌浏览器占内存吗?速度怎样?网购安全吗?我的电脑是win7操作系统,64位旗舰版的 win7系统打不开google浏览器怎么办 win7系统下怎么打开谷歌chrome浏览器设置 Chrome可以支持的最低系统要求是windows7吗? 谷歌浏览器支持哪个windows 谷歌浏览器和win7不兼容 我的谷歌浏览器与win7系统貌似不兼容了。怎么解决? 如何用php实现搜索功能 php怎么实现定位?除了ip php站内搜索怎么实现? php商城系统里面的搜索框怎么实现 php要实现简单的查找功能,只要一个输入查找内容的编辑框并且要和查找的结果在同一页面显示,怎么实现? PHP与MYSQL实现搜索功能 PHP如何实现手机定位,求代码! 怎么用php代码写一个小搜索框,输入关键字后点击搜索下面会返回输入的关键字? 关于php的问题,在搜索框中输入要查询的再点击按钮查询,本人对php不太了解 php+mysql实现一个简单的搜索显示功能 求php通过已知的经纬度,操作百度地图api获取周边服务信息的实例,回答满意我再加分. php知道用户的坐标怎么算出用户附近的商店 php怎么调用java jar PHP中如何运行Java程序? PHP MYSQL中怎么使用java java怎么调用php的语句是什么 Java 与PHP等相互调用的问题 php调用java接口,具体步骤,要可以在win10和linux上使用的,,高额悬赏! php怎么调用java的https方式的webservice接口 php 如何调用javasc变量