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