网络上有经纬度计算工具代码,但考虑到数据量大一个一个遍历计算,导致效率低
1:直接sql查询 参考②
2:使用用Redis的GEO功能,实现位置查询,详情@juejiang坚持 复制:https://blog.csdn.net/juejiangjianchi/article/details/109205198
--------------------------------------------------------------
①
$slat = $banner_content['jd'];
$slng = $banner_content['wd'];
$sql = "select *, acos(
sin(($slng*3.1415)/180) * sin((wd*3.1415)/180) +
cos(($slng*3.1415)/180) * cos((wd*3.1415)/180) * cos(($slat*3.1415)/180 - (jd*3.1415)/180)
)*6370.996 AS juli FROM {$this->model->pre}post where status=1 and cid=29 HAVING juli <= 5";
$list = $this->model->query($sql);
数据库字段 jd 经度 wd 纬度
某点的坐标
$slat 经度
$slng 纬度
-------------------------------------------------------------
②
SELECT
id,
name,
ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
#{lat} * PI() / 180 - latitude * PI() / 180
) / 2
),
2
) + COS(#{lat} * PI() / 180) * COS(latitude * PI() / 180) * POW(
SIN(
(
#{lon} * PI() / 180 - longitude * PI() / 180
) / 2
),
2
)
)
) * 1000
) AS
distance
FROM scenic
-- HAVING distance <= #{juli}
ORDER BY distance
limit 0,5
其中latitude和longitude分别是数据库中对象的一个属性,lat和long则是手机端传来的经纬度,计算出的数值单位是米.
当然还要考虑分页及其他因素,以及可以用函数调用,这里只记录下距离算法.