根据经纬度计算两地的距离

时间:2021-07-28 19:52:06

最近开发微信公众平台,需求是根据用户发送的地理位置信息,将其附近的专家或代售点返回。

算法思路:先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。

根据经纬度计算两地的距离

代码如下:

1、计算四个点的经纬度。

function getAround( $lat, $lon, $raidus)

{
$EARTH_RADIUS = 6378137;
$RAD = $M_PI / 180.0;
$latitude = $lat;
$longitude = $lon;
$degree = (24901*1609)/360.0;
$raidusMile = $raidus;
$dpmLat = 1/$degree;
$data=array();
$radiusLat = round($dpmLat*$raidusMile,6);
$minLat = $latitude – $radiusLat;
$maxLat = (float)$latitude + (float)$radiusLat;
$data["maxLat"]=$maxLat;
$data["minLat"]=$minLat;
$mpdLng = $degree*cos($latitude * ($M_PI/180));
$dpmLng = 1 / $mpdLng;
$radiusLng = round($dpmLng*$raidusMile,6);
$minLng = $longitude – $radiusLng;
$maxLng = (float)$longitude+(float)$radiusLng;
$data["maxLng"]=$maxLng;
$data["minLng"]=$minLng;
return $data;
}

2、计算两点之间的距离。

function rad($dis)
{
$dis=$dis;
return round($dis*(M_PI/180),6);
}

function getDistance($lat1,$lng1,$lat2,$lng2)
{
$lat1=round($lat1,6);
$lng1=round($lng1,6);
$lat2=round($lat2,6);
$lng2=round($lng2,6);
$EARTH_RADIUS = 6378137;
$radLat1 = $this->rad($lat1);
$radLat2 = $this->rad($lat2);
$a = $radLat1-$radLat2;
$b = $this->rad($lng1)-$this->rad($lng2);
$s = 2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
$s=round($s*$EARTH_RADIUS,0);
return $s;
}

附:查询某地的经纬度http://developer.baidu.com/map/webservice-geocoding.htm