有两种办法:

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

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】之间。否则会报错。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐