MySQL:使用自定义函数计算经纬度之间的最短距离

我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。 如果小伙伴们觉得文章有点 feel ,那就点个赞再走哦。
在这里插入图片描述

一、前言

  • 在日常开发当中我们往往会遇到这种用户通过地图上的自定标记点位经纬度,然后我们查询中这个区间中最近的几家美食店的需求。
  • 下面我们就来看看如何通过 MySQL 自定义函数实现这个需求

二、自定义函数SQL

  • 注意:限制性自定义函数SQL,然后再使用函数做处理。如果出现这个报错信息:Out of range value for column ‘res’ row 1,可以通过调整【decimal 精度值】进行处理。 比如:可以把这几个参数调整成 20,8
  • 在这里插入图片描述
-- 距离计算:自定义函数
CREATE DEFINER = `root` @`%` FUNCTION `calc_distance` (
	lat1 DECIMAL ( 10, 6 ),
	lng1 DECIMAL ( 10, 6 ),
	lat2 DECIMAL ( 10, 6 ),
	lng2 DECIMAL ( 10, 6 )) RETURNS DECIMAL ( 10, 6 ) READS SQL DATA DETERMINISTIC BEGIN
	DECLARE
		res DECIMAL ( 10, 6 );
	
	SET res = 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 ) 
		) 
	);
	RETURN res;
	
	END

三、使用自定义函数

	-- 根据前端传入经度和维度获取这个距离区间最新的美食信息
	-- lgtd:表示经度
	-- lttd:表示维度
	SELECT
		f.id,
		f.shop_name,
		f.score,
		f.Likes,
		f.lgtd,
		f.lttd,
		calc_distance ( 28.063251, 119.181129, f.lttd, f.lgtd ) AS distance,
		f.update_time 
	FROM
		food f
	WHERE
		f.lgtd IS NOT NULL 
		AND f.lttd IS NOT NULL 
	ORDER BY
	distance 
	LIMIT 1

四、总结

  • 这是用SQL 处理的一种方式,如果小伙伴们有更加优雅的操作也可以在评论区中指点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值