MYSQL中根据经纬度计算距离并排序

有两种办法:

第一种:利用现有的公式套进去计算,公式如下:

6378.138 * 2 * asin(sqrt(pow(sin((A点的纬度 * pi() / 180 - B点的纬度 * pi() / 180) / 2),2) + cos(A点的纬度 * pi() / 180) * cos(B点的纬度 * pi() / 180) * pow(sin((A点的经度 * pi() / B点的经度 * pi() / 180) / 2),2)) * 1000 (米)

第二种:利用mysql的空间类型公式为:

ST_Distance_Sphere(POINT(A点的经度,A点的纬度), POINT(B点的经度, B点的纬度)) 

实操:

两种方式的sql如下:

select
	a.*
from
	(
	select
		k.address,
		6378.137 * 2 * ASIN(SQRT(POWER(SIN((k.lat * pi() / 180 -31.197021484375 * pi() / 180) / 2),2) +
		COS(k.lat * pi() / 180) * COS(31.197021484375 * pi() / 180) 
		* POWER(SIN((k.lng * pi() / 180 -121.4820556640625 * pi() / 180) / 2),2))) * 1000 as 公式distance,
		ST_Distance_Sphere(POINT('121.4820556640625','31.197021484375'), POINT(k.lng, k.lat)) as distance
	from
		car_owner_store k ) a
order by
	a.distance asc;

运行结果(单位:米):

可以看出两种方法算出的距离差别不大

但是第二种更简洁,但是第二种会校验数据,经度值在【-180,180】之间,纬度值在【-90,90】之间。否则会报错。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值