php 根据经纬度计算范围
/** *计算某个经纬度的周围某段距离的正方形的四个点 *@param lng float 经度 *@param lat float 纬度 *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米 *@return array 正方形的四个点的经纬度坐标 */ private function returnSquarePoint($lng, $lat,$distance = 5) { $earthdata=6371;//地球半径,平均半径为6371km $dlng = 2 * asin(sin($distance / (2 * $earthdata)) / cos(deg2rad($lat))); $dlng = rad2deg($dlng); $dlat = $distance/$earthdata; $dlat = rad2deg($dlat); $arr=array( 'left_top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng), 'right_top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng), 'left_bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng), 'right_bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng) ); return $arr; } //使用此函数计算得到结果后,带入sql查询。 $point = $this->returnSquarePoint($lng,$lat,5); //计算经纬度的周围某段距离的正方形的四个点 $right_bottom_lat = $point['right_bottom']['lat']; //右下纬度 $left_top_lat = $point['left_top']['lat']; //左上纬度 $left_top_lng = $point['left_top']['lng']; //左上经度 $right_bottom_lng = $point['right_bottom']['lng']; //右下经度 $sql = "SELECT * FROM `表名` WHERE LastGpsWei<>0 AND latitude>$right_bottom_lat AND latitude<$left_top_lat AND longitude>$left_top_lng AND longitude<$right_bottom_lng";
第二种方法
/** * * @param $latitude 纬度 * @param $longitude 经度 * @param $raidus 半径范围(单位:米) * @return multitype:number */ public function getAround($latitude,$longitude,$raidus){ $PI = 3.14159265; $degree = (24901*1609)/360.0; $dpmLat = 1/$degree; $radiusLat = $dpmLat*$raidus; $minLat = $latitude - $radiusLat; $maxLat = $latitude + $radiusLat; $mpdLng = $degree*cos($latitude * ($PI/180)); $dpmLng = 1 / $mpdLng; $radiusLng = $dpmLng*$raidus; $minLng = $longitude - $radiusLng; $maxLng = $longitude + $radiusLng; return array (minLat=>$minLat, maxLat=>$maxLat, minLng=>$minLng, maxLng=>$maxLng); }
构造语句
$condition['latitude'] = array(array('EGT',$array['minLat']),array('ELT',$array['maxLat']),'and');//(`latitude` >= minLat) AND (`latitude` <=maxLat) $condition['longitude'] = array(array('EGT',$array['minLng']),array('ELT',$array['maxLng']),'and');//(`longitude` >= minLng) AND (`longitude` <= maxLng)
计算两个经纬度之间距离
/** * 根据起点坐标和终点坐标测距离 * @param [array] $from [起点坐标(经纬度),例如:array(118.012951,36.810024)] * @param [array] $to [终点坐标(经纬度)] * @param [bool] $km 是否以公里为单位 false:米 true:公里(千米) * @param [int] $decimal 精度 保留小数位数 * @return [string] 距离数值 */ function get_distance($from,$to,$km=true,$decimal=2){ sort($from); sort($to); $EARTH_RADIUS = 6370.996; // 地球半径系数 $distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000; if($km){ $distance = $distance / 1000; } return round($distance, $decimal); }