GBase 8a 远近店家推荐功能,通过经纬度计算2个点之间距离的SQL

本文介绍在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)