产品有个需求是查出当前用户附近的餐厅,记录一下:
SELECT
id,
`name`,
lat,
lng,
6378.138 * 2 * ASIN(
SQRT(
POW( SIN( ( 40.00412368774414 * PI() / 180 - lat * PI() / 180 ) / 2 ), 2 ) + COS( 40.00412368774414 * PI() / 180 ) * COS( lat * PI() / 180 ) * POW( SIN( ( 116.40998077392578 * PI() / 180 - lng * PI() / 180 ) / 2 ), 2 )
)
) * 1000 AS distance
FROM
`restaurant`
WHERE
lat IS NOT NULL
AND lng IS NOT NULL
ORDER BY
distance ASC,
id DESC
计算公式

对上面的公式解释如下:
Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度;
a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
6378.137为地球半径,单位为千米;
计算出来的结果单位为千米,若将半径改为米为单位则计算的结果单位为米。
计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下。
参考