`
喧嚣求静
  • 浏览: 551531 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

LBS应用中使用自有数据查找多少米内的相关数据

 
阅读更多

最近在开发中,需要用百度定位当前位置信息查找附近范围的数据,在基于百度地图开发中,提供了基于Poi查找兴趣的的API,但目前数据是来自系统后台的自有数据,所以只能自己实现相关逻辑。

实现逻辑
1.基于百度定位当前经纬度
2. 由当前经纬度与目标数据计算出距离

距离计算公式:抽象为球面两点距离的计算,即已知道球面上两点的经纬度 ,其中$R 为地球半径6378137
通过余弦定理以及弧度计算方法,最终推导出来的算式A为:

Source code    
$s = acos(cos($radLat1)*cos($radLat2)*cos($radLng1-$radLng2)+sin($radLat1)*sin($radLat2))*$R;


目前网上大多使用Google公开的距离计算公司,推导算式B为:

 

Source code    
$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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics