其它 · 2011-12-12

mysql经纬度坐标距离计算

本文章主要解决数据库如果存有经纬度,获取一定距离的记录数

首先我们在mysql建立一个可重复使用的计算两个坐标经纬度的Function



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DELIMITER $
DROP FUNCTION IF EXISTS `GetDistance`$
 
CREATE FUNCTION `GetDistance`(lat1 FLOAT,lng1 FLOAT, lat2 FLOAT,lng2 FLOAT)
RETURNS  DOUBLE
BEGIN
    DECLARE  distance  DOUBLE;
    if ((lat1=0 and lng1=0) or (lat2=0 and lng2=0)) then    
        set distance=99999999.00;
    else
    SET distance= 2 * 6378.137* ASIN(SQRT(POW(SIN(PI() * (lat1-lat2) / 360), 2)+COS(PI() * lat1 / 180)* COS(lat2* PI() / 180) * POW(SIN(PI() * (lng1-lng2) / 360), 2)));
    end if;
 
    RETURN distance;
END$
DELIMITER ;


接下来,就是运用这个function计算距离了。
为了提高效率,在计算距离时首先通过经度和纬度过滤,然后再通过距离过滤,因为如果计算所有记录的距离毕竟不是很高效的做法。