• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
车车大人
博客园    首页    新随笔    联系   管理     

根据一个经纬度求几公里范围内的数据


/*
* *求两个已知经纬度之间的距离,单位为米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位米 **/ function getDistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度 $radLat2=deg2rad($lat2); $radLng1=deg2rad($lng1); $radLng2=deg2rad($lng2); $a=$radLat1-$radLat2; $b=$radLng1-$radLng2; $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000; return $s; } sql版:这里x是经度,Y是纬度 SELECT FORMAT(((6370996.81)*ACOS(COS( coordy2 *PI()/180) * COS({$y}*PI()/180) * COS(( coordx2 *PI()/180)-({$x}*PI()/180)) + SIN( coordy2 *PI()/180)*SIN( {$y} *PI()/180)))/1000,2) as distance

 

解释一下下

这里是两个版本,一个是封装的函数  一个是sql语句

在sql版本中,$x,$y因为是变量所以加了{},正式写的时候是不用加的

例如

因为这里除以了1000,并且保留2为小数,如图:

 

所以最后算下来是公里!如果想要米数,那么就把/1000去掉

 

例如:

 

 

 

下边的例子调用:

 

 

 

实际调用示例代码:

//公里测试
    public function actionGetAround($shop_lat,$shop_lng,$user_lat,$user_lng){
        /*$lat1 = 40.0695;//纬度
        $lng1 = 116.423;//经度
        $lat2 = 40.06059088;
        $lng2 = 116.41271683;*/
        $radLat1=deg2rad($shop_lat);//deg2rad()函数将角度转换为弧度
        $radLat2=deg2rad($user_lat);
        $radLng1=deg2rad($shop_lng);
        $radLng2=deg2rad($user_lng);
        $a=$radLat1-$radLat2;
        $b=$radLng1-$radLng2;
        $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000;
        return ceil($s);
    }

    //商家发布活动以后的推送
    public function ShopActivityPush($ac_id,$shop_id){
        $HOST = '';
        $APPKEY = '';
        $APPID = '';
        $MASTERSECRET = '';
        putenv("gexin_pushList_needDetails=true");

        //符合is_push=1的用户cid数组
        $userinfo = UserOperate::find()
            ->select('c_id,lat,lng')
            ->where(['is_push'=>1])
            ->asArray()
            ->all();

        //查询商家的店铺名称、经纬度
        $shopData = Shop::find()->select('merchant_name,lng,lat')->where(['s_id'=>$shop_id])->one();
        $merchant_name = $shopData->merchant_name;
        $shop_lng = $shopData->lng;
        $shop_lat = $shopData->lat;
        $content = '您附近的陪它商家<'.$shopData->merchant_name.'>发布了新活动,点击查看详情';

        //求出符合条件的c_id
        $resArr = [];
        foreach($userinfo as $key=>$val){
            $r = self::actionGetAround($shop_lat,$shop_lng,$val['lat'],$val['lng']);
            if($r<=5000 && $val['c_id']!=null){
                $resArr[] = $val['c_id'];
            }
        }



        $igt = new \IGeTui($HOST,$APPKEY,$MASTERSECRET);

        $template = $this->DogLogIGtTransmissionTemplateDemo($APPID,$APPKEY,$ac_id,$content);

        //定义"ListMessage"信息体
        $message = new \IGtListMessage();
        $message->set_isOffline(true);//是否离线
        $message->set_offlineExpireTime(3600*12*1000);//离线时间
        $message->set_data($template);//设置推送消息类型
        $message->set_PushNetWorkType(0);//设置是否根据WIFI推送消息,1为wifi推送,0为不限制推送
        $contentId = $igt->getContentId($message);


        //接收方
        $targetList = array();
        foreach($resArr as $k=>$v){
            $target = new \IGtTarget();
            $target->set_appId($APPID);
            $target->set_clientId($v);
            $targetList[] = $target;
        }
        
        $rep = $igt->pushMessageToList($contentId, $targetList);

        return $rep;
    }

 

通往牛逼的路上,在意的只有远方!
posted @ 2017-09-08 15:56  车车大人  阅读(2377)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3