应用场景
场景:
最近在做一个城管解锁车辆的系统,车辆违停用户接受处罚后,需要工作人员根据列表中的车辆所在距离判断是是否前往解锁,涉及到了根据用户经纬度去数据库中按照距离最短排序对应列表
解决问题:
根据用户经纬度去数据库中根据经纬度,按照距离最短排序查询对应列表
解决方法
数学方式计算
直接根据经纬度计算直线距离
SELECT
id,
lock_address,
longitude,
latitude,
ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW( SIN(( 31.163973 - latitude ) * PI()/ 360 ), 2 ) + COS( 31.163973 * PI() / 180 ) * COS( latitude * PI() / 180 ) * POW( SIN(( 121.404032 - longitude ) * PI() / 360 ), 2 ))) * 1000
) AS distance
FROM
dp_1_framelock_form_usagerecord
ORDER BY
distance
查询结果:
st_distance函数
简介:
st_distance
函数是从 mysql5.6.1 才加入的空间计算函数
参数:
POINT()
:从坐标构造点
ST_DISTANCE()
:一个几何体与另一个几何体的距离,计算的结果单位是度,需要乘6371000*π/180=111195是将值转化为米。
SELECT
id,
lock_address,
longitude,
latitude,
CAST(
(st_distance ( POINT ( longitude, latitude ), POINT ( 121.404032, 31.163973 )) * 111195 )
AS DECIMAL ( 10, 0 )) AS distance
FROM
dp_1_framelock_form_usagerecord
WHERE
deal_rate = 2
ORDER BY
distance
查询结果: