ThinkPHP实现经纬度范围查询
JamesLiu • 2019 年 05 月 13 日
经纬度范围获取
/**
* Desc: 根据经纬度,半径范围获取附近
* User: JamesLiu
* Date: 2019/5/13
* Time: 15:38
* @param $longitude 经度
* @param $latitude 纬度
* @param $raidus 半径范围(单位:米)
* @return array
*/
public function getAround($longitude, $latitude, $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('minLng' => $minLng, 'maxLng' => $maxLng, 'minLat' => $minLat, 'maxLat' => $maxLat);
}
经纬度距离组装成sql
$array = $this->getAround(115.826646, 28.718022, 2000);
$condition['longitude'] = array(array('EGT', $array['minLng']), array('ELT', $array['maxLng']), 'and');//(`longitude` >= minLng) AND (`longitude` <= maxLng)
$condition['latitude'] = array(array('EGT', $array['minLat']), array('ELT', $array['maxLat']), 'and');//(`latitude` >= minLat) AND (`latitude` <=maxLat)
两点经纬度距离计算
/**
* Desc: 求两个已知经纬度之间的距离,单位为米
* User: JamesLiu
* Date: 2019/5/13
* Time: 16:02
* @param $lng1
* @param $lat1
* @param $lng2
* @param $lat2
* @return float|int
*/
private 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;
}