手把手教你如何實(shí)現(xiàn)查看附近的人
今天分享的教程是教你如何實(shí)現(xiàn)附近的人或者其他內(nèi)容。服務(wù)器端用的php。 使用前提請確認(rèn)你的用戶數(shù)據(jù)表中是否有存儲用戶的***坐標(biāo)和更新時(shí)間,***單獨(dú)建一張表來存儲用戶的***坐標(biāo)和更新時(shí)間。
在獲取附近的人之前首先要獲取自己的坐標(biāo)??梢允褂胋aiduLocation來獲取當(dāng)前用戶的坐標(biāo),然后用當(dāng)前坐標(biāo)請求服務(wù)器返回按照距離排序的用戶數(shù)據(jù)。
- apiready = function() {
- var baiduLocation = api.require('baiduLocation');
- baiduLocation.startLocation({
- accuracy: '100m',
- filter:1,
- autoStop: true
- }, function(ret, err){
- var sta = ret.status;
- var lat = ret.latitude;
- var lon = ret.longitude;
- if(sta){
- //成功獲取
- }else{
- //獲取失敗
- }
- });
- };
//獲取位置成功后,開發(fā)向服務(wù)器發(fā)送請求
- api.ajax({
- url: 請求地址,
- method: 'post',
- timeout: 30,
- dataType: 'json',
- returnAll:false,
- data:{
- values: {lat: lat,lon:lon}
- }
- },function(ret,err){
- if (ret) {
- var urlJson = JSON.stringify(ret);
- api.alert({msg: urlJson});
- }else {
- api.alert({
- msg'錯(cuò)誤碼:'+err.code+';錯(cuò)誤信息:'+err.msg+'網(wǎng)絡(luò)狀態(tài)碼:'+err.statusCode)
- });
- };
- });
其實(shí)在APP端代碼非常簡單,主要就是獲取坐標(biāo)然后發(fā)送到服務(wù)器,然后服務(wù)器根據(jù)傳過來的坐標(biāo)來計(jì)算距離,按照距離排序返回?cái)?shù)據(jù)。那么重點(diǎn)就是服務(wù)器端如何實(shí)現(xiàn)了
服務(wù)器端就以php為例來講一下, 首先獲取有坐標(biāo)用戶的數(shù)據(jù),這個(gè)就是foreach一下了,然后根據(jù)傳過來的坐標(biāo)計(jì)算距離,下面是foreach里面的一段代碼
- 假設(shè) 用戶數(shù)據(jù)為 $data;
- //foreach之前先組裝下post過來的坐標(biāo)
- $lat = $_POST['lat'];
- $lon = $_POST['lon'];
- $myLocation = $lon.','.$lat;
- foreach($data as $key=>$v){
- //E:對方用戶坐標(biāo)為: 104.077638,30.673573
- $v['position'] = "104.077638,30.673573";
- $newData[$key]['distance] = distanceBetween($myLocation,$v['position']);
- .......
- //其他用戶數(shù)據(jù)
- }
然后再foreach一下新數(shù)組根據(jù)距離來排序
- foreach ($newData as $key => $r) {
- $distance[] = $r['distance'];
- }
- array_multisort($distance, SORT_ASC, $newData);
- 輸出JSON數(shù)組
- echo json_encode($newData);
注:上面foreach里面有個(gè)自定義函數(shù)distanceBetween();
這個(gè)是用來計(jì)算兩個(gè)坐標(biāo)的距離的,代碼如下:
- /**
- * 計(jì)算兩個(gè)坐標(biāo)之間的距離(米)
- * @param float $fP1Lat 起點(diǎn)(緯度)
- * @param float $fP1Lon 起點(diǎn)(經(jīng)度)
- * @param float $fP2Lat 終點(diǎn)(緯度)
- * @param float $fP2Lon 終點(diǎn)(經(jīng)度)
- * @return int
- */
- function distanceBetween($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;
- }