从数据库读取某经纬度附近5km的地点, 根据经纬度查询附近景点及排序(示例代码)


网络上有经纬度计算工具代码,但考虑到数据量大一个一个遍历计算,导致效率低
1:直接sql查询 参考②
2:使用用Redis的GEO功能,实现位置查询,详情@

--------------------------------------------------------------

$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则是手机端传来的经纬度,计算出的数值单位是米.

当然还要考虑分页及其他因素,以及可以用函数调用,这里只记录下距离算法.

 
posted @ 2021-06-15 11:14  风骚羊肉串  阅读(382)  评论(0编辑  收藏  举报