手把手教你如何实现查看附近的人
发布在APICloud移动应用开发平台2015年7月4日view:4763
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

今天分享的教程是教你如何实现附近的人或者其他内容。服务器端用的php。 使用前提请确认你的用户数据表中是否有存储用户的最新坐标和更新时间,最后单独建一张表来存储用户的最新坐标和更新时间。

在获取附近的人之前首先要获取自己的坐标。可以使用baiduLocation来获取当前用户的坐标,然后用当前坐标请求服务器返回按照距离排序的用户数据。

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{
            //获取失败
        }
    });
};

//获取位置成功后,开发向服务器发送请求

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'错误码:'+err.code+';错误信息:'+err.msg+'网络状态码:'+err.statusCode)
        });
    };
});

其实在APP端代码非常简单,主要就是获取坐标然后发送到服务器,然后服务器根据传过来的坐标来计算距离,按照距离排序返回数据。那么重点就是服务器端如何实现了

服务器端就以php为例来讲一下, 首先获取有坐标用户的数据,这个就是foreach一下了,然后根据传过来的坐标计算距离,下面是foreach里面的一段代码

        假设 用户数据为  $data;
        //foreach之前先组装下post过来的坐标
        $lat = $_POST['lat'];
        $lon = $_POST['lon'];
        $myLocation = $lon.','.$lat;

    foreach($data as $key=>$v){
      //E:对方用户坐标为: 104.077638,30.673573
    $v['position'] = "104.077638,30.673573";
      $newData[$key]['distance] = distanceBetween($myLocation,$v['position']);

  .......
  //其他用户数据
}

然后再foreach一下新数组根据距离来排序

    foreach ($newData as $key => $r) {
        $distance[] = $r['distance'];
    }

array_multisort($distance, SORT_ASC, $newData);
输出JSON数组
echo json_encode($newData);

注:上面foreach里面有个自定义函数distanceBetween();

这个是用来计算两个坐标的距离的,代码如下:

/**
* 计算两个坐标之间的距离(米)
* @param float $fP1Lat 起点(纬度)
* @param float $fP1Lon 起点(经度)
* @param float $fP2Lat 终点(纬度)
* @param float $fP2Lon 终点(经度)
* @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;
}

原文:http://community.apicloud.com/bbs/forum.php?mod=viewthread&tid=5300

评论
发表评论
暂无评论
WRITTEN BY
小金宝同學coolboy
我就是太阳无需凭借谁的光!
TA的新浪微博
PUBLISHED IN
APICloud移动应用开发平台
  • 7天开发APP,重新定义移动应用开发。
  • 可以帮助开发者快速实现移动应用的开发、测试、发布、管理和运营的全生命周期管理。
  • 云API:减少70%服务器端编码工作量,同时提供推送、云修复、大数据分析等服务。
  • 端API:“积木拼装”式的开发跨平台APP,为APP开发者提供大量优质的原生模块,涵盖UI、系统、交互、影音、支付等类型的原生模块。
  • 模块store:“模块Store”通过提供“1+1”的服务(一站式+一键集成),让APP开发以及第三方服务SDK的集成变得非常简单,可以像逛超市一样在APICloud“模块Store”挑选自己中意的第三方服务,只需在线一键绑定,就可以实现不同服务的快速集成。
  • 官方网站:www.apicloud.com

友情链接 大搜车前端团队博客
我的收藏