两地图坐标间距离计算公式
球面距离公式
R*arccos(cos(lat1*pi()/180 )*cos(lat2*pi()/180)*cos(lng1*pi()/180 -lng2*pi()/180)+
sin(lat1*pi()/180 )*sin(lat2*pi()/180))
其中,R=6370996.81;//地球半径,pi()为圆周率π,(lng1,lat1),(lng2,lat2)分别是百度地图的两个经纬度,带入数值计算即可
以下转载自 http://blog.csdn.net/hustpzb/article/details/7688993
查找离某个坐标最近的其余数个坐标
//需要查询的用户的坐标
$lat=20;
$lon=20;//,算出该用户与所有其执行查询他用户的距离,取出最近的10个
$sql=’select * from users_location order by ACOS(SIN((‘.$lat.’ * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS((‘.$lat.’ * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS((‘.$lon.’ * 3.1415) / 180 – (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10′;
经过对比,PI取值3.1416要比3.1415精确点
而在实际的使用中,可以在一个较小的范围里进行搜索,而非在所有用户中进行搜索,只对于经度和纬度大于或小于该用户1度(111公里)范围内的用户进行距离计算,同时对数据表中的经度和纬度两个列增加了索引来优化where语句执行时的速度.
最终的sql语句如下
$sql=’select * from users_location where
latitude > ‘.$lat.’-1 and
latitude < '.$lat.'+1 and
longitude > ‘.$lon.’-1 and
longitude < ‘.$lon.’+1
order by ACOS(SIN((‘.$lat.’ * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS((‘.$lat.’ * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS((‘.$lon.’* 3.1415) / 180 – (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10’;
Comments are currently closed.