需求
数据库中保存有每个球馆的经纬度,在已知用户经纬度时,进行按距离排序展现球馆
mysql
select * from sb_user_geo order by ACOS(SIN((纬度 * 3.1415) / 180 ) *SIN((latitude* 3.1415) / 180 ) +
COS((纬度 * 3.1415) / 180 ) * COS((latitude* 3.1415) / 180 ) *COS((经度 * 3.1415) / 180
- (longitude* 3.1415) / 180 ) ) * 6380 asc limit 30
longitude
经度latitude
纬度
如何分辨经纬度? 小于 90 纬度, 另一个大于的自然是经度,当然,这是在国内时可以这样判断。
php
/**
*求两个已知经纬度之间的距离,单位为千米
*@param lng1,lng2 经度
*@param lat1,lat2 纬度
*@return float 距离,单位千米
**/
private function _distance($lng1,$lat1,$lng2,$lat2)//根据经纬度计算距离
{
//将角度转为弧度
$radLat1=deg2rad($lat1);
$radLat2=deg2rad($lat2);
$radLng1=deg2rad($lng1);
$radLng2=deg2rad($lng2);
$a=$radLat1-$radLat2; //两纬度之差,纬度<90
$b=$radLng1-$radLng2; //两经度之差纬度<180
$s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137;
return $s;
}
php 的算法,保留在这以防特殊需求