LBS应用中使用自有数据查寻多少米内的相关数据
LBS应用中使用自有数据查找多少米内的相关数据
最近在开发中,需要用百度定位当前位置信息查找附近范围的数据,在基于百度地图开发中,提供了基于Poi查找兴趣的的API,但目前数据是来自系统后台的自有数据,所以只能自己实现相关逻辑。
实现逻辑:
1.基于百度定位当前经纬度
2. 由当前经纬度与目标数据计算出距离
距离计算公式:抽象为球面两点距离的计算,即已知道球面上两点的经纬度 ,其中$R 为地球半径6378137
通过余弦定理以及弧度计算方法,最终推导出来的算式A为:
$s = acos(cos($radLat1)*cos($radLat2)*cos($radLng1-$radLng2)+sin($radLat1)*sin($radLat2))*$R;
目前网上大多使用Google公开的距离计算公司,推导算式B为:
$s = 2*asin(sqrt(pow(sin(($radLat1-$radLat2)/2),2)+cos($radLat1)*cos($radLat2)*pow(sin(($radLng1-$radLng2)/2),2)))*$R;
在基于mysql数据库中实现的函数
DELIMITER $$ CREATE DEFINER = 'root' @'%' FUNCTION `GETDISTANCE` ( lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE ) RETURNS DOUBLE READS SQL DATA DETERMINISTIC BEGIN DECLARE RAD DOUBLE ; DECLARE EARTH_RADIUS DOUBLE DEFAULT 6378137 ; DECLARE radLat1 DOUBLE ; DECLARE radLat2 DOUBLE ; DECLARE radLng1 DOUBLE ; DECLARE radLng2 DOUBLE ; DECLARE s DOUBLE ; SET RAD = PI() / 180.0 ; SET radLat1 = lat1 * RAD ; SET radLat2 = lat2 * RAD ; SET radLng1 = lng1 * RAD ; SET radLng2 = lng2 * RAD ; SET s = ACOS( COS(radLat1) * COS(radLat2) * COS(radLng1 - radLng2) + SIN(radLat1) * SIN(radLat2) ) * EARTH_RADIUS ; SET s = ROUND(s * 10000) / 10000 ; RETURN s ; END $$ DELIMITER ;
查询示例
SELECT parkid, parkname, park_addr, latitude, longitude, GETDISTANCE ( latitude, longitude, 28.139320, 113.042040 ) AS distance FROM t_park WHERE 1 HAVING distance < 5000 ORDER BY distance ASC LIMIT 0, 10
参考:http://www.wubiao.info/372