云迈博客

您现在的位置是:首页 > 后端开发 > PHP > 正文

PHP

GeoHash算法

阳帅2021-11-30PHP484
˃前言:最近闲来无事,于是想到一直生活实际应用相关疑惑的一些点,如共享单车的停车点,汽车自定义区域围栏,汽车离开区域报警,查找附近的人等是怎么实现的˃网上的资料查了很多,但是都基本指向了下面的主角

前言:最近闲来无事,于是想到一直生活实际应用相关疑惑的一些点,如共享单车的停车点,汽车自定义区域围栏,汽车离开区域报警,查找附近的人等是怎么实现的
网上的资料查了很多,但是都基本指向了下面的主角Geohash算法

好的我先简单概述一下geohash算法,就是能把经纬度坐标编码为字符串一种算法
想详细了解的geohash的可以看一下下面几篇文章这里不概述
Geohash和其他的几种算法建议反复阅读:https://halfrost.com/go_spatial_search/#toc-2
https://segmentfault.com/a/1190000018440806
https://www.jianshu.com/p/2fd0cf12e5ba

没发现geohash算法前,之前用的mysql计算距离排序,需要每个点的经纬度和当前经纬度进行函数计算,如下

SELECT
    *,
    ROUND(
        6378.138 * 2 * ASIN(
            SQRT(
                POW(
                    SIN(
                        (
                            40.0497810000 * PI() / 180 - lat * PI() / 180
                        ) / 2
                    ),
                    2
                ) + COS(40.0497810000 * PI() / 180) * COS(lat * PI() / 180) * POW(
                    SIN(
                        (
                            116.3424590000 * PI() / 180 - lon * PI() / 180
                        ) / 2
                    ),
                    2
                )
            )
        ) * 1000
    ) AS juli
FROM
    customer
ORDER BY
    juli ASC

而经过geohash算法转换的经纬度我们如何按距离排序呢
这是一些经纬度通过算法转的字符串:之前生成的字符全没找到,这里用Redis存储的值代替

如果我说数字一和数值二距离更近(从上往下),细心的大哥们肯定也发现了规律
三个数值比较起来,明显前两个的数组相似度更高
这种直接通过两个数值相似度来对比查数据的话,如下:

WHERE geohash Like 'code%'

效率不知道甩楼上那种方法几条街(记得建索引哦)
用它!用它!
而且Redis在3.2版本已经集成redis GEO,意思是我们直接拿来用就可以了
用法已经放在doc里面了
http://doc.yunmell.com:4999/web/#/p/c8a2c7c501497da0f21333d97da4f2fc
关于前言的那些实际应用场景和地图相关的下次再开篇博客分享,拜拜

发表评论

评论列表