当前位置: 首页 > 科技观察

教你如何实现附近的人

时间:2023-03-16 12:13:10 科技观察

今天分享的教程就是教你如何实现附近的人或其他内容。php在服务器端。使用前请确认您的用户数据表中是否存有用户的最新坐标和更新时间。最好创建一个单独的表来存储用户的最后坐标和更新时间。在获取附近的人之前,必须先获取自己的坐标。可以使用baiduLocation获取当前用户的坐标,然后使用当前坐标请求服务器返回按距离排序的用户数据。apiready=function(){varbaiduLocation=api.require('baiduLocation');baiduLocation.startLocation({accuracy:'100m',filter:1,autoStop:true},function(ret,err){varsta=ret.status;varlat=ret.latitude;varlon=ret.longitude;if(sta){//获取成功}else{//获取失败}});};//获取位置成功后,开发向服务器发送请求api.ajax({url:请求地址,method:'post',timeout:30,dataType:'json',returnAll:false,data:{values:{lat:lat,lon:lon}}},function(ret,err){if(ret){varurlJson=JSON.stringify(ret);api.alert({msg:urlJson});}else{api.alert({msg'错误代码:'+err.code+';错误message:'+err.msg+'网络状态码:'+err.statusCode)});};});其实APP端的代码很简单,主要就是获取坐标发送给服务器,然后服务器根据传来的坐标计算距离。返回按距离排序的数据。那么重点就是server端是怎么实现的。让我们以PHP为例。首先,获取带坐标的用户数据。这是一个foreach,然后根据传入的坐标计算距离。下面是一段代码假设在foreach中用户数据为$data;//post的坐标在foreach之前组装$lat=$_POST['lat'];$lon=$_POST['lon'];$myLocation=$lon.','.$lat;foreach($dataas$key=>$v){//E:对方用户坐标为:104.077638,30.673573$v['position']="104.077638,30.673573";$newData[$key]['distance]=distanceBetween($myLocation,$v['position']);......//其他用户数据}然后foreach新数组按照距离foreach($newDataas$key=>$r){$distance[]=$r['distance'];}array_multisort($distance,SORT_ASC,$newData);输出JSON数组echojson_encode($newData);注意:上面的foreach中有一个自定义函数distanceBetween();这是用来计算两个坐标之间距离的代码如下:/***计算两个坐标之间的距离(米)*@paramfloat$fP1Lat起点(纬度)*@paramfloat$fP1Lon起点(经度)*@paramfloat$fP2Lat端点(纬度)*@paramfloat$fP2Lon端点(经度)*@returnint*/functiondistanceBetween($mylonlat,$findlonlat){$mylonlat=explode(',',$mylonlat);$findlonlat=explode(',',$findlonlat);list($lng1,$lat1)=$mylonlat;list($lng2,$lat2)=$findlonlat;$EARTH_RADIUS=6378.137;$PI=3.1415926;$radLat1=$lat1*$PI/180.0;$radLat2=$lat2*$PI/180.0;$a=$radLat1-$radLat2;$b=($lng1*$PI/180.0)-($lng2*$PI/180.0);$s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));$s=$s*$EARTH_RADIUS;$s=round($s*1000);if($len_type>1){$s/=1000;}$distance=round($s/1000.2);return$distance;};