有两种办法:
第一种:利用现有的公式套进去计算,公式如下:
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】之间。否则会报错。