根据一个经纬度求几公里范围内的数据
/** *求两个已知经纬度之间的距离,单位为米 *@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; }
通往牛逼的路上,在意的只有远方!