SELECT ROUND(6378.138*2*ASIN(SQRT(POW(SIN((lat1*PI()/180-lat2*PI()/180)/2),2)+COS(lat1*PI()/180)*COS(lat2*PI()/180)*POW(SIN((lng1*PI()/180-lng2*PI()/180)/2),2))),2) AS distance FROM table_name;
以上SQL语句中,round用于将计算结果保留小数点后两位,6378.138为地球半径,lat1和lng1表示第一组经纬度,lat2和lng2表示第二组经纬度。
大家可以通过将这段SQL语句添加到建表SQL语句中来创建一个计算两个经纬度距离的存储过程。
DELIMITER $$
CREATE PROCEDURE `get_distance`(IN lat1 DOUBLE, IN lng1 DOUBLE, IN lat2 DOUBLE, IN lng2 DOUBLE, OUT distance DOUBLE)
BEGIN
SET distance = ROUND(6378.138*2*ASIN(SQRT(POW(SIN((lat1*PI()/180-lat2*PI()/180)/2),2)+COS(lat1*PI()/180)*COS(lat2*PI()/180)*POW(SIN((lng1*PI()/180-lng2*PI()/180)/2),2))),2);
END$$
DELIMITER ;
大家也可以将计算距离的部分抽象成一个自定义函数,方便在SQL语句中使用。
DELIMITER $$
CREATE FUNCTION `get_distance`(lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS DOUBLE
BEGIN
RETURN ROUND(6378.138*2*ASIN(SQRT(POW(SIN((lat1*PI()/180-lat2*PI()/180)/2),2)+COS(lat1*PI()/180)*COS(lat2*PI()/180)*POW(SIN((lng1*PI()/180-lng2*PI()/180)/2),2))),2);
END$$
DELIMITER ;
在使用存储过程和自定义函数时,大家可以将经纬度作为参数传入,得到计算结果。例如:
SELECT get_distance(39.908722,116.397499,30.658653,104.064952);
这将返回北京和成都之间的距离。