/**
* 计算某个经纬度的周围某段距离的正方形的四个点
* @param $lng 经度
* @param $lat 纬度
* @param float $distance 该点所在圆的半径,该圆与此正方形内切,默认值为0.5km
* @return array
*/
public static function squarePoint($lat,$lng,$distance=0.5){
define('EARTH_RADIUS', 6371);//地球半径,平均半径为6371km
$dlng = 2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);
$dlat = $distance/EARTH_RADIUS;
$dlat = rad2deg($dlat);
return 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)
);
}
/**
* 计算两点之间的距离
* @param $lng1 经度1
* @param $lat1 纬度1
* @param $lng2 经度2
* @param $lat2 纬度2
* @param int $unit m,km
* @param int $decimal 位数
* @return float
*/
public static function getDistance($lat1, $lng1,$lat2, $lng2,$unit = 2, $decimal = 2)
{
$EARTH_RADIUS = 6370.996; // 地球半径系数
$PI = 3.1415926535898;
$radLat1 = $lat1 * $PI / 180.0;
$radLat2 = $lat2 * $PI / 180.0;
$radLng1 = $lng1 * $PI / 180.0;
$radLng2 = $lng2 * $PI / 180.0;
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
$distance = $distance * $EARTH_RADIUS * 1000;
if ($unit === 2) {
$distance /= 1000;
}
return round($distance, $decimal);
}
public function getAllCarWashApi(){
$carWashApi = new CA();
try {
$carWashApiCommon = new ApiCommon($this->uniacid);
$this->price = $carWashApiCommon->setting['price'];
//筛选条件
$condition = [];
//方圆KM筛选
if(!input('lat') || !input('lng')) return Result::Error(1,'暂未获取到你的位置');
$lat=input('lat');
$lng=input('lng');
$squares = Map::squarePoint($lat,$lng,50);
$condition = [
['uniacid','=',$this->uniacid],
['latitude','>',$squares['right-bottom']['lat']],
['latitude','<',$squares['left-top']['lat']],
['longitude','>',$squares['left-top']['lng']],
['longitude','<',$squares['right-bottom']['lng']],
];
$EARTH=6378.137; //地球半径
$PI=3.1415926535898; //PI值 //将要和数据库经纬度对比的坐标
//根据已知坐标查询 排序 start【重点】
$list = $carWashApi
->where($condition)
->field("*,(2 * $EARTH* ASIN(SQRT(POW(SIN($PI*(".$lat."-latitude)/360),2)+COS($PI*".$lat."/180)* COS(latitude * $PI/180)*POW(SIN($PI*(".$lng."-longitude)/360),2)))) as distance")
->order('juli asc')
->paginate(10)->each(function($item,$key){
//无视
$item['price'] = $this->price;
//公里数
$item['km'] = sprintf('%.2f', $item['distance']);
return $item;
});
//end. latitude longitude 经纬度
return Result::Success($list);
} catch (\Exception $e) {
return Result::Error(1,$e->getMessage());
}
}

我的微信
这是我的微信扫一扫