本文介绍在GBase 8a中,通过2个点的经纬度,计算距离的SQL方法。该功能,可以用于距离指定点,周边最近的店家推荐功能。
目录导航
计算方法
自定义函数方式虽然使用简单,但如果数据多,频繁的函数调用,性能会由极大下降,建议用表达式方案,或者用C等编写UDF。
参数
- lng1 点1的经度, -180 ~ 180
 - lat1 点1的维度,-90 ~ 90
 - lng2 点2的经度, -180 ~ 180
 - lat2 点2的维度,-90 ~ 90
 
返回
距离,单位:米
表达式
round(
    (
      6371 * acos(
        cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lng1) - radians(lng2)) 
        + sin(radians(lat1)) * sin(radians(lat2))
      )
    )*1000
  );
自定义函数
函数调用的性能低,不适合大量数据。
drop function if exists f_cal_distince;
delimiter //
CREATE FUNCTION `f_cal_distince`(lng1 double(15,9), lat1 double(15, 9), lng2 double(15,9), lat2 double(15,9)) RETURNS int(11)
BEGIN
  return round(
    (
      6371 * acos(
        cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lng1) - radians(lng2)) 
        + sin(radians(lat1)) * sin(radians(lat2))
      )
    )*1000
  );
END; //
delimiter ;
运行实例
gbase> select f_cal_distince(106.486654 , 29.490295 , 106.581515 , 29.615467);
+-----------------------------------------------------------------+
| f_cal_distince(106.486654 , 29.490295 , 106.581515 , 29.615467) |
+-----------------------------------------------------------------+
|                                                           16671 |
+-----------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)